Service Mesh (ASM) インスタンス内のワークロードは、デフォルトで相互に通信できます。 クラスタ内のワークロードに対してアクセス制御と権限管理を実行するために、承認ポリシーを作成できます。 この場合、特定の要件を満たすリクエストのみがワークロードにアクセスできます。 たとえば、クライアントの要求パス、要求メソッド、 IP アドレスを指定することで、ワークロードへのアクセスを制御できます。 これにより、セキュリティが向上し、ASM インスタンスのリソースが保護されます。
前提条件
機能紹介
承認ポリシーでは、CUSTOM、DENY、または ALLOW アクションを指定できます。 複数の承認ポリシーを 1 つのワークロードに適用する場合、承認ポリシーには異なる優先順位レベルがあります。 具体的には、システムは CUSTOM、DENY、ALLOW 承認ポリシーに基づいて順番にリクエストを検証します。 ワークロードに複数の承認ポリシーを作成する場合、次のルールが有効になります。
リクエストが、リクエストを拒否する CUSTOM 承認ポリシーの条件に一致する場合、リクエストは拒否されます。
リクエストが、リクエストを拒否する DENY 承認ポリシーの条件に一致する場合、リクエストは拒否されます。
デフォルトでは、ワークロードに ALLOW 承認ポリシーが設定されていない場合、リクエストはワークロードにアクセスできます。
ワークロードに ALLOW 承認ポリシーが設定されており、リクエストが ALLOW 承認ポリシーの条件に一致する場合、リクエストはワークロードにアクセスできます。
リクエストが上記のすべての要件を満たしていない場合、リクエストは拒否されます。
このトピックでは、承認ポリシーをすばやく理解して設定するのに役立つ 4 つの例を示します。
シナリオ 1:ワークロードの特定のパスへのアクセスを制御する
この例では、foo 名前空間のアプリケーションが HTTPBin アプリケーションの /headers パスにアクセスできるように指定する承認ポリシーが作成されます。 HTTPBin アプリケーションは foo 名前空間に存在します。 他のパスへのリクエストは失敗します。 foo 名前空間以外の名前空間のアプリケーションは、HTTPBin アプリケーションにアクセスできません。
手順 1:default 名前空間と foo 名前空間の自動サイドカープロキシインジェクションを有効にする
default 名前空間と foo 名前空間を作成します。 詳細については、「名前空間の作成」をご参照ください。
default 名前空間と foo 名前空間の自動サイドカープロキシインジェクションを有効にします。 詳細については、「自動サイドカープロキシインジェクションの有効化」をご参照ください。
手順 2:テストアプリケーションをデプロイする
default 名前空間と foo 名前空間に sleep アプリケーションをデプロイします。
次の内容を含む sleep.yaml ファイルを作成します。
次のコマンドを実行して、default 名前空間に sleep アプリケーションをデプロイします。
kubectl apply -f sleep.yaml -n default次のコマンドを実行して、foo 名前空間に sleep アプリケーションをデプロイします。
kubectl apply -f sleep.yaml -n foo
foo 名前空間に HTTPBin アプリケーションをデプロイします。
次の内容を含む httpbin.yaml ファイルを作成します。
次のコマンドを実行して、foo 名前空間に HTTPBin アプリケーションをデプロイします。
kubectl apply -f httpbin.yaml -n foo
手順 3:承認ポリシーを作成する
ASM コンソール にログインします。 左側のナビゲーションペインで、 を選択します。
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。 左側のナビゲーションペインで、 を選択します。 表示されるページで、[作成] をクリックします。
[作成] ページで、次の表に示すパラメータを設定し、[作成] をクリックします。
パラメータ
説明
名前
承認ポリシーの名前。
ポリシータイプ
承認アクション。 この例では、値は ALLOW に設定されています。
名前空間
承認ポリシーを作成する名前空間。 この例では、[ワークロードスコープ] タブの 名前空間 パラメータは foo に設定されています。
有効スコープ
承認ポリシーの有効スコープ。 この例では、値は サービス に設定されています。
ワークロード
承認ポリシーが有効になるワークロード。 この例では、値は httpbin に設定されています。
リクエストマッチングルール
承認ポリシーのリクエストマッチングルール。 この例では、[リクエストソースを追加] セクションで 名前空間 の横にあるスイッチがオンになり、値は foo に設定されています。 この設定により、foo 名前空間のすべてのアプリケーションが HTTPBin アプリケーションにアクセスできるようになります。
この例では、[リクエストターゲットを追加] セクションで パス の横にあるスイッチがオンになり、値は /headers に設定されています。 この設定により、foo 名前空間以外のすべての名前空間のアプリケーションは、foo 名前空間の HTTPBin アプリケーションの /headers パスにのみアクセスできます。
手順 4:特定のパスへのアクセスを制御する承認ポリシーが有効になっているかどうかを確認する
default 名前空間の sleep アプリケーションを使用してリクエストを送信し、foo 名前空間の HTTPBin アプリケーションにアクセスします。
ACK コンソール にログインします。 左側のナビゲーションペインで、[クラスタ] をクリックします。
[クラスタ] ページで、管理するクラスタを見つけて、その名前をクリックします。 左側のペインで、 を選択します。
[ポッド] ページの上部にある デフォルト[名前空間] ドロップダウンリストから アクション を選択します。 リストから sleep コンテナを見つけ、 列の をクリックします。
sleep コンテナの [ターミナル] セクションで次のコマンドを実行して、HTTPBin アプリケーションの /headers パスにアクセスします。
curl httpbin.foo.svc.cluster.local:8000/headers403 コードが返されます。これは、リクエストが拒否されたことを示します。
sleep コンテナの [ターミナル] セクションで次のコマンドを実行して、HTTPBin アプリケーションの /ip パスにアクセスします。
curl httpbin.foo.svc.cluster.local:8000/ip403 コードが返されます。これは、リクエストが拒否されたことを示します。
foo 名前空間の sleep アプリケーションを使用してリクエストを送信し、foo 名前空間の HTTPBin アプリケーションにアクセスします。
詳細ページの左側のナビゲーションペインで、 を選択します。
[ポッド] ページの上部にある foo[名前空間] ドロップダウンリストから アクション を選択します。 リストから sleep コンテナを見つけ、 列の をクリックします。
sleep コンテナの [ターミナル] セクションで次のコマンドを実行して、HTTPBin アプリケーションの /headers パスにアクセスします。
curl httpbin.foo.svc.cluster.local:8000/headers予期される出力:
{ "headers": { "Accept": "*/*", "Host": "httpbin.foo.svc.cluster.local:8000", "User-Agent": "curl/7.82.0-DEV", "X-Envoy-Attempt-Count": "1", "X-Forwarded-Client-Cert": "By=spiffe://cluster.local/ns/foo/sa/httpbin;Hash=f7ab4985563b5b1986314d5a36c6e46819213e2f38301f534f00afb7cd4b9164;Subject=\"\";URI=spiffe://cluster.local/ns/foo/sa/sleep" } }sleep コンテナの [ターミナル] セクションで次のコマンドを実行して、HTTPBin アプリケーションの /ip パスにアクセスします。
curl httpbin.foo.svc.cluster.local:8000/ip403 コードが返されます。これは、リクエストが拒否されたことを示します。
出力結果から、default 名前空間のアプリケーションは、foo 名前空間の HTTPBin アプリケーションのパスにアクセスできないことがわかります。 foo 名前空間のアプリケーションは、HTTPBin アプリケーションの /headers パスにアクセスできます。
シナリオ 2:ワークロードの特定のパスへのリクエストメソッドとアクセスを制御する
この例では、foo 名前空間以外の名前空間のアプリケーションが、GET リクエストを使用して HTTPBin アプリケーションの /status パスにのみアクセスできるように指定する承認ポリシーが作成されます。 HTTPBin アプリケーションは foo 名前空間に存在します。 HTTPBin アプリケーションの他のパスへのリクエスト、および GET 以外のリクエストメソッドを使用するリクエストは失敗します。
手順 1:default 名前空間と foo 名前空間の自動サイドカープロキシインジェクションを有効にする
default 名前空間と foo 名前空間を作成します。 詳細については、「名前空間の作成」をご参照ください。
default 名前空間と foo 名前空間の自動サイドカープロキシインジェクションを有効にします。 詳細については、「自動サイドカープロキシインジェクションの有効化」をご参照ください。
手順 2:テストアプリケーションをデプロイする
default 名前空間と foo 名前空間に sleep アプリケーションをデプロイします。
次の内容を含む sleep.yaml ファイルを作成します。
次のコマンドを実行して、default 名前空間に sleep アプリケーションをデプロイします。
kubectl apply -f sleep.yaml -n default次のコマンドを実行して、foo 名前空間に sleep アプリケーションをデプロイします。
kubectl apply -f sleep.yaml -n foo
foo 名前空間に HTTPBin アプリケーションをデプロイします。
次の内容を含む httpbin.yaml ファイルを作成します。
次のコマンドを実行して、foo 名前空間に HTTPBin アプリケーションをデプロイします。
kubectl apply -f httpbin.yaml -n foo
手順 3:承認ポリシーを作成する
ASM コンソール にログインします。 左側のナビゲーションペインで、 を選択します。
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。 左側のナビゲーションペインで、 を選択します。 表示されるページで、[作成] をクリックします。
[作成] ページで、次の表に示すパラメータを設定し、[作成] をクリックします。
メソッド の横にあるスイッチをオンにし、値を GET に設定します。
パス の横にあるスイッチをオンにし、値を /status/* に設定します。 この設定により、foo 名前空間以外のすべての名前空間のアプリケーションは、GET リクエストを使用して HTTPBin アプリケーションの /status パスにのみアクセスできます。 HTTPBin アプリケーションは foo 名前空間に存在します。
パラメータ | 説明 |
名前 | 承認ポリシーの名前。 |
ポリシータイプ | 承認アクション。 この例では、値は ALLOW に設定されています。 |
名前空間 | 承認ポリシーを作成する名前空間。 この例では、[ワークロードスコープ] タブの 名前空間 パラメータは foo に設定されています。 |
有効スコープ | 承認ポリシーの有効スコープ。 この例では、値は サービス に設定されています。 |
ワークロード | 承認ポリシーが有効になるワークロード。 この例では、値は httpbin に設定されています。 |
リクエストマッチングルール | 承認ポリシーのリクエストマッチングルール。 この例では、[リクエストターゲットを追加] セクションで次の操作を実行します。 |
手順 4:ワークロードの特定のパスへのリクエストメソッドとアクセスを制御する承認ポリシーが有効になっているかどうかを確認する
ACK コンソール にログインします。 左側のナビゲーションペインで、[クラスタ] をクリックします。
[クラスタ] ページで、管理するクラスタを見つけて、その名前をクリックします。 左側のペインで、 を選択します。
[ポッド] ページの上部にある 既定[名前空間] ドロップダウンリストから を選択します。 リストから sleep コンテナを見つけ、[アクション] 列の をクリックします。
sleep コンテナの [ターミナル] セクションで次のコマンドを実行して、POST リクエストを使用して HTTPBin アプリケーションの /status パスにアクセスします。
curl -I -X POST "httpbin.foo.svc.cluster.local:8000/status/200" -H "accept: text/plain"403 コードが返されます。これは、リクエストが拒否されたことを示します。
次のコマンドを実行して、GET リクエストを使用して HTTPBin アプリケーションの /IP パスにアクセスします。
curl -I -X GET "httpbin.foo.svc.cluster.local:8000/IP/200" -H "accept: text/plain"403 コードが返されます。これは、リクエストが拒否されたことを示します。
次のコマンドを実行して、GET リクエストを使用して HTTPBin アプリケーションの /status パスにアクセスします。
curl -I -X GET "httpbin.foo.svc.cluster.local:8000/status/200" -H "accept: text/plain"予期される出力:
HTTP/1.1 200 OK server: envoy date: Fri, 29 Apr 2022 03:01:16 GMT content-type: text/html; charset=utf-8 access-control-allow-origin: * access-control-allow-credentials: true content-length: 0 x-envoy-upstream-service-time: 5この結果から、default 名前空間のアプリケーションは、GET リクエストを使用した場合にのみ HTTPBin アプリケーションの /status パスにアクセスできることがわかります。 これは、承認ポリシーが有効になっていることを意味します。
例 3:クライアント IP アドレスによってワークロードへのアクセスを制御する
承認済みのクライアント IP アドレスからのリクエストのみが foo 名前空間の HTTPBin アプリケーションにアクセスできるようにする承認ポリシーを作成できます。
手順 1:foo 名前空間の自動サイドカープロキシインジェクションを有効にする
foo 名前空間を作成します。 詳細については、「グローバル名前空間の管理」をご参照ください。
foo 名前空間の自動サイドカープロキシインジェクションを有効にします。 詳細については、「自動サイドカープロキシインジェクションの有効化」をご参照ください。
手順 2:イングレスゲートウェイをデプロイする
ASM コンソール にログインします。 左側のナビゲーションペインで、 を選択します。
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。 左側のナビゲーションペインで、 を選択します。
[イングレスゲートウェイ] ページで、[作成] をクリックし、必要に応じてパラメータを設定して、[作成] をクリックします。
パラメータ
説明
名前
イングレスゲートウェイの名前。
クラスタ
イングレスゲートウェイをデプロイするクラスタ。
LoadBalancer
使用するロードバランサインスタンスのタイプ。 有効な値:Network Load Balancer (NLB) および Classic Load Balancer (CLB)。 この例では、CLB と インターネットアクセス を選択します。
Loadbalancer インスタンスの作成
使用するロードバランサインスタンス。 次のいずれかの方法でロードバランサインスタンスを選択できます。
既存の Loadbalancer インスタンスを使用:ドロップダウンリストから既存のロードバランサインスタンスを選択します。
Loadbalancer インスタンスの作成:[loadbalancer インスタンスの作成] をクリックし、ドロップダウンリストから必要なインスタンス仕様を選択します。
ポートマッピング
サービスが公開されるポート。 プロトコル と サービスポート を設定します。
外部トラフィックポリシー
外部トラフィックを分散するためのポリシー。 この例では、[詳細オプション] をクリックし、外部トラフィックポリシー を ローカル に設定します。
手順 3:仮想サービスと Istio ゲートウェイを作成する
次の内容を使用して、foo 名前空間に仮想サービスを作成します。 詳細については、「仮想サービスの管理」をご参照ください。
apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: httpbin spec: gateways: - httpbin-gateway hosts: - '*' http: - match: - uri: prefix: /headers route: - destination: host: httpbin port: number: 8000次の内容を使用して、foo 名前空間に Istio ゲートウェイを作成します。 詳細については、「Istio ゲートウェイの管理」をご参照ください。
apiVersion: networking.istio.io/v1beta1 kind: Gateway metadata: name: httpbin-gateway spec: selector: istio: ingressgateway servers: - hosts: - '*' port: name: http number: 80 protocol: HTTP
手順 4:承認ポリシーを作成する
イングレスゲートウェイの IP アドレスを取得します。 詳細については、「イングレスゲートウェイの作成」をご参照ください。
クライアントの IP アドレスを取得します。
ブラウザのアドレスバーに http://{イングレスゲートウェイの IP アドレス}/headers と入力します。 表示されるページで、X-Envoy-External-Address パラメータの値を取得します。

承認ポリシーを作成します。
ASM コンソール にログインします。 左側のナビゲーションペインで、 を選択します。
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。 左側のナビゲーションペインで、 を選択します。 表示されるページで、[作成] をクリックします。
[作成] ページで、次の表に示すパラメータを設定し、[作成] をクリックします。
パラメータ
説明
名前
承認ポリシーの名前。
ポリシータイプ
承認アクション。 この例では、値は DENY に設定されています。
名前空間
承認ポリシーを作成する名前空間。 この例では、[ワークロードスコープ] タブの 名前空間 パラメータは foo に設定されています。
有効スコープ
承認ポリシーの有効スコープ。 この例では、値は サービス に設定されています。
ワークロード
承認ポリシーが有効になるワークロード。 この例では、値は httpbin に設定されています。
リクエストマッチングルール
承認ポリシーのリクエストマッチングルール。 この例では、[リクエストソースを追加] セクションで RemoteIPBlocks の横にあるスイッチがオンになり、値は 手順 2 で取得したクライアントの IP アドレスに設定されています。 この設定により、指定されたクライアント IP アドレスから送信されたリクエストが HTTPBin アプリケーションにアクセスすることが拒否されます。
手順 5:指定されたクライアント IP アドレスから送信されたリクエストを拒否する承認ポリシーが有効になっているかどうかを確認する
ブラウザのアドレスバーに http://{イングレスゲートウェイの IP アドレス}/headers と入力します。 RBAC:access denied メッセージが返された場合、HTTPBin アプリケーションへのアクセスリクエストは失敗します。 これは、承認ポリシーが有効になっていることを示します。
例 4:名前空間をまたがるサービスアクセスを制御する
手順 1:demo-frontend 名前空間と demo-server 名前空間の自動サイドカープロキシインジェクションを有効にする
demo-frontend 名前空間と demo-server 名前空間を作成します。 詳細については、「名前空間の作成」をご参照ください。
demo-frontend 名前空間と demo-server 名前空間の自動サイドカープロキシインジェクションを有効にします。 詳細については、「グローバル名前空間の管理」トピックの「自動サイドカープロキシインジェクションの有効化」セクションをご参照ください。
手順 2:テストサービスをデプロイする
demo-frontend 名前空間に sleep という名前のサービスを作成し、demo-server 名前空間に httpbin という名前のサービスを作成します。 sleep サービスは、httpbin サービスにアクセスするためのリクエストを送信するために使用されます。
demo-frontend 名前空間に sleep という名前のサービスを作成します。
次の内容を含む sleep.yaml ファイルを作成します。
kubeconfig ファイルの情報に基づいて kubectl を使用して Container Service for Kubernetes (ACK) クラスタに接続し、次のコマンドを実行して sleep サービスを作成します。
kubectl apply -f sleep.yaml -n demo-frontend
demo-server 名前空間に httpbin という名前のサービスを作成します。
次の内容を含む httpbin.yaml ファイルを作成します。
kubeconfig ファイルの情報に基づいて kubectl を使用して ACK クラスタに接続し、次のコマンドを実行して httpbin サービスを作成します。
kubectl apply -f httpbin.yaml -n demo-server
sleep サービスと httpbin サービスが存在するポッドにサイドカープロキシが挿入されていることを確認します。
ACK コンソール にログインします。 左側のナビゲーションペインで、[クラスタ] をクリックします。
[クラスタ] ページで、管理するクラスタを見つけて、その名前をクリックします。 左側のペインで、 を選択します。
[ポッド] ページの上部にある [名前空間] ドロップダウンリストから demo-frontend を選択し、sleep サービスのポッド名をクリックします。
[コンテナ] タブに、istio-proxy という名前のサイドカープロキシが表示されます。 これは、sleep サービスが存在するポッドにサイドカープロキシが挿入されていることを示します。
[ポッド] ページの上部にある [名前空間] ドロップダウンリストから demo-server を選択し、httpbin サービスのポッド名をクリックします。
[コンテナ] タブに、istio-proxy という名前のサイドカープロキシが表示されます。 これは、httpbin サービスが存在するポッドにサイドカープロキシが挿入されていることを示します。
手順 3:名前空間をまたがるサービスアクセスを制御する承認ポリシーを作成する
承認ポリシーを作成し、承認ポリシーのアクションパラメータを変更して、demo-frontend 名前空間のサービスから demo-server 名前空間のサービスへのアクセスリクエストを拒否または許可できます。 これにより、名前空間をまたがるサービスアクセスを制御できます。
demo-frontend 名前空間から demo-server 名前空間へのアクセスリクエストを拒否する承認ポリシーを作成します。
ASM コンソール にログインします。 左側のナビゲーションペインで、 を選択します。
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。 左側のナビゲーションペインで、 を選択します。 表示されるページで、[作成] をクリックします。
[作成] ページで、次の表に示すパラメータを設定し、[作成] をクリックします。
パラメータ
説明
名前
承認ポリシーの名前。
ポリシータイプ
承認アクション。 この例では、値は DENY に設定されています。
名前空間
承認ポリシーを作成する名前空間。 この例では、[ワークロードスコープ] タブの 名前空間 パラメータは demo-server に設定されています。
有効スコープ
承認ポリシーの有効スコープ。 この例では、値は 名前空間スコープ に設定されています。
リクエストマッチングルール
この例では、[リクエストソースを追加] セクションで 名前空間 がオンになり、値は demo-frontend に設定されています。
httpbin サービスにアクセスします。
ACK コンソール にログインします。 左側のナビゲーションペインで、[クラスタ] をクリックします。
[クラスタ] ページで、管理するクラスタを見つけて、その名前をクリックします。 左側のペインで、 を選択します。
[ポッド] ページの上部にある デモフロントエンド[名前空間] ドロップダウンリストから アクション を選択します。 sleep サービスのポッド名を見つけ、 列の をクリックします。
sleep コンテナのターミナルで次のコマンドを実行して、httpbin サービスにアクセスします。
curl -I httpbin.demo-server.svc.cluster.local:8000予期される出力:
HTTP/1.1 403 Forbidden content-length: 19 content-type: text/plain date: Wed, 11 Oct 2023 08:15:25 GMT server: envoy x-envoy-upstream-service-time: 4上記の出力は、demo-frontend 名前空間のサービスが demo-server 名前空間のサービスにアクセスできなかったことを示しています。
承認ポリシーのアクションパラメータの値を ALLOW に変更して、demo-frontend 名前空間から demo-server 名前空間へのアクセスリクエストを許可します。
ASM コンソール にログインします。 左側のナビゲーションペインで、 を選択します。
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。 左側のナビゲーションペインで、 を選択します。
[authorizationpolicy] ページで、管理する承認ポリシーを見つけ、YAML[アクション] 列の をクリックします。
[編集] ダイアログボックスで、action パラメータの値を ALLOW に変更し、[OK] をクリックします。
sleep コンテナのターミナルで次のコマンドを実行して、httpbin サービスにアクセスします。
curl -I httpbin.demo-server.svc.cluster.local:8000予期される出力:
HTTP/1.1 200 OK server: envoy date: Wed, 11 Oct 2023 08:21:40 GMT content-type: text/html; charset=utf-8 content-length: 9593 access-control-allow-origin: * access-control-allow-credentials: true x-envoy-upstream-service-time: 13上記の出力は、demo-frontend 名前空間のサービスが demo-server 名前空間のサービスに正常にアクセスしたことを示しています。
#### テスト結果から、承認ポリシーを使用して名前空間をまたがるサービスアクセスを制御できることがわかります。