全部產品
Search
文件中心

Alibaba Cloud Service Mesh:L7認證與鑒權

更新時間:Sep 04, 2024

Ambient模式中,由於4層和7層的分離架構,導致認證和授權的配置模型與原Sidecar模式不同。本文介紹如何使用7層授權策略。

前提條件

已部署ASM網關和應用,且成功驗證準系統。具體操作,請參見入門樣本的前提條件和步驟一。

使用限制

  • 授權策略在Waypoint代理中的使用限制如下:

    • action欄位不支援CUSTOM,即Waypoint代理不支援自訂授權服務。

    • source欄位中不支援ipBlocks

  • 存在Waypoint代理時,Ztunnel代理會允許所有來自Waypoint代理的請求通過。此時,授權策略需要綁定給指定的Waypoint代理。

準備工作

ASM 1.21及以下版本

  1. 執行以下命令,為productpage部署Waypoint。

    istioctl x waypoint apply --service-account bookinfo-productpage
  2. 執行以下命令,查看對應的Waypoint Pod。

    kubectl get pod --show-labels | grep waypoint

    預期輸出:

    bookinfo-productpage-istio-waypoint-6c579dd48d-l****   1/1     Running   0          91s    gateway.istio.io/managed=istio.io-mesh-controller,istio.io/gateway-name=bookinfo-productpage,pod-template-hash=6c579dd48d,service.istio.io/canonical-name=bookinfo-productpage-istio-waypoint,service.istio.io/canonical-revision=latest,sidecar.istio.io/inject=false

ASM 1.22及以上版本

  1. 使用以下內容,部署Gateway。

    apiVersion: gateway.networking.k8s.io/v1
    kind: Gateway
    metadata:
      labels:
        istio.io/waypoint-for: service
      name: waypoint
      namespace: default
    spec:
      gatewayClassName: istio-waypoint
      listeners:
      - name: mesh
        port: 15008
        protocol: HBONE
  2. 執行以下命令,為productpage服務開啟waypoint。

    kubectl label service productpage istio.io/use-waypoint=waypoint

樣本一:存在Waypoint時,Ztunnel上的授權策略失效

存在Waypoint時,Ztunnel將會允許所有來自當前服務Waypoint的流量通過,此時再將授權策略應用到Ztunnel上(授權策略的selector選中了業務Pod)時,該授權策略不會生效。

  1. 使用以下內容,建立productpage-viewer.yaml。

    以下授權策略作用於Ztunnel,禁止訪問productpage的9080連接埠。

    apiVersion: security.istio.io/v1beta1
    kind: AuthorizationPolicy
    metadata:
     name: productpage-viewer
     namespace: default
    spec:
     selector:
       matchLabels:
         app: productpage
     action: DENY
     rules:
     - to:
       - operation:
           ports:
           - "9080"
  2. 在ASM執行個體對應的kubeconfig環境下,執行以下命令,建立授權策略。

    kubectl apply -f productpage-viewer.yaml
  3. 驗證授權策略是否生效。

    1. 執行以下命令,進行訪問測試。

      kubectl exec deploy/sleep -- curl -s http://productpage:9080/| grep -o "<title>.*</title>"

      預期輸出:

      command terminated with exit code 56
    2. 執行以下命令,進行訪問測試。

      kubectl exec deploy/notsleep -- curl -s http://productpage:9080/ | grep -o "<title>.*</title>"

      預期輸出:

      <title>Simple Bookstore App</title>

    本測試和不存在Waypoint的樣本二:禁止訪問productpage的9080連接埠使用了同樣的授權策略,但本測試所有訪問均成功。

    以上結果說明當配置Waypoint後,之前Ztunnel上的所有策略都會失效。

  4. 將授權策略productpage-viewer.yaml修改為如下內容,然後執行kubectl apply -f productpage-viewer.yaml命令進行部署。

    ASM 1.21及以下

    以下YAML修改了selector欄位。

    apiVersion: security.istio.io/v1beta1
    kind: AuthorizationPolicy
    metadata:
     name: productpage-viewer
     namespace: default
    spec:
     selector:
       matchLabels:
         istio.io/gateway-name: bookinfo-productpage
     action: DENY
     rules:
     - to:
       - operation:
           ports:
           - "9080"

    ASM 1.22及以上

    以下YAML修改為直接引用Service。

    apiVersion: security.istio.io/v1beta1
    kind: AuthorizationPolicy
    metadata:
      name: productpage-viewer
      namespace: default
    spec:
      targetRefs:
      - kind: Service
        group: ""
        name: productpage
      action: DENY
      rules:
      - to:
        - operation:
            ports:
            - "9080"

  5. 驗證授權策略是否生效。

    1. 執行以下命令,進行訪問測試。

      kubectl exec deploy/sleep -- curl -s http://productpage:9080/

      預期輸出:

      RBAC: access denied%
    2. 執行以下命令,進行訪問測試。

      kubectl exec deploy/notsleep -- curl -s http://productpage:9080/

      預期輸出:

      RBAC: access denied%

      此處返回的報錯資訊RBAC: access denied%和L4鑒權的樣本二:禁止訪問productpage的9080連接埠不同。這個錯誤實際由productpage的Waypoint返回。Waypoint發現9080連接埠不允許訪問,於是返回一個HTTP RBAC錯誤,實際的狀態代碼應為403。

  6. 執行以下命令,清除授權策略。

    kubectl delete authorizationpolicy productpage-viewer

樣本二:禁止sleep Pod的IP直接存取productpage

目前配置在Waypoint上的授權策略不支援ipBlocks欄位,只支援remoteIpBlocks。請求經過網關只能配置remoteIpBlocks欄位進行匹配。

  1. 使用以下內容,建立productpage-viewer.yaml,禁止sleep Pod訪問productpage。

    ASM 1.21及以下

    apiVersion: security.istio.io/v1beta1
    kind: AuthorizationPolicy
    metadata:
     name: productpage-viewer
     namespace: default
    spec:
     selector:
       matchLabels:
         istio.io/gateway-name: bookinfo-productpage
     action: DENY
     rules:
     - from:
       - source:
           remoteIpBlocks:
           - "${sleep Pod IP}"

    ASM 1.22及以上

    apiVersion: security.istio.io/v1beta1
    kind: AuthorizationPolicy
    metadata:
      name: productpage-viewer
      namespace: default
    spec:
      targetRefs:
      - kind: Service
        group: ""
        name: productpage
      action: DENY
      rules:
      - from:
        - source:
            remoteIpBlocks:
            - "${sleep Pod IP}"
  2. 在ASM執行個體對應的kubeconfig環境下,執行以下命令,建立授權策略。

    kubectl apply -f productpage-viewer.yaml
  3. 驗證授權策略是否生效。

  4. 執行以下命令,進行訪問測試。

    kubectl exec deploy/sleep -- curl -s http://productpage:9080/ -I

    預期輸出:

    HTTP/1.1 403 Forbidden
    content-length: 19
    content-type: text/plain
    date: Fri, 19 Jul 2024 08:17:08 GMT
    server: istio-envoy

    預期輸出表明sleep Pod不可以直接存取productpage,也不可以通過網關訪問。

  5. 執行以下命令,清除授權策略。

    kubectl delete authorizationpolicy productpage-viewer

樣本三:限制不允許使用HEAD方法訪問/productpage路徑

  1. 使用以下內容,建立productpage-viewer.yaml。

    ASM 1.21及以下

    apiVersion: security.istio.io/v1beta1
    kind: AuthorizationPolicy
    metadata:
      name: productpage-viewer
      namespace: default
    spec:
      selector:
        matchLabels:
          istio.io/gateway-name: bookinfo-productpage
      action: DENY
      rules:
      - to:
        - operation:
            methods: ["HEAD"]
            paths: ["/productpage"]

    ASM 1.22及以上

    apiVersion: security.istio.io/v1beta1
    kind: AuthorizationPolicy
    metadata:
      name: productpage-viewer
      namespace: default
    spec:
      targetRefs:
      - kind: Service
        group: ""
        name: productpage
      action: DENY
      rules:
      - to:
        - operation:
            methods:
            - "HEAD"
            paths:
            - "/productpage"
  2. 在ASM執行個體對應的kubeconfig環境下,執行以下命令,建立授權策略。

    kubectl apply -f productpage-viewer.yaml
  3. 驗證授權策略是否生效。

    1. 執行以下命令,使用HEAD方法訪問/productpage路徑進行測試。

      kubectl exec deploy/sleep -- curl -s productpage:9080/productpage -I

      預期輸出:

      HTTP/1.1 403 Forbidden
      content-length: 19
      content-type: text/plain
      date: Thu, 15 Aug 2024 12:20:51 GMT
      server: istio-envoy
    2. 執行以下命令,使用GET方法訪問/productpage路徑進行訪問測試。

      kubectl exec deploy/sleep -- curl -s productpage:9080/productpage | grep -o "<title>.*</title>"

      預期輸出:

      <title>Simple Bookstore App</title>

      訪問/productpage路徑成功

    3. 執行以下命令,使用HEAD方法訪問/路徑進行訪問測試。

      kubectl exec deploy/sleep -- curl -s productpage:9080/ -I

      預期輸出:

      HTTP/1.1 200 OK
      server: istio-envoy
      date: Thu, 15 Aug 2024 12:23:17 GMT
      content-type: text/html; charset=utf-8
      content-length: 1743
      x-envoy-upstream-service-time: 2
  4. 執行以下命令,清除授權策略。

    kubectl delete authorizationpolicy productpage-viewer