Cloud Service Mesh 範例:授權


在本教學課程中,您將瞭解授權的意義,以及如何透過範例應用程式啟用 Cloud Service Mesh 的授權功能,進而瞭解如何為微服務啟用授權政策。您將建立 AuthorizationPolicyDENY存取微服務,然後建立 AuthorizationPolicyALLOW存取特定微服務。

什麼是授權?

驗證會確認身分,也就是確認這項服務是否符合其宣稱的身分。授權會驗證權限,確認服務是否獲准執行該動作。 身分是這個概念的基礎。使用 Cloud Service Mesh,AuthorizationPolicies控管網格中工作負載之間的通訊,提升安全性和存取權。

在微服務架構中,呼叫作業會跨越網路界線,因此傳統的 IP 型防火牆規則通常不足以確保工作負載之間的存取安全。透過 Cloud Service Mesh,您可以設定授權規則,以便:

  • 控管網格內工作負載的存取權,包括工作負載對工作負載,或使用者對工作負載
  • 視需求廣泛或精細地定義政策。如要深入瞭解如何設定政策和最佳做法,請參閱「使用 Cloud Service Mesh 授權」。

費用

本教學課程使用下列 Google Cloud的計費元件:

完成本教學課程後,您可以刪除已建立的資源,避免持續產生費用。詳情請參閱「清除」。

事前準備

  • 複製存放區:

    git clone https://github.com/GoogleCloudPlatform/anthos-service-mesh-samples
    cd anthos-service-mesh-samples
    

部署 Ingress 閘道

  1. kubectl 的目前環境設為叢集:

    gcloud container clusters get-credentials CLUSTER_NAME  \
    --project=PROJECT_ID \
    --zone=CLUSTER_LOCATION 
    
  2. 為 Ingress 閘道建立命名空間:

    kubectl create namespace asm-ingress
    
  3. 啟用要用於注入的命名空間。步驟取決於 Cloud Service Mesh 類型 (代管或叢集內):

    受管理

    asm-managed 修訂版本標籤套用至命名空間:

    kubectl label namespace asm-ingress \
      istio-injection- istio.io/rev=asm-managed --overwrite
    

    這個標籤對應於 Cloud Service Mesh 版本的目前代管 Cloud Service Mesh發布管道

    叢集內

    1. 使用下列指令在 istiod 上找出修訂版本標籤:

      kubectl get deploy -n istio-system -l app=istiod -o \
        jsonpath={.items[*].metadata.labels.'istio\.io\/rev'}'{"\n"}'
      
    2. 將修訂版本標籤套用至命名空間。在下列指令中,REVISION 是您在上一步記下的 istiod 修訂版本標籤值。

      kubectl label namespace asm-ingress \
        istio-injection- istio.io/rev=REVISION --overwrite
      
  4. 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 範例應用程式

  1. 如果尚未設定,請將 kubectl 的目前背景資訊設為叢集:

    gcloud container clusters get-credentials CLUSTER_NAME  \
    --project=PROJECT_ID \
    --zone=CLUSTER_LOCATION 
    
  2. 為範例應用程式建立命名空間:

    kubectl create namespace onlineboutique
    
  3. 標記 onlineboutique 命名空間,自動插入 Envoy Proxy。 按照這些步驟啟用自動 Sidecar 插入功能。

  4. 部署範例應用程式、前端的 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
    

查看服務

  1. 查看 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,請參閱疑難排解指南

  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
    
    
  3. 在網路瀏覽器中前往 EXTERNAL-IP 位址。瀏覽器中應會顯示 Online Boutique 商店。

    線上精品店前端

拒絕工作負載的所有授權

本節會新增 AuthorizationPolicy,拒絕所有傳入貨幣服務的流量。AuthorizationPolicies 會將 AuthorizationPolicies 轉換為 Envoy 可讀取的設定,並將設定套用至 Sidecar Proxy。這樣一來,Envoy Proxy 就能授權或拒絕服務的傳入要求。

  1. AuthorizationPolicy套用至 currencyservice。請注意 YAML 檔案中標籤 currencyservice 的相符項目。

    kubectl apply -f docs/authorization/currency-deny-all.yaml -n onlineboutique
    
    apiVersion: security.istio.io/v1beta1
    kind: AuthorizationPolicy
    metadata:
      name: currency-policy
    spec:
      selector:
        matchLabels:
          app: currencyservice
  2. 嘗試存取閘道的 EXTERNAL-IP,在網路瀏覽器中查看 Online Boutique。您應該會看到 currency service 傳回授權錯誤 (500 內部服務錯誤)。

    authz rbac 500 錯誤

觀察補充 Proxy 記錄

如要查看 Sidecar Proxy 中發生的情況,可以查看 Pod 中的記錄。

  1. 取得 currencyservice pod 的名稱:

    CURRENCY_POD=$(kubectl get pod -n onlineboutique |grep currency|awk '{print $1}')
    
  2. 設定 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

  3. 使用 curl 將流量傳送至 EXTERNAL_IP,產生記錄:

    for i in {0..10}; do
    curl -s -I $FRONTEND_IP ; done
    
  4. 在 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 政策。在微服務架構中,您會希望確保只有授權服務可以彼此通訊,這時這項功能就非常實用。

在本節中,您會啟用 frontendcheckout 服務,讓它們能夠與 currency 服務通訊。

  1. 在下方檔案中,您會看到特定 source.principal(用戶端) 已加入允許清單,可存取 currencyservice
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: currency-policy
spec:
  selector:
    matchLabels:
      app: currencyservice
  rules:
  - from:
    - source:
        principals: ["cluster.local/ns/onlineboutique/sa/frontend"]
  - from:
    - source:
        principals: ["cluster.local/ns/onlineboutique/sa/checkoutservice"]

套用政策:

kubectl apply -f docs/authorization/currency-allow-frontend-checkout.yaml -n onlineboutique
  1. 在網路瀏覽器中前往 EXTERNAL-IP,現在應該可以存取 Online Boutique。

清除所用資源

如要避免系統向您的 Google Cloud 帳戶收取本教學課程中所用資源的相關費用,請刪除含有該項資源的專案,或者保留專案但刪除個別資源。

如要避免系統持續向您的 Google Cloud 帳戶收取本教學課程所用資源的費用,請刪除專案或刪除個別資源

刪除專案

在 Cloud Shell 中刪除專案:

gcloud projects delete PROJECT_ID

刪除資源

  • 如要保留叢集並移除 Online Boutique 範例,請按照下列步驟操作:

    1. 刪除應用程式命名空間:

      kubectl delete namespace onlineboutique
      

      預期輸出內容:

      namespace "onlineboutique" deleted
      
    2. 刪除 Ingress Gateway 命名空間:

      kubectl delete namespace asm-ingress
      

      預期輸出內容:

      amespace "asm-ingress" deleted
      
  • 如要避免產生額外費用,請刪除叢集:

    gcloud container clusters delete  CLUSTER_NAME  \
    --project=PROJECT_ID \
    --zone=CLUSTER_LOCATION 
    

後續步驟