認可ポリシーの設定が不適切な場合、予期しないアクセスが拒否または許可される可能性があります。 サービスメッシュ(ASM)認可ポリシーをトライアルモードで使用すると、本番環境に影響を与えることなく、認可ポリシーの正確性と信頼性を検証できます。 これにより、本番環境で問題が発生するリスクが軽減され、認可ポリシーの円滑なデプロイと運用が保証されます。
前提条件
クラスターが ASM インスタンスに追加されていること、および ASM インスタンスのバージョンが 1.14 以降であること。 ASM インスタンスの更新方法の詳細については、「ASM インスタンスの更新」をご参照ください。
foo という名前のサンプル名前空間が作成され、自動サイドカープロキシインジェクションが有効になっていること。 詳細については、「グローバル名前空間の管理」をご参照ください。
背景情報
ASM では、認可ポリシーを設定して、名前空間内のすべてのワークロードまたは特定のワークロードのみへのアクセス制御を実装できます。 認可ポリシーはアクセストラフィックを制御します。 適切に設定されていない場合、アクセスリクエストが予期せず許可または拒否される可能性があります。 この場合、ASM 管理者は大きな課題に直面します。 たとえば、正常なアクセスリクエストが拒否される一方で、拒否されるべきアクセスリクエストが許可される場合があります。 この問題を解決するために、ASM は認可ポリシーのトライアルモードを提供しています。 トライアルモードでは、認可ポリシーは実行されますが、トラフィックを許可またはブロックしません。 実行ログのみが記録されます。 ASM 管理者は、これらのログに基づいて、認可ポリシーの実行結果が期待どおりかを確認できます。 期待どおりでない場合は、実行結果が期待どおりになるまで認可ポリシーを調整し、トライアルモードを無効にして認可ポリシーを有効にすることができます。
この例では、2 つのテストアプリケーション、sleep と HTTPBin がデプロイされています。 テストプロセス全体は次のとおりです。sleep アプリケーションが存在するポッドで curl コマンドを使用して HTTPBin アプリケーションにアクセスし、接続性を検証します。ASM インスタンスの認可ポリシーを設定して特定のリクエストを拒否し、トライアルモードを有効にします。次に、認可ポリシーの拒否条件を満たすリクエストを開始します。 トライアルモードでは、リクエストは拒否されず、サイドカープロキシは認可ポリシーの実行ログを生成します。 認可ポリシーの実行結果が期待どおりであることを確認したら、トライアルモードを無効にして認可ポリシーを有効にします。
手順 1:sleep アプリケーションと HTTPbin アプリケーションをデプロイし、接続性をテストする
次の内容を使用して、sleep.yaml ファイルを作成します。
kubectl を使用してクラスターに接続し、次のコマンドを実行して foo 名前空間に sleep アプリケーションをデプロイします。
kubectl を使用してクラスターに接続する方法の詳細については、「クラスターの kubeconfig ファイルを取得し、kubectl を使用してクラスターに接続する」をご参照ください。
kubectl apply -f sleep.yaml -n foo次の内容を使用して、httpbin.yaml ファイルを作成します。
次のコマンドを実行して、foo 名前空間に HTTPBin アプリケーションをデプロイします。
kubectl apply -f httpbin.yaml -n foo次のコマンドを実行して、sleep アプリケーションと HTTPBin アプリケーション間の接続性をテストします。
for i in {1..20}; do kubectl exec "$(kubectl get pod -l app=sleep -n foo -o jsonpath={.items..metadata.name})" -c sleep -n foo -- curl http://httpbin.foo:8000/headers -s -o /dev/null -w "%{http_code}\n"; done予期される出力:
200 200 200 ...出力は、sleep アプリケーションが存在するポッドで curl コマンドを実行して HTTPBin アプリケーションに 20 回アクセスすると、返されるステータスコードが常に 200 であることを示しています。これは、ネットワーク接続が正常であることを示しています。
手順 2:認可ポリシーを作成し、トライアルモードを有効にする
ASM コンソール にログインします。 左側のナビゲーションペインで、 を選択します。
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。 左側のナビゲーションペインで、 を選択します。 表示されるページで、[作成] をクリックします。
[作成] ページで、次のパラメーターを設定し、[作成] をクリックします。

手順 3:認可ポリシーの実行結果を確認する
次のコマンドを再度実行して、sleep アプリケーションが存在するポッドから HTTPBin アプリケーションにアクセスします。
for i in {1..20}; do kubectl exec "$(kubectl get pod -l app=sleep -n foo -o jsonpath={.items..metadata.name})" -c sleep -n foo -- curl http://httpbin.foo:8000/headers -s -o /dev/null -w "%{http_code}\n"; done予期される出力:
200 200 200 ...認可ポリシーはトライアルモードで実行されているため、出力はアクセスリクエストが引き続き許可されていることを示しています。
次のコマンドを実行して、HTTPBin アプリケーションのサイドカープロキシのロールベースアクセス制御(RBAC)ログレベルをデバッグに調整します。
kubectl exec "$(kubectl get pod -l app=httpbin -n foo -o jsonpath={.items..metadata.name})" -c istio-proxy -n foo -- curl -X POST 127.0.0.1:15000/logging?rbac=debug予期される出力:
% Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0active loggers: ... rbac: debug ... 100 1028 0 1028 0 0 1003k 0 --:--:-- --:--:-- --:--:-- 1003k次のコマンドを実行して、HTTPBin アプリケーションのサイドカープロキシから認可ポリシーのトライアル実行ログをフィルタリングします。
kubectl logs "$(kubectl -n foo -l app=httpbin get pods -o jsonpath={.items..metadata.name})" -c istio-proxy -n foo | grep "shadow denied"次の出力はブロッキングログを示しています。
2023-12-20T03:58:47.107915Z debug envoy rbac external/envoy/source/extensions/filters/http/rbac/rbac_filter.cc:130 shadow denied, matched policy ns[foo]-policy[test]-rule[0] thread=32 2023-12-20T03:58:48.800098Z debug envoy rbac external/envoy/source/extensions/filters/http/rbac/rbac_filter.cc:130 shadow denied, matched policy ns[foo]-policy[test]-rule[0] thread=33 2023-12-20T03:58:50.420179Z debug envoy rbac external/envoy/source/extensions/filters/http/rbac/rbac_filter.cc:130 shadow denied, matched policy ns[foo]-policy[test]-rule[0] thread=32
手順 4:トライアルモードを無効にする
ログに基づいて認可ポリシーの実行結果が期待どおりであると判断したら、トライアルモードを無効にして認可ポリシーを有効にすることができます。
ASM コンソール にログインします。 左側のナビゲーションペインで、 を選択します。
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。 左側のナビゲーションペインで、 を選択します。
[authorizationpolicy] ページで、手順 2 で作成した認可ポリシーを見つけ、[コミッショニングモード] 列のスイッチをオフにし、OK[送信] メッセージの をクリックして、トライアルモードを無効にします。
次のコマンドを実行して、アクセスリクエストを再度開始します。
for i in {1..20}; do kubectl exec "$(kubectl get pod -l app=sleep -n foo -o jsonpath={.items..metadata.name})" -c sleep -n foo -- curl http://httpbin.foo:8000/headers -s -o /dev/null -w "%{http_code}\n"; done予期される出力:
403 403 403 ...出力は、認可ポリシーが有効になっているため、アクセスリクエストが拒否され、403 が返されたことを示しています。
次のコマンドを実行して、サイドカープロキシのログレベルを警告に戻します。
kubectl exec "$(kubectl get pod -l app=httpbin -n foo -o jsonpath={.items..metadata.name})" -c istio-proxy -n foo -- curl -X POST 127.0.0.1:15000/logging?rbac=warning予期される出力:
% Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0active loggers: ... rbac: warning ... 100 1028 0 1028 0 0 1003k 0 --:--:-- --:--:-- --:--:-- 1003k
参照
クラスター内のワークロードで RAM と権限管理を実行する必要がある場合は、認可ポリシーを使用して、リクエストパス、リクエストメソッド、クライアント IP アドレスの制限など、ワークロードのアクセス条件を設定できます。 これにより、特定の要件を満たすリクエストのみがワークロードにアクセスできるようになります。 詳細については、「ワークロードへのアクセス制御のために認可ポリシーを設定する」をご参照ください。
サービス間の HTTP リクエストまたは TCP リクエストに対してきめ細かい RAM を実行する必要がある場合は、リクエストの認可ポリシーを設定できます。 詳細については、「HTTP リクエストの認可ポリシーを設定する」および「TCP リクエストの認可ポリシーを設定する」をご参照ください。
ASM インスタンス内のサービスから外部サービスへのアクセストラフィックを制御する方法の詳細については、「認可ポリシーを使用して ASM インスタンス内のサービスから外部 Web サイトへのアクセストラフィックを制御する」および「認可ポリシーを使用して ASM インスタンス内のサービスから外部データベースへのアクセストラフィックを制御する」をご参照ください。
ASM ゲートウェイのアクセスログの内容をカスタマイズして、潜在的なセキュリティリスクをタイムリーに検出できます。 詳細については、「ASM ゲートウェイのアクセスログの生成と収集の機能を設定する」をご参照ください。
メッシュ監査機能を有効にして、さまざまなユーザーの日常業務を記録または追跡できます。 また、ASM リソースに対する操作の監査アラートを設定し、重要なリソースが変更されたときにアラート連絡先にアラート通知をタイムリーに送信することもできます。 詳細については、「ASM で KubeAPI 操作監査機能を使用する」および「ASM リソースに対する操作の監査アラートを設定する」をご参照ください。