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

:承認ポリシーを使用して、ASM インスタンス内のサービスから外部 Web サイトへのアクセストラフィックを制御する

最終更新日:Jan 14, 2025

Kubernetes では、Kubernetes クラスタ内の NetworkPolicy オブジェクトを使用して、特定の名前空間内のサービスから特定の外部 Web サイトへのアクセストラフィックを拒否または許可できます。ただし、NetworkPolicy オブジェクトを使用する方法は、粗粒度のネットワーク分離のみを実装し、アプリケーションセキュリティまたはビジネスセキュリティを確保することはできません。Service Mesh(ASM)のゼロトラストセキュリティシステムでは、承認ポリシーを動的に構成して、名前空間内のサービスから外部 Web サイトへのアクセストラフィックを制御できます。これはリスクの軽減に役立ちます。このトピックでは、承認ポリシーを使用して、名前空間内のすべてのサービスから外部 Web サイトへのアクセストラフィックを拒否する方法について説明します。この例では、demo-frontend 名前空間と aliyun.com 外部 Web サイトを使用します。

前提条件

  • クラスタが ASM インスタンスに追加されていること。詳細については、「ASM インスタンスへのクラスタの追加」をご参照ください。

  • demo-frontend という名前の名前空間が作成され、その名前空間に対して自動サイドカープロキシインジェクションが有効になっていること。詳細については、「グローバル名前空間の管理」をご参照ください。

手順 1:テストサービスを作成する

  1. クラスタの kubeconfig ファイルを取得し、kubectl を使用してクラスタに接続します。詳細については、「クラスタの kubeconfig ファイルを取得し、kubectl を使用してクラスタに接続する」をご参照ください。

  2. demo-frontend 名前空間に sleep という名前のサービスを作成します。

    1. 以下の内容を含む sleep.yaml ファイルを作成します。

      sleep.yaml ファイルを表示

      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: 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. 次のコマンドを実行して、sleep サービスを作成します。

      kubectl apply -f sleep.yaml -n demo-frontend
  3. サイドカープロキシが sleep サービスに挿入されていることを確認します。

    1. ACK コンソール にログインします。左側のナビゲーションペインで、[クラスタ] をクリックします。

    2. [クラスタ] ページで、管理するクラスタを見つけ、その名前をクリックします。左側のペインで、[ワークロード] > [ポッド] を選択します。

    3. [ポッド] ページの上部にある デモフロントエンド[名前空間] ドロップダウンリストから を選択し、sleep サービスのポッド名をクリックします。

      [コンテナ] タブに、[istio-proxy] という名前のサイドカープロキシが表示されます。これは、サイドカープロキシが sleep サービスに挿入されていることを示します。

手順 2:出口ゲートウェイを作成する

出口ゲートウェイを使用して、Service Meshインスタンス内のサービスから外部 Web サイトへのアクセストラフィックを制御できます。出口ゲートウェイの承認ポリシーを構成した後、外部 Web サイトへのアクセスを許可するかどうかを制御する条件を指定することもできます。この例では、出口ゲートウェイの名前を egressgateway に設定します。詳細については、「出口ゲートウェイの作成」をご参照ください。

手順 3:外部サービスへのアクセスに関するポリシーを構成する

デフォルトでは、ASM インスタンス内のサービスはすべての外部サービスにアクセスできます。特定の外部 Web サイトへのアクセスを制御するには、ASM コンソールで ASM インスタンスの [アウトバウンドトラフィックポリシー] パラメータを [REGISTRY_ONLY] に設定します。この場合、サービスエントリとして登録されていない外部サービスには、Service Meshインスタンス内のサービスからアクセスできません。

  1. 外部サービスへのアクセスに関するポリシーを構成します。

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

    2. [メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションペインで、[データプレーンコンポーネント管理] > [サイドカープロキシ設定] を選択します。

    3. [グローバル] タブで、[アウトバウンドトラフィックポリシー] をクリックし、[アウトバウンドトラフィックポリシー] パラメータを [REGISTRY_ONLY] に設定して、[設定の更新] をクリックします。

  2. aliyun.com 外部 Web サイトをサービスエントリとして登録します。

    1. ASM インスタンスの詳細ページで、左側のナビゲーションペインの [クラスタ & ワークロード管理] > [外部サービス(serviceentry)] を選択します。表示されるページで、[YAML から作成] をクリックします。

    2. [作成] ページで、istio-system[名前空間] ドロップダウンリストから 作成 を選択し、次の内容をコードエディタにコピーします。次に、 をクリックします。

      apiVersion: networking.istio.io/v1beta1
      kind: ServiceEntry
      metadata:
        name: aliyuncom-ext
        namespace: istio-system
      spec:
        hosts:
          - www.aliyun.com  
        location: MESH_EXTERNAL
        ports:
          - name: http
            number: 80
            protocol: HTTP
          - name: tls
            number: 443
            protocol: TLS
        resolution: DNS

手順 4:トラフィックポリシーを作成する

Istio ゲートウェイ、デスティネーションルール、および仮想サービスを作成して、demo-frontend 名前空間から出口ゲートウェイ、さらに特定の外部 Web サイトへのトラフィックをルーティングします。

  1. 次の YAML コードを使用して、istio-system 名前空間に Istio ゲートウェイを作成します。詳細については、「Istio ゲートウェイの管理」をご参照ください。

    apiVersion: networking.istio.io/v1beta1
    kind: Gateway
    metadata:
      name: istio-egressgateway
      namespace: istio-system
    spec:
      selector:
        istio: egressgateway
      servers:
        - port:
            number: 80
            name: http
            protocol: HTTPS
          tls:
            mode: ISTIO_MUTUAL
          hosts:
            - '*'

    上記のコードでは、mode パラメータが ISTIO_MUTUAL に設定されています。これは、相互トランスポート層セキュリティ(mTLS)認証が有効になっていることを意味します。この場合、ASM インスタンス内のサービスは、外部 Web サイトにアクセスする前に TLS 認証に合格する必要があります。

  2. 次の YAML コードを使用して、demo-frontend 名前空間にデスティネーションルールを作成します。詳細については、「デスティネーションルールの管理」をご参照ください。

    apiVersion: networking.istio.io/v1beta1
    kind: DestinationRule
    metadata:
      name: target-egress-gateway
      namespace: demo-frontend
    spec:
      host: istio-egressgateway.istio-system.svc.cluster.local
      subsets:
        - name: target-egress-gateway-mTLS
          trafficPolicy:
            loadBalancer:
              simple: ROUND_ROBIN
            tls:
              mode: ISTIO_MUTUAL

    上記のコードでは、mode パラメータが ISTIO_MUTUAL に設定されています。これは、mTLS 認証が有効になっていることを意味します。この場合、ASM インスタンス内のサービスは、外部 Web サイトにアクセスする前に TLS 認証に合格する必要があります。

  3. 次の YAML コードを使用して、demo-frontend 名前空間に仮想サービスを作成します。詳細については、「仮想サービスの管理」をご参照ください。

    仮想サービスの YAML コードを表示

    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: example-com-through-egress-gateway
      namespace: demo-frontend
    spec:
      exportTo:
        - istio-system
        - demo-frontend
      gateways:
        - mesh
        - istio-system/istio-egressgateway
      hosts:
        - www.aliyun.com
      http:
        - match:
            - gateways:
                - mesh
              port: 80
          route:
            - destination:
                host: istio-egressgateway.istio-system.svc.cluster.local
                port:
                  number: 80
                subset: target-egress-gateway-mTLS
              weight: 100
        - match:
            - gateways:
                - istio-system/istio-egressgateway
              port: 80
          route:
            - destination:
                host: www.aliyun.com
                port:
                  number: 80
              weight: 100

    上記のコードの http セクションでは、2 つの照合ルールが構成されています。

    • 最初の照合ルールでは、gateways パラメータが mesh に設定されています。これは、最初の照合ルールが demo-frontend 名前空間に挿入されたサイドカープロキシに適用され、最初の照合ルールが demo-frontend 名前空間から出口ゲートウェイへのトラフィックをルーティングするために使用されることを示します。

    • 2 番目の照合ルールでは、gateways パラメータが istio-system/istio-egressgateway に設定されています。これは、2 番目の照合ルールが出口ゲートウェイから登録されている外部サービスへのトラフィックをルーティングするために使用されることを示します。

手順 5:承認ポリシーを作成する

demo-frontend 名前空間で、egressgateway 出口ゲートウェイが demo-frontend 名前空間からのアクセストラフィックを拒否できるようにする承認ポリシーを作成します。

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

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

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

    パラメータ

    説明

    名前

    承認ポリシーの名前。

    ポリシータイプ

    承認アクション。この例では、このパラメータは [拒否] に設定されています。

    ASM ゲートウェイ

    承認ポリシーが有効になるゲートウェイ。この例では、[ゲートウェイスコープ] タブの [ASM ゲートウェイ] パラメータは [egressgateway] に設定されています。

    リクエストの照合ルール

    この例では、[リクエストソースを追加] セクションで [名前空間] がオンになり、値は demo-frontend に設定されています。

手順 6:承認ポリシーを使用して、demo-frontend 名前空間内のサービスから外部 Web サイトへのアクセストラフィックを拒否できることを確認する

  1. ACK コンソール にログインします。左側のナビゲーションペインで、[クラスタ] をクリックします。

  2. [クラスタ] ページで、管理するクラスタを見つけ、その名前をクリックします。左側のペインで、[ワークロード] > [ポッド] を選択します。

  3. [ポッド] ページの上部にある デモフロントエンド[名前空間] ドロップダウンリストから ターミナル > スリープアクション を選択します。 sleep サービスのポッド名を見つけ、 列の をクリックします。

  4. 次のコマンドを実行して、aliyun.com 外部 Web サイトにアクセスします。

    curl -I http://www.aliyun.com

    予期される出力:

    HTTP/1.1 403 Forbidden
    content-length: 19
    content-type: text/plain
    date: Thu, 12 Oct 2023 07:14:09 GMT
    server: envoy
    x-envoy-upstream-service-time: 4

    403 エラーが返されます。これは、demo-frontend 名前空間内のサービスが aliyun.com 外部 Web サイトにアクセスできないことを示します。テスト結果は、承認ポリシーを使用して、demo-frontend 名前空間内のサービスから外部 Web サイトへのアクセストラフィックを拒否できることを示しています。