Kubernetes集群中的NetworkPolicy能夠控制某些外部網站允許或禁止被某些命名空間下的服務訪問,但是NetworkPolicy的方式對網絡隔離比較粗粒度,對應用安全、業務安全的保護不夠到位。您可以使用ASM零安全體系,動態配置授權策略,實現對命名空間下服務訪問外部網站進行授權控制,從而降低風險。以demo-frontend命名空間和aliyun.com網站為例,本文介紹如何限制demo-frontend命名空間下的全部服務去訪問外部網站aliyun.com。
前提條件
已添加集群到ASM實例。具體操作,請參見添加集群到ASM實例。
已創建demo-frontend命名空間,并為命名空間注入Sidecar代理。具體操作,請參見管理全局命名空間。
步驟一:創建測試服務
在demo-frontend命名空間下創建sleep服務。
使用以下內容,創建sleep.yaml。
apiVersion: v1 kind: ServiceAccount metadata: name: sleep --- apiVersion: v1 kind: Service metadata: name: sleep labels: app: sleep service: sleep spec: ports: - port: 80 name: http selector: app: sleep --- apiVersion: apps/v1 kind: Deployment metadata: name: sleep spec: replicas: 1 selector: matchLabels: app: sleep template: metadata: labels: app: sleep spec: terminationGracePeriodSeconds: 0 serviceAccountName: sleep containers: - name: sleep image: curlimages/curl command: ["/bin/sleep", "3650d"] imagePullPolicy: IfNotPresent volumeMounts: - mountPath: /etc/sleep/tls name: secret-volume volumes: - name: secret-volume secret: secretName: sleep-secret optional: true ---
執行以下命令,創建sleep服務。
kubectl apply -f sleep.yaml -n demo-frontend
驗證測試服務是否注入Sidecar成功。
登錄容器服務管理控制臺,在左側導航欄選擇集群。
在集群列表頁面,單擊目標集群名稱,然后在左側導航欄,選擇
。在容器組頁面上方,命名空間選擇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_MUTUAL
mode
設置為ISTIO_MUTUAL
,表示啟用雙向TLS服務認證,即外部網站訪問網格內服務需要TLS服務認證。使用以下內容,在demo-frontend命名空間創建虛擬服務。具體操作,請參見管理虛擬服務。
apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: example-com-through-egress-gateway namespace: demo-frontend spec: exportTo: - istio-system - demo-frontend gateways: - mesh - istio-system/istio-egressgateway hosts: - www.aliyun.com http: - match: - gateways: - mesh port: 80 route: - destination: host: istio-egressgateway.istio-system.svc.cluster.local port: number: 80 subset: target-egress-gateway-mTLS weight: 100 - match: - gateways: - istio-system/istio-egressgateway port: 80 route: - destination: host: www.aliyun.com port: number: 80 weight: 100
http
設置了兩條匹配規則:第一條設置
gateways
為mesh
,表示作用范圍為demo-frontend命名空間下的Sidecar代理,將demo-frontend命名空間下的流量路由到出口網關。第二條設置
gateways
為istio-system/istio-egressgateway
,表示將出口網關的流量路由到注冊的外部服務。
步驟五:創建授權策略
在demo-frontend命名空間下創建授權策略,作用在出口網關egressgateway上,拒絕來自demo-frontend命名空間的訪問。關于授權策略的更多信息,請參見授權策略(Authorization Policy)。
登錄ASM控制臺,在左側導航欄,選擇 。
在網格管理頁面,單擊目標實例名稱,然后在左側導航欄,選擇 ,然后單擊創建。
在創建頁面,配置相關信息,然后單擊創建。
配置項
說明
名稱
輸入授權策略的名稱。
策略類型
設置為拒絕。
ASM網關
在網關生效頁簽,設置ASM網關為egressgateway。
請求匹配規則
在添加請求來源區域,打開命名空間(Namespaces)開關,設置值為demo-frontend。
步驟六:驗證限制demo-frontend命名空間中的服務訪問外部網站是否成功
登錄容器服務管理控制臺,在左側導航欄選擇集群。
在集群列表頁面,單擊目標集群名稱,然后在左側導航欄,選擇
。在容器組頁面上方,命名空間選擇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命名空間中的服務訪問外部網站成功。