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

Alibaba Cloud Service Mesh:レイヤー 7 認証と認可

最終更新日:Jan 13, 2025

Ambient Meshモードにおける認証と認可の構成モデルは、レイヤー 4 とレイヤー 7 が分離されているため、元のSidecarモードとは異なります。このトピックでは、レイヤー 7 認証ポリシーの使用方法について説明します。

前提条件

イングレスゲートウェイと関連アプリケーションがデプロイされ、基本機能が検証されていること。詳細については、スタートガイドの「前提条件」と「手順 1」をご参照ください。

制限事項

  • ウェイポイントプロキシの認証ポリシーには、次の制限が適用されます。

    • action フィールドを CUSTOM に設定することはできません。これは、ウェイポイントプロキシがカスタム認証サービスをサポートしていないことを示します。

    • source フィールドでは、ipBlocks はサポートされていません。

  • ウェイポイントプロキシがデプロイされている場合、対応するztunnelはウェイポイントプロキシからのすべての要求を通過させます。この場合、認証ポリシーを有効にするには、認証ポリシーをウェイポイントプロキシにバインドする必要があります。

準備

V1.21 以前の Service Mesh(ASM)インスタンスの場合

  1. 次のコマンドを実行して、productpage サービスのウェイポイントプロキシをデプロイします。

    istioctl x waypoint apply --service-account bookinfo-productpage
  2. 次のコマンドを実行して、ウェイポイントプロキシのポッドを表示します。

    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

V1.22 以降の ASM インスタンスの場合

  1. 次の内容を使用して、ゲートウェイをデプロイします。

    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 サービスのウェイポイントプロキシをデプロイします。

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

例 1:productpage サービスにウェイポイントプロキシがデプロイされている場合、ztunnel の認証ポリシーは有効になりません。

productpage サービスにウェイポイントプロキシがデプロイされている場合、対応する ztunnel は productpage サービスのウェイポイントプロキシからのすべてのトラフィックを通過させます。この場合、認証ポリシーが ztunnel に適用されている(アプリケーションポッドが認証ポリシーの selector によって選択されている)場合、認証ポリシーは有効になりません。

  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. kubeconfig ファイルの情報に基づいて kubectl を使用して ASM インスタンスに接続し、次のコマンドを実行して認証ポリシーを作成します。

    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>

    上記のテストと例 2:productpage サービスのポート 9080 へのアクセスを禁止する(ウェイポイントプロキシがデプロイされていない)のテストでは、同じ認証ポリシーを使用しています。ただし、上記のテストでは、productpage サービスのポート 9080 へのすべてのアクセスが成功しました。

    上記の結果は、ウェイポイントプロキシをデプロイした後、ztunnel のすべての認証ポリシーが無効になることを示しています。

  4. productpage-viewer.yaml ファイルを次の内容に変更し、kubectl apply -f productpage-viewer.yaml コマンドを実行して認証ポリシーをデプロイします。

    V1.21 以前の ASM インスタンスの場合

    次の 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"

    V1.22 以降の ASM インスタンスの場合

    次の YAML ファイルでは、目的のサービスが指定されています。

    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% で、「レイヤー 4 認証と認可」トピックの例 2:productpage サービスのポート 9080 へのアクセスを禁止するとは異なります。このエラーは、実際には productpage サービスのウェイポイントプロキシによって返されます。ウェイポイントプロキシは、ポート 9080 へのアクセスが拒否されていることを検出すると、HTTP 403 ステータスコードで HTTP RBAC エラーを返します。

  6. 次のコマンドを実行して、認証ポリシーを削除します。

    kubectl delete authorizationpolicy productpage-viewer

例 2:sleep ポッドの IP アドレスが productpage サービスに直接アクセスすることを禁止する

現在、ウェイポイントプロキシで構成された認証ポリシーは、ipBlocks フィールドをサポートしておらず、remoteIpBlocks フィールドのみをサポートしています。ゲートウェイを通過するリクエストと一致させるには、remoteIpBlocks フィールドのみを構成できます。

  1. 次の内容で productpage-viewer.yaml ファイルを作成し、sleep ポッドが productpage サービスにアクセスすることを禁止します。

    V1.21 以前の ASM インスタンスの場合

    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}"
    

    V1.22 以降の ASM インスタンスの場合

    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. kubeconfig ファイルの情報に基づいて kubectl を使用して ASM インスタンスに接続し、次のコマンドを実行して認証ポリシーを作成します。

    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 ポッドが productpage サービスに直接アクセスすることも、ゲートウェイ経由でアクセスすることもできないことを示しています。

  5. 次のコマンドを実行して、認証ポリシーを削除します。

    kubectl delete authorizationpolicy productpage-viewer

例 3:HEAD メソッドが /productpage パスにアクセスすることを禁止する

  1. 次の内容を使用して productpage-viewer.yaml ファイルを作成します。

    V1.21 以前の ASM インスタンスの場合

    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"]
    

    V1.22 以降の ASM インスタンスの場合

    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. kubeconfig ファイルの情報に基づいて kubectl を使用して ASM インスタンスに接続し、次のコマンドを実行して認証ポリシーを作成します。

    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