Kubernetes の NetworkPolicy は、L3/L4 ネットワーク分離を提供しますが、アプリケーションレベルのアクセスの制御を強制することはできません。Service Mesh (ASM) はゼロトラストモデルを使用します。これにより、コード変更なしで、名前空間内のサービスから外部ウェブサイトへのアウトバウンドトラフィックを動的に許可または拒否する権限付与ポリシーを作成できます。
このウォークスルーでは、demo-frontend 名前空間内のすべてのサービスから www.aliyun.com への HTTP アウトバウンドトラフィックをブロックします。このパターンは、任意の名前空間と外部ホストに適用できます。
前提条件
開始する前に、以下を確認してください。
ASM インスタンスに追加されたクラスター。詳細については、「ASM インスタンスにクラスターを追加する」をご参照ください。
自動サイドカープロキシ注入が有効になっている
demo-frontendという名前の名前空間。詳細については、「グローバル名前空間の管理」をご参照ください。
ステップ 1: テストサービスのデプロイ
テスト用のアウトバウンドトラフィックを生成するために、demo-frontend 名前空間に sleep サービスをデプロイします。
kubectl を使用してクラスターに接続します。詳細については、「クラスターの kubeconfig ファイルの取得と kubectl を使用したクラスターへの接続」をご参照ください。
次の YAML を sleep.yaml として保存します。
マニフェストを適用します。
kubectl apply -f sleep.yaml -n demo-frontendサイドカープロキシが注入されていることを確認します。
ACK コンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター]をクリックします。
[クラスター] ページで、対象のクラスターの名前をクリックします。 左側のナビゲーションウィンドウで、[ワークロード] > [ポッド] を選択します。
[名前空間] ドロップダウンリストから [demo-frontend] を選択し、sleep サービスの Pod 名をクリックします。
[コンテナ] タブで、[istio-proxy] という名前のコンテナが存在することを確認します。これは、サイドカープロキシが実行中であることを示しています。
ステップ 2: エグレスゲートウェイの作成
エグレスゲートウェイは、メッシュからのアウトバウンドトラフィックを一元化し、権限付与ポリシーが単一のポイントでアクセスの制御を強制できるようにします。egressgateway という名前のエグレスゲートウェイを作成します。詳細な手順については、「エグレスゲートウェイの作成」をご参照ください。
ステップ 3: アウトバウンドトラフィックの制限と外部ホストの登録
デフォルトでは、ASM インスタンス内のサービスは、任意の外部エンドポイントにアクセスできます。サービスエントリとして登録されていないホストへのアクセスをブロックするには、メッシュレベルのアウトバウンドトラフィックポリシーを REGISTRY_ONLY に切り替えます。
アウトバウンドトラフィックポリシーの設定
ASM コンソールにログインします。左側のナビゲーションウィンドウで、[Service Mesh] > [メッシュ管理] を選択します。
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションウィンドウで、[データプレーンコンポーネント管理] > [サイドカープロキシ設定] を選択します。
[グローバル] タブで、[送信トラフィックポリシー] を [REGISTRY_ONLY] に設定し、[設定の更新] をクリックします。
www.aliyun.com をサービスエントリとして登録
ASM インスタンスの詳細ページの左側のナビゲーションウィンドウで、[クラスターとワークロード管理] > [外部サービス (ServiceEntry)] を選択します。
「[YAML から作成]」をクリックします。[名前空間] のドロップダウンリストから [istio-system] を選択し、以下の YAML を貼り付けます:
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: ゲートウェイ経由のアウトバウンドトラフィックのルーティング
demo-frontend 名前空間からエグレスゲートウェイ経由で www.aliyun.com へのトラフィックをルーティングするために、3 つの Istio リソースを作成します。Gateway と DestinationRule は、サイドカープロキシとエグレスゲートウェイ間の相互 TLS (mTLS) を強制します。
Istio ゲートウェイ
istio-system 名前空間に次のゲートウェイを作成します。詳細については、「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 # すべてのアウトバウンドトラフィックに mTLS が必要
hosts:
- '*'mode を ISTIO_MUTUAL に設定すると、サービスは外部ホストに到達する前にメッシュ管理の mTLS 認証に合格する必要があります。
宛先ルール
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 # エグレスゲートウェイへの mTLS仮想サービス
demo-frontend 名前空間に次の仮想サービスを作成します。詳細については、「仮想サービスの管理」をご参照ください。
http セクションでは、2 つのルーティングルールを定義します。
| ルール | ゲートウェイの一致 | 動作 |
|---|---|---|
| サイドカーからゲートウェイ | mesh | demo-frontend 内の Pod からエグレスゲートウェイへのトラフィックを転送します |
| ゲートウェイから外部 | istio-system/istio-egressgateway | エグレスゲートウェイから www.aliyun.com |
ステップ 5: DENY 権限付与ポリシーの作成
demo-frontend 名前空間から発信されるすべてのトラフィックを拒否するようにエグレスゲートウェイに指示する権限付与ポリシーを作成します。
「ASM コンソール」にログインします。左側のナビゲーションウィンドウで、Service Mesh > メッシュ管理 を選択します。
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションウィンドウで、[メッシュセキュリティセンター] > [承認ポリシー] を選択します。[作成] をクリックします。
次のパラメーターを設定します。
パラメーター 値 名前 ポリシーのわかりやすい名前 ポリシータイプ DENY ASM Gateway ([ゲートウェイスコープ] タブで) egressgateway リクエストマッチングルール 「リクエストソースの追加」で、「名前空間」を有効にし、値を demo-frontend[作成] をクリックします。
ステップ 6: ポリシーの検証
demo-frontend 名前空間内のサービスが www.aliyun.com に到達できなくなったことを確認します。
「ACK コンソール」にログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、クラスター名をクリックします。左側のナビゲーションウィンドウで、[ワークロード] > [ポッド] を選択します。
「demo-frontend」を[名前空間]ドロップダウンリストから選択します。sleep Pod を見つけ、[操作] 列の [ターミナル] > [sleep] をクリックします。
次のコマンドを実行します。
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: 4403 Forbidden応答は、権限付与ポリシーがdemo-frontend名前空間からwww.aliyun.comへのアウトバウンドトラフィックをブロックしていることを確認します。server: envoyヘッダーは、Envoy ベースのエグレスゲートウェイがリクエストを傍受したことを示しており、外部ホストではありません。