在本教學課程中,您將瞭解授權的意義,以及如何透過範例應用程式啟用授權,進而瞭解如何對微服務啟用授權政策。您將建立AuthorizationPolicy
,以DENY
存取微服務,然後建立AuthorizationPolicy
,以ALLOW
存取特定微服務。
什麼是授權?
驗證會確認身分,也就是確認服務是否符合其宣稱的身分。授權會驗證權限,確認服務是否獲准執行該動作。
身分是這個概念的基礎。使用 Cloud Service Mesh,AuthorizationPolicies
控管網格中的工作負載間通訊,提升安全性和存取權。
在微服務架構中,由於呼叫作業會跨越網路界線,因此 IP 型防火牆規則通常不足以確保工作負載之間的存取安全。透過 Cloud Service Mesh,您可以設定授權規則,以便:
- 控管網格內工作負載的存取權,包括工作負載對工作負載或使用者對工作負載
- 視需求廣泛或精細地定義政策。
如要深入瞭解如何設定政策和最佳做法,請參閱「使用 Cloud Service Mesh 授權」。
費用
本教學課程使用下列 Google Cloud的計費元件:
完成本教學課程後,您可以刪除已建立的資源,避免持續產生費用。詳情請參閱「清除」。
事前準備
確認專案已啟用計費功能。
在 GKE 叢集上佈建 Cloud Service Mesh。系統支援多種設定方法:
複製存放區:
git clone https://github.com/GoogleCloudPlatform/anthos-service-mesh-samples cd anthos-service-mesh-samples
部署 Ingress 閘道
將
kubectl
的目前環境設為叢集:gcloud container clusters get-credentials CLUSTER_NAME \ --project=PROJECT_ID \ --zone=CLUSTER_LOCATION
為 Ingress 閘道建立命名空間:
kubectl create namespace asm-ingress
啟用要用於注入的命名空間。步驟取決於控制層實作。
代管 (TD)
將預設插入標籤套用至命名空間:
kubectl label namespace asm-ingress \ istio.io/rev- istio-injection=enabled --overwrite
受管理 (Istiod)
建議:執行下列指令,將預設插入標籤套用至命名空間:
kubectl label namespace asm-ingress \ istio.io/rev- istio-injection=enabled --overwrite
如果您是使用受管理 Istiod 控制平面的現有使用者: 建議您使用預設注入,但系統也支援以修訂版本為準的注入。請按照下列指示操作:
執行下列指令,找出可用的發布管道:
kubectl -n istio-system get controlplanerevision
輸出結果會與下列內容相似:
NAME AGE asm-managed-rapid 6d7h
在輸出內容中,「
NAME
」欄下方的值是與 Cloud Service Mesh 版本可用發布管道對應的修訂版本標籤。將修訂版本標籤套用至命名空間:
kubectl label namespace asm-ingress \ istio-injection- istio.io/rev=REVISION_LABEL --overwrite
叢集內
建議:執行下列指令,將預設插入標籤套用至命名空間:
kubectl label namespace asm-ingress \ istio.io/rev- istio-injection=enabled --overwrite
建議您使用預設插入方式,但系統也支援以修訂版本為準的插入方式: 請按照下列操作說明進行:
使用下列指令在
istiod
上找出修訂版本標籤:kubectl get deploy -n istio-system -l app=istiod -o \ jsonpath={.items[*].metadata.labels.'istio\.io\/rev'}'{"\n"}'
將修訂版本標籤套用至命名空間。在下列指令中,
REVISION_LABEL
是您在上一步記下的istiod
修訂版本標籤值。kubectl label namespace asm-ingress \ istio-injection- istio.io/rev=REVISION_LABEL --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
,將其轉換為 Envoy 可讀取的設定,然後將設定套用至補充 Proxy。AuthorizationPolicies
這樣一來,Envoy 代理程式就能授權或拒絕服務的傳入要求。
將
AuthorizationPolicy
套用至currencyservice
。請注意 YAML 檔案中標籤currencyservice
的相符項目。kubectl apply -f docs/authorization/currency-deny-all.yaml -n onlineboutique
嘗試存取閘道的
EXTERNAL-IP
,在網路瀏覽器中查看 Online Boutique。您應該會看到來自currency service
的授權錯誤 (500 內部服務錯誤)。
觀察補充 Proxy 記錄
如要查看 Sidecar Proxy 中發生的情況,可以查看 Pod 中的記錄。
取得
currencyservice
pod 的名稱:CURRENCY_POD=$(kubectl get pod -n onlineboutique |grep currency|awk '{print $1}')
設定 Envoy Proxy,允許追蹤層級記錄。根據預設,系統不會記錄遭封鎖的授權呼叫:
kubectl debug --image istio/base --target istio-proxy -it $CURRENCY_POD -n onlineboutique -- curl -X POST "http://localhost:15000/logging?level=trace"
預期輸出內容:
none {:.devsite-disable-click-to-copy} 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.svc.id.goog/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
,現在應該可以存取線上商店。
清除所用資源
如要避免系統向您的 Google Cloud 帳戶收取本教學課程中所用資源的相關費用,請刪除含有該項資源的專案,或者保留專案但刪除個別資源。
如要避免系統持續向您的 Google Cloud 帳戶收取本教學課程所用資源的費用,請刪除專案或個別資源。
刪除專案
在 Cloud Shell 中刪除專案:
gcloud projects delete PROJECT_ID
刪除資源
如要保留叢集並移除 Online Boutique 範例,請按照下列步驟操作:
刪除應用程式命名空間:
kubectl delete namespace onlineboutique
預期輸出內容:
namespace "onlineboutique" deleted
刪除 Ingress Gateway 命名空間:
kubectl delete namespace asm-ingress
預期輸出內容:
amespace "asm-ingress" deleted
如要避免產生額外費用,請刪除叢集:
gcloud container clusters delete CLUSTER_NAME \ --project=PROJECT_ID \ --zone=CLUSTER_LOCATION
後續步驟
- 如需設定
PeerAuthentication
政策的一般指南,請參閱「設定傳輸層安全防護」。 - 透過「監控 Mesh 安全性」查看 Mesh 安全性資訊主頁。
- 如要深入瞭解授權政策,請參閱「設定授權政策進階功能」。
- 熟悉 Cloud Service Mesh 安全性最佳做法。