Service Mesh(ASM)を使用すると、Istio ネイティブセキュリティリソースをカプセル化し、セキュリティポリシー機能を提供できます。一般的なシナリオでは、セキュリティ設定を簡単に完了できます。ASM は Open Policy Agent(OPA)と統合されています。 OPA を使用してアクセス制御ポリシーを定義し、アプリケーションへのきめ細かいアクセス制御を実装できます。このトピックでは、ASM セキュリティポリシーを使用してポッド外の OPA エンジンにアクセスする方法について説明します。
前提条件
Kubernetes マネージドクラスターは、バージョン 1.15.3.25 以降の ASM インスタンスに追加されます。詳細については、「ASM インスタンスへのクラスターの追加」および「ASM インスタンスの更新」をご参照ください。
HTTPBin アプリケーションがデプロイされており、アクセスできます。詳細については、「HTTPBin アプリケーションのデプロイ」をご参照ください。
default ネームスペースで自動サイドカープロキシインジェクションが有効になっています。詳細については、「サイドカープロキシインジェクションポリシーの設定」をご参照ください。
機能の説明
デフォルトでは、OPA は ASM でサイドカーモードでデプロイされます。 OPA を有効にした後にアプリケーションポッドを再起動すると、ASM はアプリケーションポッドに OPA コンテナを挿入します。その後、アプリケーションコンテナへのすべてのリクエストは OPA によって認証されます。サイドカーモードでは、Istio プロキシは同じポッド内の OPA にアクセスします。したがって、レイテンシは低く、このモードはレイテンシの影響を受けやすいサービスに適しています。
ただし、サイドカーモードには次の欠点があります。大量のリソースが占有されます。 OPA コンテナがポッドに挿入されると、ポッドを再起動する必要があります。リクエストは柔軟な方法でアプリケーションにアクセスできません。集中モードの OPA は、これらの側面でサイドカーモードの OPA を補完できます。集中モードの OPA には次の利点があります。リソースの使用量が少なくなります。 OPA コンテナのデプロイとアプリケーションへのリクエストアクセスにポッドを再起動する必要はありません。アプリケーションへの特定のリクエストに OPA ポリシーを使用できます。このトピックでは、アプリケーションへのリクエストの認証のために集中モードで OPA をデプロイする方法について説明します。

ステップ 1:OPA をデプロイする
asm-opa.yaml という名前のファイルを作成し、次の内容をファイルにコピーします。
YAML コードは、OPA サービス、OPA デプロイメント、およびシークレットをデプロイします。
種類
説明
デプロイメント
イメージ
registry-vpc.cn-hangzhou.aliyuncs.com/acs/opa:0.46.1-istio-3-static内のリージョン ID を、クラスターがデプロイされているリージョンの ID に置き換えます。デフォルトでは、OPA エンジン(
--set=decision_logs.console=true)のログ記録が有効になっています。これはデバッグに役立ちます。
シークレット
シークレットは、次の OPA ポリシーを定義します。
リクエストのパスが
healthの場合、リクエストは許可されます。リクエストのメソッドが
HEADの場合、リクエストは許可されます。リクエストのユーザー名が
aliceの場合、リクエストは許可されます。説明ユーザー名は、リクエストの
AuthorizationヘッダーにAuthorization: Basic ${user name: Base64-encoded password string}の形式で含まれています。
kubectl を使用して、kubeconfig ファイルの情報に基づいて Container Service for Kubernetes(ACK)クラスターに接続し、次のコマンドを実行して OPA をデプロイします。
kubectl apply -f asm-opa.yaml
ステップ 2:ASM セキュリティポリシーを OPA に関連付ける
[ASM コンソール] にログインします。左側のナビゲーションペインで、 を選択します。
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションペインで、 を選択します。
[ASM セキュリティポリシー] ページで、[作成] をクリックします。[ASM セキュリティポリシーの作成] ダイアログボックスで、[カスタム認証サービス] カードをクリックし、[OK] をクリックします。
カスタム認証サービスを設定します。
[カスタム認証サービスの作成] ページで、ステップ 1 でデプロイされた OPA 認証サービスに関する情報を設定し、[次へ] をクリックします。

[ワークロードと一致ルール] ステップで、[ワークロードグループの追加] をクリックします。[新しいワークロードグループ] ダイアログボックスで、[ワークロードグループ名] を設定し、[ワークロードの追加] をクリックします。
[ワークロードの追加] ダイアログボックスで、[ワークロードスコープ] を選択し、[名前空間] を [default] に設定し、[ワークロードタイプ] を [サービス] に設定します。次に、[ワークロードの選択] セクションで [httpbin] を選択し、
アイコンをクリックして、[OK] をクリックします。
[新しいワークロードグループ] ダイアログボックスの [一致ルールリスト] セクションで、[一致モード] を [選択したリクエストを認証する必要があります] に設定し、[一致ルール] を [カスタム一致ルール] に設定します。[パス] スイッチをオンにし、フィールドに
/status/*と入力して、[OK] をクリックします。
[ワークロードと一致ルール] ステップで、[送信] をクリックします。
次の図は、セキュリティポリシーが作成され、OPA に関連付けられた後のページを示しています。

ステップ 3:HTTPBin アプリケーションへのアクセスをテストする
次のコマンドを実行して、
/パスにアクセスします。curl ${IP address of the ASM gateway}/ -I -X GET予期される出力:
HTTP/1.1 200 OK server: istio-envoy date: Tue, 25 Jul 2023 08:30:58 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: 2出力は、パスへのアクセスリクエストに認証が不要であることを示しています。
有効なパラメーターなしで次のコマンドを実行して、
/status/201パスにアクセスします。curl ${IP address of the ASM gateway}/status/201 -I -X GET予期される出力:
HTTP/1.1 403 Forbidden date: Tue, 25 Jul 2023 08:31:18 GMT server: istio-envoy content-length: 0 x-envoy-upstream-service-time: 1出力は、有効なパラメーターのないアクセスリクエストが拒否されたことを示しています。
有効なパラメーターを使用して次のコマンドを実行して、
/status/201パスにアクセスします。curl ${IP address of the ASM gateway}/status/201 -I -X GET --user alice:testpassword予期される出力:
HTTP/1.1 201 Created server: istio-envoy date: Tue, 25 Jul 2023 08:31:38 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: 3出力は、有効なパラメーターを含むアクセスリクエストが許可されたことを示しています。
ステップ 4:OPA ポリシーを更新する
OPA エンジンの HTTP API を呼び出して、OPA ポリシーを更新します。
次のコマンドを実行して、bob という名前のユーザーのみが HTTP 経由で HTTPBin アプリケーションにアクセスできるようにし、alice という名前のユーザーが HTTP 経由で HTTPBin アプリケーションにアクセスできないようにします。
kubectl exec deployment/httpbin -c istio-proxy -- curl asm-opa:8181/v1/policies/policy/policy.rego -XPUT --data-binary 'package asm.authz import future.keywords import input.attributes.request.http as http_request import input.parsed_path default allow := false allow if { parsed_path[0] == "health" } allow if { http_request.method == "HEAD" } allow if { user_name == "bob" // ユーザー bob のみを許可します } user_name := parsed if { [_, encoded] := split(http_request.headers.authorization, " ") [parsed, _] := split(base64url.decode(encoded), ":") }'bob という名前のユーザーを使用して、次のコマンドを実行して HTTPBin アプリケーションにアクセスします。
curl ${IP address of the ASM gateway}/status/201 -I -X GET --user bob:testpassword予期される出力:
HTTP/1.1 201 Created server: istio-envoy date: Tue, 25 Jul 2023 08:32: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: 3出力は、ユーザー bob のアクセスが成功したことを示しています。
alice という名前のユーザーを使用して、次のコマンドを実行して HTTPBin アプリケーションにアクセスします。
curl ${IP address of the ASM gateway}/status/201 -I -X GET --user alice:testpassword予期される出力:
HTTP/1.1 403 Forbidden date: Tue, 25 Jul 2023 08:32:49 GMT server: istio-envoy content-length: 0 x-envoy-upstream-service-time: 1出力は、ユーザー alice のアクセスが禁止されていることを示しています。