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

Alibaba Cloud Service Mesh:アプリケーション向けの権限付与ポリシーの設定

最終更新日:Mar 12, 2026

Service Mesh (ASM) のアンビエントモードでは、権限付与が 2 つのレイヤーで実施されます。レイヤー 4 ポリシーは ztunnel によって処理され、トランスポート層におけるワークロード ID を基準としたアクセス制御を実行します。一方、レイヤー 7 ポリシーはウェイポイントプロキシによって処理され、HTTP メソッドやパス制限など、HTTP レベルでの制御機能を追加します。ID を基準としたアクセス制御で十分な場合は、レイヤー 4 ポリシーをご利用ください。細かい HTTP リクエストフィルタリングが必要な場合は、ウェイポイントプロキシとレイヤー 7 ポリシーを追加してください。

本チュートリアルでは、Bookinfo サンプルアプリケーションを用いて両レイヤーの設定手順を説明します:まずレイヤー 4 でアクセスを制限し、その後ウェイポイントプロキシをデプロイしてレイヤー 7 ルールを適用します。

仕組み

ASM アンビエントモードでは、権限付与の実施を以下の 2 つのレイヤーに分離しています:

  • レイヤー 4(ztunnel): DaemonSet として各ノードにデプロイされる Rust 製のノード単位プロキシです。ztunnel はレイヤー 3/レイヤー 4 トラフィック(mTLS、本人確認、レイヤー 4 権限付与、およびノード上のすべての Pod の可観測性を含む)を処理します。このレイヤーのポリシーは、送信元 ID、名前空間、IP アドレスをマッチング対象としますが、HTTP 属性は対象外です。

  • レイヤー 7(ウェイポイントプロキシ): HTTP トラフィックを処理するオプションの Envoy 製プロキシです。HTTP メソッド、パス、またはヘッダーに基づくルールを適用する必要がある場合に、ウェイポイントをデプロイします。

両レイヤーが有効な場合、トラフィックはまず ztunnel を通過した後、ウェイポイントを通過します。このとき、レイヤー 4 ポリシーはウェイポイントの ServiceAccount を明示的に許可する必要があります。そうでない場合、ztunnel がターゲット Pod に到達する前にウェイポイントのトラフィックをブロックします。

サポートされるレイヤー 4 ポリシー属性

ztunnel は以下の属性のみを評価します。このリストに含まれない属性については、レイヤー 7 の適用には必ずウェイポイントプロキシが必要です。

タイプ属性肯定一致否定マッチ
ソースピア IDprincipalsnotPrincipals
送信元名前空間namespacesnotNamespaces
送信元IP ブロックipBlocksnotIpBlocks
操作宛先ポートportsnotPorts

レイヤー 4 とレイヤー 7 のポリシー対象指定の比較

項目レイヤー 4(ztunnel)レイヤー 7(ウェイポイント)
対象指定メカニズムselectormatchLabelstargetRefs(サービスを指す)
実施主体ztunnel(ノード単位の DaemonSet)ウェイポイントプロキシ(Envoy)
サポートされる属性ID、名前空間、IP、ポートすべてのレイヤー 4 属性 + HTTP メソッド、パス、ヘッダー
デプロイ要件なし(アンビエントモードでは常に有効)ウェイポイントプロキシのデプロイが必要
重要

HTTP レベルの属性(例:methodspaths)を含むポリシーを、selector を用いてレイヤー 4 で適用した場合(targetRefs ではなく)、ztunnel はそのポリシーを評価できず、該当するすべてのトラフィックを安全のために拒否します。HTTP レベルのルールを含むポリシーは、必ず targetRefs を使用してください。

前提条件

開始する前に、以下の条件を満たしていることを確認してください。

テストクライアントのデプロイ

クラスター内にテストクライアントとして Sleep アプリケーションをデプロイします。

kubectl apply -f - <<EOF
apiVersion: v1
kind: ServiceAccount
metadata:
  name: sleep
---
apiVersion: v1
kind: Service
metadata:
  name: sleep
  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: registry.cn-hangzhou.aliyuncs.com/acs/curl:8.1.2
        command: ["/bin/sleep", "infinity"]
        imagePullPolicy: IfNotPresent
        volumeMounts:
        - mountPath: /etc/sleep/tls
          name: secret-volume
      volumes:
      - name: secret-volume
        secret:
          secretName: sleep-secret
          optional: true
EOF

レイヤー 4 アクセス制御の適用

レイヤー 4 ポリシーは ztunnel によって適用されます。以下の手順では、productpage へのアクセスを制限し、イングレスゲートウェイの ServiceAccount のみがアクセスできるようにします。

ステップ 1:レイヤー 4 ポリシーの適用

AuthorizationPolicy を作成し、istio-ingressgateway のみが app: productpage ラベルを持つ Pod にアクセスできるようにします。

kubectl apply -f - <<EOF
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
  name: productpage-waypoint
  namespace: default
spec:
  targetRefs:
  - kind: Service
    group: ""
    name: productpage
  action: ALLOW
  rules:
  - from:
    - source:
        principals:
        - cluster.local/ns/default/sa/sleep
    to:
    - operation:
        methods: ["GET"]
EOF

ステップ 2:ブラウザによるアクセスの確認

ブラウザで http://<ingress-gateway-ip>/productpage を開きます。このページは正常にロードされます。これは、リクエストがイングレスゲートウェイを経由して到達するためであり、その ServiceAccount はポリシーで許可されているからです。

ステップ 3:Sleep クライアントがブロックされることの確認

Sleep アプリケーションからリクエストを送信します。

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

期待される出力:

command terminated with exit code 56

接続はトランスポート層で拒否されます。ztunnel はレイヤー 4 で動作するため、HTTP ステータスコードは返されず、接続自体が切断されます。

ウェイポイントプロキシによるレイヤー 7 アクセス制御の追加

レイヤー 7 ポリシーにはウェイポイントプロキシが必要です。ウェイポイントをデプロイした後、名前空間にラベルを付けて、すべてのサービストラフィックをこのウェイポイント経由でルーティングするようにします。これにより、HTTP レベルでの権限付与ルールが有効になります。

ステップ 1:ウェイポイントプロキシのデプロイ

kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: waypoint
spec:
  gatewayClassName: istio-waypoint
  listeners:
  - name: mesh
    port: 15008
    protocol: HBONE
EOF

ステップ 2:ウェイポイントの準備完了を待機

kubectl get gtw

PROGRAMMED 列に True が表示されるまで待機します。

NAME       CLASS            ADDRESS        PROGRAMMED   AGE
waypoint   istio-waypoint   172.16.99.15   True         2m29s

ステップ 3:名前空間トラフィックをウェイポイント経由でルーティング

すべてのサービストラフィックがウェイポイントを経由するよう、default 名前空間にラベルを付与します。

kubectl label namespace default istio.io/use-waypoint=waypoint --overwrite

ステップ 4:レイヤー 7 ポリシーの作成

このポリシーでは、Sleep アプリケーションからのみ productpage へのアクセスを許可し、かつ GET メソッドのみを許可します。

kubectl apply -f - <<EOF
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
  name: productpage-waypoint
  namespace: default
spec:
  targetRefs:
  - kind: Service
    group: ""
    name: productpage
  action: ALLOW
  rules:
  - from:
    - source:
        principals:
        - cluster.local/ns/default/sa/sleep
    to:
    - operation:
        methods: ["GET"]
EOF
説明

レイヤー 7 ポリシーでは、レイヤー 4 ポリシーで使用される selector ラベルではなく、特定のサービスにウェイポイント上でアタッチするための targetRefs を使用します。to フィールドは、許可される HTTP メソッドを制限します。

ステップ 5:ウェイポイントトラフィックを許可するようレイヤー 4 ポリシーを更新

現在、ウェイポイントプロキシがクライアントと productpage Pod の間に配置されています。ztunnel は、元のクライアントではなく、ウェイポイントをトラフィックの送信元と認識します。そのため、レイヤー 4 ポリシーを更新して、ウェイポイントの ServiceAccount を含める必要があります。

kubectl apply -f - <<EOF
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
  name: productpage-ztunnel
  namespace: default
spec:
  selector:
    matchLabels:
      app: productpage
  action: ALLOW
  rules:
  - from:
    - source:
        principals:
        - cluster.local/ns/istio-system/sa/istio-ingressgateway
        - cluster.local/ns/default/sa/waypoint
EOF

ステップ 6:レイヤー 7 ポリシーの確認

ポリシーが期待通りに機能することを確認するため、以下の 3 つのテストを実行します。

テスト 1:Sleep からの DELETE(拒否:メソッドが許可されていない)

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

期待される出力:

RBAC: access denied

Sleep の ServiceAccount は許可されていますが、DELETE メソッドは許可されていません。

テスト 2:reviews-v1 からの GET(拒否:ID が許可されていない)

kubectl exec deploy/reviews-v1 -- curl -s http://productpage:9080/productpage

期待される出力:

RBAC: access denied

reviews-v1 の ServiceAccount はポリシーの principals に記載されていません。

テスト 3:Sleep からの GET(許可)

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

期待される出力:

<title>Simple Bookstore App</title>

すべてのテスト結果がポリシー構成と一致しており、レイヤー 4 およびレイヤー 7 の権限付与ポリシーが正しく機能していることが確認できます。

次のステップ