Kubernetes叢集中的NetworkPolicy能夠控制某些外部網站允許或禁止被某些命名空間下的服務訪問,但是NetworkPolicy的方式對網路隔離比較粗粒度,對應用安全、業務安全的保護不夠到位。您可以使用ASM零安全體系,動態配置授權策略,實現對命名空間下服務訪問外部網站進行授權控制,從而降低風險。以demo-frontend命名空間和aliyun.com網站為例,本文介紹如何限制demo-frontend命名空間下的全部服務去訪問外部網站aliyun.com。
前提條件
已添加叢集到ASM執行個體。具體操作,請參見添加叢集到ASM執行個體。
已建立demo-frontend命名空間,並為命名空間注入Sidecar代理。具體操作,請參見管理全域命名空間。
步驟一:建立測試服務
在demo-frontend命名空間下建立sleep服務。
使用以下內容,建立sleep.yaml。
執行以下命令,建立sleep服務。
kubectl apply -f sleep.yaml -n demo-frontend
驗證測試服務是否注入Sidecar成功。
登入Container Service管理主控台,在左側導覽列選擇叢集。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇。
在容器組頁面上方,命名空間選擇demo-frontend,單擊sleep服務的容器組名稱。
在容器頁簽下可以看到istio-proxy容器,說明sleep服務注入Sidecar成功。
步驟二:建立出口網關
服務網格內的服務訪問網格外的網站時,可以通過出口網關管控流量。配置出口網關的授權策略後,還可以設定條件來控制是否允許訪問外部網站。本文設定出口網關的名稱為egressgateway。具體操作,請參見建立出口網關。
步驟三:設定外部服務的存取原則
預設對外部服務的存取原則為允許訪問全部外部服務。為了實現對特定的外部網站進行存取控制,您需要設定外部服務存取原則為REGISTRY_ONLY,未註冊為ServiceEntry的外部服務將無法被服務網格中的服務訪問。
設定外部服務的存取原則。
登入ASM控制台,在左側導覽列,選擇。
在網格管理頁面,單擊目標執行個體名稱,然後在左側導覽列,選擇。
在全域頁簽,單擊外部服務存取原則,配置對外部服務的存取原則OutboundTrafficPolicy為REGISTRY_ONLY,然後單擊更新設定。
將外部服務註冊到ServiceEntry中。
在網格詳情頁面左側導覽列,選擇,然後在右側頁面,單擊使用YAML建立。
設定命名空間為istio-system,將以下內容複寫到文字框中,單擊建立。
apiVersion: networking.istio.io/v1beta1 kind: ServiceEntry metadata: name: aliyuncom-ext namespace: istio-system spec: hosts: - www.aliyun.com location: MESH_EXTERNAL ports: - name: http number: 80 protocol: HTTP - name: tls number: 443 protocol: TLS resolution: DNS
步驟四:建立流量策略
建立網關規則、目標規則和虛擬服務,使demo-frontend命名空間下的流量路由到出口網關,再由出口網關路由到外部網站。
使用以下YAML,在istio-system命名空間建立網關規則。具體操作,請參見管理網關規則。
apiVersion: networking.istio.io/v1beta1 kind: Gateway metadata: name: istio-egressgateway namespace: istio-system spec: selector: istio: egressgateway servers: - port: number: 80 name: http protocol: HTTPS tls: mode: ISTIO_MUTUAL hosts: - '*'mode設定為ISTIO_MUTUAL,表示啟用雙向TLS服務認證,即網格內服務訪問外部網站需要TLS服務認證。使用以下YAML,在demo-frontend命名空間建立目標規則。具體操作,請管理目標規則。
apiVersion: networking.istio.io/v1beta1 kind: DestinationRule metadata: name: target-egress-gateway namespace: demo-frontend spec: host: istio-egressgateway.istio-system.svc.cluster.local subsets: - name: target-egress-gateway-mTLS trafficPolicy: loadBalancer: simple: ROUND_ROBIN tls: mode: ISTIO_MUTUALmode設定為ISTIO_MUTUAL,表示啟用雙向TLS服務認證,即外部網站訪問網格內服務需要TLS服務認證。使用以下內容,在demo-frontend命名空間建立虛擬服務。具體操作,請參見管理虛擬服務。
http設定了兩條匹配規則:第一條設定
gateways為mesh,表示作用範圍為demo-frontend命名空間下的Sidecar代理,將demo-frontend命名空間下的流量路由到出口網關。第二條設定
gateways為istio-system/istio-egressgateway,表示將出口網關的流量路由到註冊的外部服務。
步驟五:建立授權策略
在demo-frontend命名空間下建立授權策略,作用在出口網關egressgateway上,拒絕來自demo-frontend命名空間的訪問。
登入ASM控制台,在左側導覽列,選擇。
在網格管理頁面,單擊目標執行個體名稱,然後在左側導覽列,選擇,然後單擊建立。
在建立頁面,配置相關資訊,然後單擊建立。
配置項
說明
名稱
輸入授權策略的名稱。
策略類型
設定為拒絕。
ASM網關
在網關生效頁簽,設定ASM網關為egressgateway。
請求匹配規則
在添加請求來源地區,開啟命名空間(Namespaces)開關,設定值為demo-frontend。
步驟六:驗證限制demo-frontend命名空間中的服務訪問外部網站是否成功
登入Container Service管理主控台,在左側導覽列選擇叢集。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇。
在容器組頁面上方,命名空間選擇demo-frontend,然後在操作列,單擊sleep容器對應的。
執行以下命令,訪問外部網站aliyun.com。
curl -I http://www.aliyun.com預期輸出:
HTTP/1.1 403 Forbidden content-length: 19 content-type: text/plain date: Thu, 12 Oct 2023 07:14:09 GMT server: envoy x-envoy-upstream-service-time: 4返回
403錯誤,說明demo-frontend命名空間下的服務訪問外部網站aliyun.com失敗。限制demo-frontend命名空間中的服務訪問外部網站成功。