動的なアクセス制御が必要な場合は、Open Policy Agent (OPA) エンジンをイングレスゲートウェイに統合して、ユーザー ID やリクエストコンテンツに基づいて認可ポリシーをカスタマイズし、サービス間の通信をリアルタイムで制御できます。 これにより、不正アクセスを効果的に防止し、データ漏洩のリスクを軽減し、Service Mesh (ASM) インスタンス内のアプリケーションのセキュリティを強化します。 このトピックでは、OPAエンジンを使用して、イングレスゲートウェイが受信するリクエストを認証および認可する方法について説明します。 この例では、リクエストはイングレスゲートウェイを通過してHTTPBinアプリケーションにアクセスします。
前提条件
バージョン 1.15.3.25 以降の ASM インスタンスに Kubernetes マネージドクラスターが追加されています。 詳細については、「ASMインスタンスへのクラスターの追加」および「ASMインスタンスの更新」をご参照ください。
HTTPBin アプリケーションがデプロイされており、アクセス可能です。 詳細については、「HTTPBin アプリケーションのデプロイ」をご参照ください。
デフォルトの名前空間で自動サイドカープロキシインジェクションが有効になっています。 詳細については、「サイドカープロキシインジェクションポリシーの設定」をご参照ください。
ステップ 1:OPA エンジンのデプロイ
asm-opa.yaml という名前のファイルを作成し、次の内容をファイルにコピーします。
YAML コードは、OPA Service、OPA Deployment、および Secret をデプロイします。
種類
説明
Deployment
イメージ
registry-vpc.cn-hangzhou.aliyuncs.com/acs/opa:0.46.1-istio-3-static内のリージョン ID を、クラスターがデプロイされているリージョンの ID に置き換えます。デフォルトでは、OPA エンジン (
--set=decision_logs.console=true) のログ記録が有効になっています。 これにより、デバッグが容易になります。
Secret
Secret は、次の 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:イングレスゲートウェイの外部認可機能を使用して、OPA エンジンをイングレスゲートウェイと統合する
ASMコンソール にログインします。 左側のナビゲーションペインで、 を選択します。
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。 左側のナビゲーションペインで、 を選択します。
[イングレスゲートウェイ] ページで、OPA エンジンを統合するイングレスゲートウェイの横にある [ゲートウェイセキュリティ] をクリックします。
左側のナビゲーションペインで、 を選択します。
カスタム認可サービスを設定します。
[カスタム認可サービスの設定] ステップで、OPA エンジンをイングレスゲートウェイのカスタム認可サービスとして設定し、[次へ] をクリックします。

[一致ルール] ステップで、リクエスト一致ルールを設定し、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 { // bobという名前のユーザーのみを許可します。 user_name == "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 という名前のユーザーのアクセスが禁止されていることを示しています。