Kubernetes では、Kubernetes クラスタ内の NetworkPolicy オブジェクトを使用して、特定の名前空間内のサービスから特定の外部 Web サイトへのアクセストラフィックを拒否または許可できます。ただし、NetworkPolicy オブジェクトを使用する方法は、粗粒度のネットワーク分離のみを実装し、アプリケーションセキュリティまたはビジネスセキュリティを確保することはできません。Service Mesh(ASM)のゼロトラストセキュリティシステムでは、承認ポリシーを動的に構成して、名前空間内のサービスから外部 Web サイトへのアクセストラフィックを制御できます。これはリスクの軽減に役立ちます。このトピックでは、承認ポリシーを使用して、名前空間内のすべてのサービスから外部 Web サイトへのアクセストラフィックを拒否する方法について説明します。この例では、demo-frontend 名前空間と aliyun.com 外部 Web サイトを使用します。
前提条件
クラスタが ASM インスタンスに追加されていること。詳細については、「ASM インスタンスへのクラスタの追加」をご参照ください。
demo-frontend という名前の名前空間が作成され、その名前空間に対して自動サイドカープロキシインジェクションが有効になっていること。詳細については、「グローバル名前空間の管理」をご参照ください。
手順 1:テストサービスを作成する
クラスタの kubeconfig ファイルを取得し、kubectl を使用してクラスタに接続します。詳細については、「クラスタの kubeconfig ファイルを取得し、kubectl を使用してクラスタに接続する」をご参照ください。
demo-frontend 名前空間に sleep という名前のサービスを作成します。
以下の内容を含む sleep.yaml ファイルを作成します。
次のコマンドを実行して、sleep サービスを作成します。
kubectl apply -f sleep.yaml -n demo-frontend
サイドカープロキシが sleep サービスに挿入されていることを確認します。
ACK コンソール にログインします。左側のナビゲーションペインで、[クラスタ] をクリックします。
[クラスタ] ページで、管理するクラスタを見つけ、その名前をクリックします。左側のペインで、
を選択します。[ポッド] ページの上部にある デモフロントエンド[名前空間] ドロップダウンリストから を選択し、sleep サービスのポッド名をクリックします。
[コンテナ] タブに、[istio-proxy] という名前のサイドカープロキシが表示されます。これは、サイドカープロキシが sleep サービスに挿入されていることを示します。
手順 2:出口ゲートウェイを作成する
出口ゲートウェイを使用して、Service Meshインスタンス内のサービスから外部 Web サイトへのアクセストラフィックを制御できます。出口ゲートウェイの承認ポリシーを構成した後、外部 Web サイトへのアクセスを許可するかどうかを制御する条件を指定することもできます。この例では、出口ゲートウェイの名前を egressgateway に設定します。詳細については、「出口ゲートウェイの作成」をご参照ください。
手順 3:外部サービスへのアクセスに関するポリシーを構成する
デフォルトでは、ASM インスタンス内のサービスはすべての外部サービスにアクセスできます。特定の外部 Web サイトへのアクセスを制御するには、ASM コンソールで ASM インスタンスの [アウトバウンドトラフィックポリシー] パラメータを [REGISTRY_ONLY] に設定します。この場合、サービスエントリとして登録されていない外部サービスには、Service Meshインスタンス内のサービスからアクセスできません。
外部サービスへのアクセスに関するポリシーを構成します。
ASM コンソール にログインします。左側のナビゲーションペインで、 を選択します。
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションペインで、 を選択します。
[グローバル] タブで、[アウトバウンドトラフィックポリシー] をクリックし、[アウトバウンドトラフィックポリシー] パラメータを [REGISTRY_ONLY] に設定して、[設定の更新] をクリックします。
aliyun.com 外部 Web サイトをサービスエントリとして登録します。
ASM インスタンスの詳細ページで、左側のナビゲーションペインの を選択します。表示されるページで、[YAML から作成] をクリックします。
[作成] ページで、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 サイトへのトラフィックをルーティングします。
次の 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 認証に合格する必要があります。次の 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 認証に合格する必要があります。次の YAML コードを使用して、demo-frontend 名前空間に仮想サービスを作成します。詳細については、「仮想サービスの管理」をご参照ください。
上記のコードの
http
セクションでは、2 つの照合ルールが構成されています。最初の照合ルールでは、
gateways
パラメータがmesh
に設定されています。これは、最初の照合ルールが demo-frontend 名前空間に挿入されたサイドカープロキシに適用され、最初の照合ルールが demo-frontend 名前空間から出口ゲートウェイへのトラフィックをルーティングするために使用されることを示します。2 番目の照合ルールでは、
gateways
パラメータがistio-system/istio-egressgateway
に設定されています。これは、2 番目の照合ルールが出口ゲートウェイから登録されている外部サービスへのトラフィックをルーティングするために使用されることを示します。
手順 5:承認ポリシーを作成する
demo-frontend 名前空間で、egressgateway 出口ゲートウェイが demo-frontend 名前空間からのアクセストラフィックを拒否できるようにする承認ポリシーを作成します。
ASM コンソール にログインします。左側のナビゲーションペインで、 を選択します。
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションペインで、 を選択します。表示されるページで、[作成] をクリックします。
[作成] ページで、次の表に示すパラメータを設定し、[作成] をクリックします。
パラメータ
説明
名前
承認ポリシーの名前。
ポリシータイプ
承認アクション。この例では、このパラメータは [拒否] に設定されています。
ASM ゲートウェイ
承認ポリシーが有効になるゲートウェイ。この例では、[ゲートウェイスコープ] タブの [ASM ゲートウェイ] パラメータは [egressgateway] に設定されています。
リクエストの照合ルール
この例では、[リクエストソースを追加] セクションで [名前空間] がオンになり、値は demo-frontend に設定されています。
手順 6:承認ポリシーを使用して、demo-frontend 名前空間内のサービスから外部 Web サイトへのアクセストラフィックを拒否できることを確認する
ACK コンソール にログインします。左側のナビゲーションペインで、[クラスタ] をクリックします。
[クラスタ] ページで、管理するクラスタを見つけ、その名前をクリックします。左側のペインで、
を選択します。[ポッド] ページの上部にある デモフロントエンド[名前空間] ドロップダウンリストから アクション を選択します。 sleep サービスのポッド名を見つけ、 列の をクリックします。
次のコマンドを実行して、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 サイトへのアクセストラフィックを拒否できることを示しています。