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

Alibaba Cloud Service Mesh:ASM AuthorizationPolicy のトライアルモードの使用

最終更新日:Sep 15, 2026

AuthorizationPolicy の設定ミスにより、正常なトラフィックが誤って拒否されたり、不正なアクセスが許可されたりする可能性があります。トライアルモードでは、Service Mesh (ASM) の AuthorizationPolicy はリクエストを評価し、ルールを適用せずに結果をログに記録します。これにより、本番環境に影響を与えることなく、ポリシーが正しく、信頼できることを確認できます。

前提条件

背景情報

ASM の AuthorizationPolicy は、名前空間およびワークロードレベルでワークロードに対するアクセス制御を提供します。 AuthorizationPolicy はトラフィック管理機能であるため、設定ミスにより、正常なビジネストラフィックが予期せずブロックされたり、ブロックすべきトラフィックが許可されたりする可能性があります。これは、メッシュ管理者にとって大きな課題となります。 この課題に対処するため、ASM は AuthorizationPolicy のトライアルモード (Istio ではドライランモードと呼ばれます) を提供しています。トライアルモードを有効にすると、ポリシーはトラフィックをブロックまたは許可する代わりに、評価結果のみをログに記録します。メッシュ管理者は、これらのログを使用して、ポリシーが期待どおりに動作するかどうかを確認できます。ポリシーを調整して期待どおりに動作することを確認した後、トライアルモードを無効にしてポリシーを適用します。

この例では、sleep と httpbin という 2 つのテストアプリケーションをデプロイします。全体的なワークフローは次のとおりです。sleep アプリケーションから curl を使用して httpbin アプリケーションにアクセスし、接続性を確認します。次に、ASM で特定のリクエストを拒否する AuthorizationPolicy を構成し、トライアルモードを有効にします。その後、ポリシーの拒否条件に一致するリクエストを送信します。トライアルモードが有効になっているため、リクエストは拒否されませんが、サイドカーがトライアルモードの実行をログに記録します。ログからポリシーが意図したとおりに動作することを確認した後、トライアルモードを無効にしてポリシーを適用します。

ステップ 1: テストアプリケーションのデプロイと接続性の確認

  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 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
    ...

    20 件のリクエストすべてに対してステータスコード 200 が返されたことは、sleep Pod が httpbin アプリケーションに接続できることを示しています。

ステップ 2: ポリシーの作成とトライアルモードの有効化

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

  2. メッシュ管理 ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションペインで、セキュリティ管理 > 権限付与ポリシー (Authorization Policy)を選択し、作成 をクリックします。

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

    • [Name]: test

    • [Policy Type]: [Deny]

    • [Enable Trial Mode] チェックボックスを選択します。

    • [ワークロード] タブをクリックし、[名前空間] を [foo] に、スコープを [サービス] に、[ワークロード] を [httpbin] に、一致するラベルを app:httpbin に設定します。

    • [Request Match Rule] セクションで、[HTTP Path] スイッチをオンにし、/headers を入力します。

ステップ 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
    ...

    AuthorizationPolicy がトライアルモードであるため、リクエストは引き続き成功します。

  2. httpbin アプリケーションのサイドカーで、ロールベースのアクセス制御 (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 アプリケーションのサイドカーログから、AuthorizationPolicy のドライラン出力をフィルタリングします。

    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: トライアルモードの無効化

ログから AuthorizationPolicy が期待どおりに動作することを確認した後、トライアルモードを無効にしてポリシーを適用します。

  1. ASM コンソールにログインします。左側のナビゲーションペインで、[Service Mesh] > [Mesh Management]を選択します。

  2. [Mesh Management] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションペインで、[Mesh Security Center] > [AuthorizationPolicy]を選択します。

  3. [AuthorizationPolicy] ページで、ステップ 2 で作成した AuthorizationPolicy を見つけ、[Trial Mode] 列のスイッチをオフにします。次に、表示される [Confirm] ダイアログボックスで [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 で拒否されたことを示しており、これは AuthorizationPolicy が適用されていることを意味します。

  5. テスト完了後、サイドカーのログレベルを 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

関連ドキュメント