全部產品
Search
文件中心

Alibaba Cloud Service Mesh:使用ASM授權策略試運行模式

更新時間:Jun 30, 2024

對授權策略配置失誤可能會引起非預期的訪問被拒絕或允許存取。您可以使用ASM授權策略試運行模式,在不影響正式環境的情況下驗證授權策略的正確性和可靠性,降低生產環境出現問題的風險,確保授權策略的順利部署和運行。

前提條件

背景資訊

ASM授權策略支援為網格中的工作負載提供命名空間和工作負載層級的存取權限控制。由於授權策略屬於流量管控能力,對授權策略的配置失誤可能引起非預期的訪問被拒絕或允許存取,這對網格管理員的工作帶來了很大挑戰。一旦授權策略配置失誤,可能導致正常業務訪問被拒絕或應當被阻止的訪問被允許存取。為此,ASM提供了授權策略試運行模式來解決此類問題。對授權策略啟用試運行選項可以使授權策略在應用後並不實際阻止或允許存取流量,而是僅對策略的執行輸出日誌。網格管理員可以通過該日誌來判斷對應策略的執行結果是否符合預期,並可以參考日誌將策略調整至完全符合預期後,再關閉試運行模式,使授權策略真正生效。

本文樣本將部署sleep和httpbin兩個測試應用,整體流程如下:在sleep應用中通過curl訪問httpbin應用,驗證連通性後,在ASM中配置一個拒絕特定請求的授權策略並開啟試運行模式,然後發起可以匹配授權策略拒絕條件的請求。此時因為已啟用試運行模式,所以該請求不會被拒絕,同時Sidecar會輸出試啟動並執行執行日誌,供網格管理員確認該授權策略的執行情況。確認無誤後,關閉該授權策略的試運行模式,使授權策略生效。

步驟一:部署測試應用sleep和httpbin並測試連通性

  1. 使用以下內容,建立sleep.yaml檔案。

    展開查看sleep.yaml

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: sleep
      namespace: foo
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: sleep
      namespace: foo
      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
    ---
  2. 使用kubectl串連到叢集,執行以下命令,在foo命名空間部署sleep應用。

    關於如何使用kubectl串連到叢集,請參見擷取叢集KubeConfig並通過kubectl工具串連叢集

    kubectl apply -f sleep.yaml -n foo
  3. 使用以下內容,建立httpbin.yaml檔案。

    展開查看httpbin.yaml

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: httpbin
      namespace: foo
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: httpbin
      namespace: foo
      labels:
        app: httpbin
        service: httpbin
    spec:
      ports:
      - name: http
        port: 8000
        targetPort: 80
      selector:
        app: httpbin
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: httpbin
      namespace: foo
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: httpbin
          version: v1
      template:
        metadata:
          labels:
            app: httpbin
            version: v1
        spec:
          serviceAccountName: httpbin
          containers:
          - image: docker.io/kennethreitz/httpbin
            imagePullPolicy: IfNotPresent
            name: httpbin
            ports:
            - containerPort: 80
  4. 執行以下命令,在foo命名空間部署httpbin應用。

    kubectl apply -f httpbin.yaml -n foo
  5. 執行以下命令,測試sleep應用和httpbin應用之間的連通性。

    for i in {1..20}; do kubectl exec "$(kubectl get pod -l app=sleep -n foo -o jsonpath={.items..metadata.name})" -c sleep -n foo -- curl http://httpbin.foo:8000/headers -s -o /dev/null -w "%{http_code}\n"; done

    預期輸出:

    200
    200
    200
    ...

    可以看到從sleep應用所在的Pod中執行curl命令訪問httpbin應用20次,傳回值均為200,表明網路連接正常。

步驟二:建立授權策略並啟用試運行模式

  1. 登入ASM控制台,在左側導覽列,選擇服務網格 > 網格管理

  2. 網格管理頁面,單擊目標執行個體名稱,然後在左側導覽列,選擇網格資訊安全中心 > 授權策略,然後單擊建立

  3. 建立頁面,進行如下配置,然後單擊建立

    建立授權策略

步驟三:觀察授權策略效果

  1. 執行以下命令,再次從sleep應用中訪問httpbin應用。

    for i in {1..20}; do kubectl exec "$(kubectl get pod -l app=sleep -n foo -o jsonpath={.items..metadata.name})" -c sleep -n foo -- curl http://httpbin.foo:8000/headers -s -o /dev/null -w "%{http_code}\n"; done

    預期輸出:

    200
    200
    200
    ...

    可以看到由於授權策略啟用了試運行模式,所以請求仍然可以成功。

  2. 執行以下命令,將httpbin應用的Sidecar的RBAC記錄層級調整為Debug。

    kubectl exec "$(kubectl get pod -l app=httpbin -n foo -o jsonpath={.items..metadata.name})" -c istio-proxy -n foo -- curl -X POST 127.0.0.1:15000/logging?rbac=debug

    預期輸出:

      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
      0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0active loggers:
      ...
      rbac: debug
      ...
    100  1028    0  1028    0     0  1003k      0 --:--:-- --:--:-- --:--:-- 1003k
  3. 執行以下命令,從httpbin應用的Sidecar中篩選授權策略輸出的試作業記錄。

    kubectl logs "$(kubectl -n foo -l app=httpbin get pods -o jsonpath={.items..metadata.name})" -c istio-proxy -n foo | grep "shadow denied"

    可以看到輸出的攔截日誌如下。

    2023-12-20T03:58:47.107915Z     debug   envoy rbac external/envoy/source/extensions/filters/http/rbac/rbac_filter.cc:130        shadow denied, matched policy ns[foo]-policy[test]-rule[0]     thread=32
    2023-12-20T03:58:48.800098Z     debug   envoy rbac external/envoy/source/extensions/filters/http/rbac/rbac_filter.cc:130        shadow denied, matched policy ns[foo]-policy[test]-rule[0]     thread=33
    2023-12-20T03:58:50.420179Z     debug   envoy rbac external/envoy/source/extensions/filters/http/rbac/rbac_filter.cc:130        shadow denied, matched policy ns[foo]-policy[test]-rule[0]     thread=32

步驟四:關閉試運行模式

當您通過日誌判斷授權策略的執行結果符合預期後,可以關閉試運行模式,使授權策略真正生效。

  1. 登入ASM控制台,在左側導覽列,選擇服務網格 > 網格管理

  2. 網格管理頁面,單擊目標執行個體名稱,然後在左側導覽列,選擇網格資訊安全中心 > 授權策略

  3. 授權策略頁面,找到步驟二建立的授權策略,在試運行模式列下關閉開關,然後在確認對話方塊,單擊確認,關閉試運行模式。

  4. 使用以下命令,再次發起請求測試。

    for i in {1..20}; do kubectl exec "$(kubectl get pod -l app=sleep -n foo -o jsonpath={.items..metadata.name})" -c sleep -n foo -- curl http://httpbin.foo:8000/headers -s -o /dev/null -w "%{http_code}\n"; done

    預期輸出:

    403
    403
    403
    ...

    可以看到因為授權策略已經生效,請求被拒絕,返回403代碼。

  5. 測試完畢後,執行以下命令,恢複Sidecar的記錄層級為Warning。

    kubectl exec "$(kubectl get pod -l app=httpbin -n foo -o jsonpath={.items..metadata.name})" -c istio-proxy -n foo -- curl -X POST 127.0.0.1:15000/logging?rbac=warning

    預期輸出:

      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
      0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0active loggers:
      ...
      rbac: warning
      ...
    100  1028    0  1028    0     0  1003k      0 --:--:-- --:--:-- --:--:-- 1003k

相關文檔