すべてのプロダクト
Search
ドキュメントセンター

Alibaba Cloud Service Mesh:ASM 認可ポリシーをトライアルモードで実行する

最終更新日:Jan 14, 2025

認可ポリシーの設定が不適切な場合、予期しないアクセスが拒否または許可される可能性があります。 サービスメッシュ(ASM)認可ポリシーをトライアルモードで使用すると、本番環境に影響を与えることなく、認可ポリシーの正確性と信頼性を検証できます。 これにより、本番環境で問題が発生するリスクが軽減され、認可ポリシーの円滑なデプロイと運用が保証されます。

前提条件

背景情報

ASM では、認可ポリシーを設定して、名前空間内のすべてのワークロードまたは特定のワークロードのみへのアクセス制御を実装できます。 認可ポリシーはアクセストラフィックを制御します。 適切に設定されていない場合、アクセスリクエストが予期せず許可または拒否される可能性があります。 この場合、ASM 管理者は大きな課題に直面します。 たとえば、正常なアクセスリクエストが拒否される一方で、拒否されるべきアクセスリクエストが許可される場合があります。 この問題を解決するために、ASM は認可ポリシーのトライアルモードを提供しています。 トライアルモードでは、認可ポリシーは実行されますが、トラフィックを許可またはブロックしません。 実行ログのみが記録されます。 ASM 管理者は、これらのログに基づいて、認可ポリシーの実行結果が期待どおりかを確認できます。 期待どおりでない場合は、実行結果が期待どおりになるまで認可ポリシーを調整し、トライアルモードを無効にして認可ポリシーを有効にすることができます。

この例では、2 つのテストアプリケーション、sleep と HTTPBin がデプロイされています。 テストプロセス全体は次のとおりです。sleep アプリケーションが存在するポッドで curl コマンドを使用して HTTPBin アプリケーションにアクセスし、接続性を検証します。ASM インスタンスの認可ポリシーを設定して特定のリクエストを拒否し、トライアルモードを有効にします。次に、認可ポリシーの拒否条件を満たすリクエストを開始します。 トライアルモードでは、リクエストは拒否されず、サイドカープロキシは認可ポリシーの実行ログを生成します。 認可ポリシーの実行結果が期待どおりであることを確認したら、トライアルモードを無効にして認可ポリシーを有効にします。

手順 1: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 アプリケーションが存在するポッドで curl コマンドを実行して HTTPBin アプリケーションに 20 回アクセスすると、返されるステータスコードが常に 200 であることを示しています。これは、ネットワーク接続が正常であることを示しています。

手順 2:認可ポリシーを作成し、トライアルモードを有効にする

  1. ASM コンソール にログインします。 左側のナビゲーションペインで、[サービスメッシュ] > [メッシュ管理] を選択します。

  2. [メッシュ管理] ページで、ASM インスタンスの名前をクリックします。 左側のナビゲーションペインで、[メッシュセキュリティセンター] > [authorizationpolicy] を選択します。 表示されるページで、[作成] をクリックします。

  3. [作成] ページで、次のパラメーターを設定し、[作成] をクリックします。

    创建授权策略

手順 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 アプリケーションのサイドカープロキシのロールベースアクセス制御(RBAC)ログレベルをデバッグに調整します。

    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 アプリケーションのサイドカープロキシから認可ポリシーのトライアル実行ログをフィルタリングします。

    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

手順 4:トライアルモードを無効にする

ログに基づいて認可ポリシーの実行結果が期待どおりであると判断したら、トライアルモードを無効にして認可ポリシーを有効にすることができます。

  1. ASM コンソール にログインします。 左側のナビゲーションペインで、[サービスメッシュ] > [メッシュ管理] を選択します。

  2. [メッシュ管理] ページで、ASM インスタンスの名前をクリックします。 左側のナビゲーションペインで、[メッシュセキュリティセンター] > [authorizationpolicy] を選択します。

  3. [authorizationpolicy] ページで、手順 2 で作成した認可ポリシーを見つけ、[コミッショニングモード] 列のスイッチをオフにし、OK[送信] メッセージの をクリックして、トライアルモードを無効にします。

  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. 次のコマンドを実行して、サイドカープロキシのログレベルを警告に戻します。

    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

参照