在本教學課程中,您將瞭解授權的意義,以及如何透過範例應用程式啟用 Cloud Service Mesh,進而瞭解如何為微服務啟用授權政策。您將建立 AuthorizationPolicy,DENY存取微服務,然後建立 AuthorizationPolicy,ALLOW存取特定微服務。
什麼是授權?
驗證會確認身分,也就是確認服務是否符合其宣稱的身分。授權會驗證權限,確認服務是否獲准執行該動作。
身分是這項概念的基礎。使用 Cloud Service Mesh,AuthorizationPolicies控管網格中工作負載之間的通訊,提升安全性和存取權。
在微服務架構中,由於呼叫作業會跨越網路界線,因此傳統的 IP 防火牆規則通常不足以確保工作負載之間的存取安全。透過 Cloud Service Mesh,您可以設定授權規則,以便:
- 控管網格內工作負載的存取權,包括工作負載對工作負載,或使用者對工作負載
- 視需求廣泛或精細地定義政策。如要深入瞭解如何設定政策和最佳做法,請參閱「使用 Cloud Service Mesh 授權」。
部署 Ingress 閘道
- 將 - kubectl的目前環境設為叢集:- gcloud container clusters get-credentials CLUSTER_NAME \ --project=PROJECT_ID \ --zone=CLUSTER_LOCATION
- 為 Ingress Gateway 建立命名空間: - kubectl create namespace asm-ingress
- 啟用要用於注入的命名空間。步驟取決於 Cloud Service Mesh 類型 (代管或叢集內): - 受管理- 將 - asm-managed修訂版本標籤套用至命名空間:- kubectl label namespace asm-ingress \ istio-injection- istio.io/rev=asm-managed --overwrite- 這個標籤對應於 Cloud Service Mesh 版本的目前代管 Cloud Service Mesh 發布管道。 - 叢集內- 使用下列指令在 - istiod上找出修訂版本標籤:- kubectl get deploy -n istio-system -l app=istiod -o \ jsonpath={.items[*].metadata.labels.'istio\.io\/rev'}'{"\n"}'
- 將修訂版本標籤套用至命名空間。在下列指令中, - REVISION是您在上一步記下的- istiod修訂版本標籤值。- kubectl label namespace asm-ingress \ istio-injection- istio.io/rev=REVISION --overwrite
 
- 在 - anthos-service-mesh-samples存放區中部署範例閘道:- kubectl apply -n asm-ingress \ -f docs/shared/asm-ingress-gateway- 預期輸出內容: - serviceaccount/asm-ingressgateway configured service/asm-ingressgateway configured deployment.apps/asm-ingressgateway configured gateway.networking.istio.io/asm-ingressgateway configured
部署 Online Boutique 範例應用程式
- 如果尚未設定,請將 - kubectl的目前背景資訊設為叢集:- gcloud container clusters get-credentials CLUSTER_NAME \ --project=PROJECT_ID \ --zone=CLUSTER_LOCATION
- 為範例應用程式建立命名空間: - kubectl create namespace onlineboutique
- 標記 - onlineboutique命名空間,自動插入 Envoy Proxy。 按照這些步驟啟用自動 Sidecar 插入功能。
- 部署範例應用程式、前端的 - VirtualService,以及工作負載的服務帳戶。在本教學課程中,您將部署 Online Boutique,這是一個微服務示範應用程式。- kubectl apply \ -n onlineboutique \ -f docs/shared/online-boutique/virtual-service.yaml kubectl apply \ -n onlineboutique \ -f docs/shared/online-boutique/service-accounts
查看服務
- 查看 - onlineboutique命名空間中的 Pod:- kubectl get pods -n onlineboutique- 預期輸出內容: - NAME READY STATUS RESTARTS AGE adservice-85598d856b-m84m6 2/2 Running 0 2m7s cartservice-c77f6b866-m67vd 2/2 Running 0 2m8s checkoutservice-654c47f4b6-hqtqr 2/2 Running 0 2m10s currencyservice-59bc889674-jhk8z 2/2 Running 0 2m8s emailservice-5b9fff7cb8-8nqwz 2/2 Running 0 2m10s frontend-77b88cc7cb-mr4rp 2/2 Running 0 2m9s loadgenerator-6958f5bc8b-55q7w 2/2 Running 0 2m8s paymentservice-68dd9755bb-2jmb7 2/2 Running 0 2m9s productcatalogservice-84f95c95ff-c5kl6 2/2 Running 0 114s recommendationservice-64dc9dfbc8-xfs2t 2/2 Running 0 2m9s redis-cart-5b569cd47-cc2qd 2/2 Running 0 2m7s shippingservice-5488d5b6cb-lfhtt 2/2 Running 0 2m7s- 應用程式的所有 Pod 都應已啟動並執行,且 - READY欄中會顯示- 2/2。這表示 Pod 已成功插入 Envoy 補充容器 Proxy。如果幾分鐘後仍未顯示- 2/2,請參閱疑難排解指南。
- 取得外部 IP,並將其設為變數: - kubectl get services -n asm-ingress export FRONTEND_IP=$(kubectl --namespace asm-ingress \ get service --output jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}' \ )- 畫面會顯示類似以下內容的輸出: - NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE asm-ingressgateway LoadBalancer 10.19.247.233 35.239.7.64 80:31380/TCP,443:31390/TCP,31400:31400/TCP 27m
- 在網路瀏覽器中前往 - EXTERNAL-IP位址。瀏覽器中應會顯示 Online Boutique 商店。 
拒絕工作負載的所有授權
本節會新增 AuthorizationPolicy,拒絕所有傳入貨幣服務的流量。AuthorizationPolicies 會將 AuthorizationPolicies 轉換為 Envoy 可讀取的設定,並將設定套用至 Sidecar Proxy。這樣一來,Envoy Proxy 就能授權或拒絕服務的傳入要求。
- 將 - AuthorizationPolicy套用至- currencyservice。請注意 YAML 檔案中標籤- currencyservice的相符項目。- kubectl apply -f docs/authorization/currency-deny-all.yaml -n onlineboutique
- 嘗試存取閘道的 - EXTERNAL-IP,在網路瀏覽器中查看 Online Boutique。您應該會看到- currency service傳回授權錯誤 (500 Internal Service Error)。 
觀察補充 Proxy 記錄
如要查看 Sidecar Proxy 中發生的情況,可以查看 Pod 中的記錄。
- 取得 - currencyservicepod 的名稱:- CURRENCY_POD=$(kubectl get pod -n onlineboutique |grep currency|awk '{print $1}')
- 設定 Envoy Proxy,允許追蹤層級記錄。根據預設,系統不會記錄遭封鎖的授權呼叫: - kubectl exec -it $CURRENCY_POD -n onlineboutique -c istio-proxy -- curl -X POST "http://localhost:15000/logging?level=trace"- 預期的輸出內容: - active loggers: admin: trace alternate_protocols_cache: trace ... tracing: trace upstream: trace udp: trace wasm: trace
- 使用 - curl將流量傳送至- EXTERNAL_IP,產生記錄:- for i in {0..10}; do curl -s -I $FRONTEND_IP ; done
- 在 istio-proxy 中查看與角色型存取權控管 (RBAC) 相關的記錄: - kubectl logs -n onlineboutique $CURRENCY_POD -c istio-proxy | grep -m5 rbac- 預期輸出內容: - 2022-07-08T14:19:20.442920Z debug envoy rbac checking request: requestedServerName: outbound_.7000_._.currencyservice.onlineboutique.svc.cluster.local, sourceIP: 10.8.8.5:34080, directRemoteIP: 10.8.8.5:34080, remoteIP: 10.8.8.5:34080,localAddress: 10.8.0.6:7000, ssl: uriSanPeerCertificate: spiffe://christineskim-tf-asm./ns/onlineboutique/sa/default, dnsSanPeerCertificate: , subjectPeerCertificate: OU=istio_v1_cloud_workload,O=Google LLC,L=Mountain View,ST=California,C=US, headers: ':method', 'POST' 2022-07-08T14:19:20.442944Z debug envoy rbac enforced denied, matched policy none 2022-07-08T14:19:20.442965Z debug envoy http [C73987][S13078781800499437460] Sending local reply with details rbac_access_denied_matched_policy[none] ```
記錄中應會顯示 enforced denied 訊息,指出 currencyservice 已設為封鎖內送要求。
允許受限制的存取權
您可以為特定工作負載設定允許存取權,而不必使用 DENYALL 政策。在微服務架構中,您會希望確保只有授權服務可以彼此通訊,這時這項功能就非常實用。
在本節中,您會啟用 frontend 和 checkout 服務,讓它們能夠與 currency 服務通訊。
- 在下方檔案中,您會看到特定 source.principal(用戶端) 已加入允許清單,可存取currencyservice:
套用政策:
kubectl apply -f docs/authorization/currency-allow-frontend-checkout.yaml -n onlineboutique
- 在網路瀏覽器中前往 EXTERNAL-IP,現在應該可以存取 Online Boutique。