サービス間の TCP リクエストをきめ細かく制御するために、TCP リクエストに対する承認ポリシーを設定して、サービスインタラクションの権限を管理できます。これにより、承認されたリクエストのみが特定のサービスにアクセスできるようになり、サービスのセキュリティと信頼性が向上します。
前提条件
Istio リソースが定義されていること。詳細については、「Istio リソースを使用してトラフィックをサービスの異なるバージョンにルーティングする」をご参照ください。
foo 名前空間が作成され、サイドカープロキシが挿入されていること。詳細については、「名前空間の作成」および「サイドカープロキシの自動挿入を有効にする」をご参照ください。
手順 1:サンプルアプリケーションをデプロイする
リクエストを受信する TCP サービスとして tcp-echo アプリケーションを、リクエストを送信する TCP サービスとして sleep アプリケーションをデプロイします。
リクエストを受信する TCP サービスをデプロイします。
以下の内容を含む tcp-echo.yaml ファイルを作成します。
tcp-echo はリクエストを受信した後、リクエストコンテンツの先頭に
helloを付加し、付加されたコンテンツをレスポンスとして返します。たとえば、tcp-echo がworldを受信した場合、hello worldが返されます。kubectl を使用してクラスターに接続します。次のコマンドを実行して、foo 名前空間でリクエストを受信する TCP サービスとして tcp-echo サービスをデプロイします。
kubectl を使用してクラスターに接続する方法の詳細については、「クラスターの kubeconfig ファイルを取得し、kubectl を使用してクラスターに接続する」をご参照ください。
kubectl apply -f tcp-echo.yaml -n foo
リクエストを送信する TCP サービスをデプロイします。
以下の内容を含む sleep.yaml ファイルを作成します。
次のコマンドを実行して、foo 名前空間で TCP リクエストを送信する sleep サービスをデプロイします。
kubectl apply -f sleep.yaml -n foo
手順 2:承認ポリシーを設定する前に、tcp-echo サービスが想定どおりにリクエストできるかどうかを確認する
次のコマンドを実行して、sleep サービスからのリクエストがポート 9000 経由で tcp-echo サービスにアクセスできるかどうかを確認します。
kubectl exec "$(kubectl get pod -l app=sleep -n foo -o jsonpath={.items..metadata.name})" -c sleep -n foo -- sh -c 'echo "port 9000" | nc tcp-echo 9000' | grep "hello" && echo 'connection succeeded' || echo 'connection rejected'期待される出力:
hello port 9000 connection succeededこの出力は、sleep サービスからのリクエストがポート 9000 経由で tcp-echo サービスにアクセスできることを示しています。
次のコマンドを実行して、sleep サービスからのリクエストがポート 9001 経由で tcp-echo サービスにアクセスできるかどうかを確認します。
kubectl exec "$(kubectl get pod -l app=sleep -n foo -o jsonpath={.items..metadata.name})" -c sleep -n foo -- sh -c 'echo "port 9001" | nc tcp-echo 9001' | grep "hello" && echo 'connection succeeded' || echo 'connection rejected'期待される出力:
hello port 9001 connection succeededこの出力は、sleep サービスからのリクエストがポート 9001 経由で tcp-echo サービスにアクセスできることを示しています。
手順 3:承認ポリシーを設定する
TCP リクエストがポート 9000 経由で tcp-echo サービスにアクセスできるように承認ポリシーを設定するには、次の手順を実行します。
ASM コンソール にログインします。左側のナビゲーションペインで、 を選択します。
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションペインで、 を選択します。
次のいずれかの方法で承認ポリシーを作成します。
重要TCP リクエストの承認ポリシーを設定する場合は、[リクエストターゲットの追加] セクションの [メソッド] スイッチをオンにしないでください。このスイッチは HTTP リクエストにのみ適しており、TCP リクエストには適していません。このスイッチを使用して TCP リクエストに設定された ALLOW ルールは無効です。Service Meshは無効な ALLOW ルールを無視します。したがって、TCP リクエストに対してこのスイッチをオンにすると、TCP リクエストは拒否され、
connection rejectedが返されます。方法 1:YAML を使用して承認ポリシーを作成する
[authorizationpolicy] ページで、[YAML から作成] をクリックします。
[作成] ページで、[名前空間] ドロップダウンリストから [foo] を選択し、テンプレートを選択し、次の内容を [YAML] コードエディターにコピーして、[作成] をクリックします。
kind: AuthorizationPolicy apiVersion: security.istio.io/v1beta1 metadata: name: demo namespace: foo spec: action: ALLOW rules: - to: - operation: ports: - '9000'
方法 2:グラフィカルユーザーインターフェース (GUI) を使用して承認ポリシーを作成する
[authorizationpolicy] ページで、[作成] をクリックします。
[作成] ページで、パラメーターを設定し、[作成] をクリックします。
パラメーター
説明
[名前]
承認ポリシーの名前。この例では、値は demo に設定されています。
[ポリシータイプ]
承認アクション。この例では、値は [許可] に設定されています。
[名前空間]
承認ポリシーを作成する名前空間。この例では、[ワークロードスコープ] タブの [名前空間] パラメーターは [foo] に設定されています。
[有効スコープ]
承認ポリシーの有効スコープ。この例では、値は [名前空間スコープ] に設定されています。
[リクエスト一致ルール]
承認ポリシーのリクエスト一致ルール。この例では、[リクエストターゲットの追加] セクションで [ポート] がオンになっており、値は 9000 に設定されています。
手順 4:作成した承認ポリシーが有効になっているかどうかを確認する
次のコマンドを実行して、sleep サービスからのリクエストがポート 9001 経由で tcp-echo サービスにアクセスできるかどうかを確認します。
kubectl exec "$(kubectl get pod -l app=sleep -n foo -o jsonpath={.items..metadata.name})" -c sleep -n foo -- sh -c 'echo "port 9001" | nc tcp-echo 9001' | grep "hello" && echo 'connection succeeded' || echo 'connection rejected'期待される出力:
connection rejectedこの出力は、sleep サービスからのリクエストがポート 9001 経由で tcp-echo サービスにアクセスできないことを示しています。
次のコマンドを実行して、sleep サービスからのリクエストがポート 9000 経由で tcp-echo サービスにアクセスできるかどうかを確認します。
kubectl exec "$(kubectl get pod -l app=sleep -n foo -o jsonpath={.items..metadata.name})" -c sleep -n foo -- sh -c 'echo "port 9000" | nc tcp-echo 9000' | grep "hello" && echo 'connection succeeded' || echo 'connection rejected'期待される出力:
hello port 9000 connection succeededこの出力は、sleep サービスからのリクエストがポート 9000 経由で tcp-echo サービスにアクセスできることを示しています。
参照
承認ポリシーの不適切な設定により、予期しないアクセスが拒否または許可される場合があります。ASM 承認ポリシーをトライアルモードで使用して、承認ポリシーの実行結果がログに基づいて期待どおりかどうかを確認できます。そうでない場合は、実行結果が期待どおりになるまで承認ポリシーを調整できます。その後、トライアルモードを無効にして、承認ポリシーを有効にすることができます。詳細については、「ASM 承認ポリシーをトライアルモードで実行する」をご参照ください。
サービス間の HTTP リクエストをきめ細かく制御する方法の詳細については、「HTTP リクエストに対する承認ポリシーを設定する」をご参照ください。
ASM インスタンス内のサービスから外部サービスへのアクセストラフィックを制御する方法の詳細については、「承認ポリシーを使用して ASM インスタンス内のサービスから外部 Web サイトへのアクセストラフィックを制御する」および「承認ポリシーを使用して ASM インスタンス内のサービスから外部データベースへのアクセストラフィックを制御する」をご参照ください。
ASM ゲートウェイのアクセスログの内容をカスタマイズして、潜在的なセキュリティリスクをタイムリーに検出できます。詳細については、「ASM ゲートウェイのアクセスログの生成と収集の機能を設定する」をご参照ください。
メッシュ監査機能を有効にして、さまざまなユーザーの日常業務を記録または追跡できます。また、ASM リソースに対する操作の監査アラートを設定し、重要なリソースが変更されたときにアラート連絡先にアラート通知をタイムリーに送信することもできます。詳細については、「ASM で KubeAPI 操作監査機能を使用する」および「ASM リソースに対する操作の監査アラートを設定する」をご参照ください。