リモート JWKS を使用して JWT 認証を構成する
Cloud Service Mesh では、Istio の RequestAuthentication カスタム リソースを使用して JSON ウェブトークン(JWT)を検証することで、サービスを保護できます。この構成の重要な部分は、JSON Web Key Set(JWKS)プロバイダの URI を指定する jwksUri フィールドです。受信 JWT の検証に使用する公開鍵はこの JWKS に含まれています。
重要: Cloud Service Mesh では、データプレーン(Envoy プロキシ)が jwksUri から JWKS 鍵を直接取得します。コントロール プレーン(Traffic Director によって管理される)が外部呼び出しを行って JWKS 鍵を取得することはありません。つまり、外部 JWKS プロバイダへのすべてのネットワーク通信は、ワークロードの Envoy プロキシから行われます。
外部 JWKS アクセスの前提条件
このガイドに沿って作業を進めるには、次のものが必要です。
インターネット アクセスに関する組織のポリシー:
jwksUriが外部インターネット エンドポイントを指している場合、 Google Cloud 組織のポリシーでワークロードからのアウトバウンド インターネット アクセスが許可されている必要があります。具体的には、組織のポリシーconstraints/compute.disableInternetNetworkEndpointGroupが適用されていないことを確認してください。このポリシーが有効になっていると、外部jwksUriから JWKS を取得できません。ラベル付き Kubernetes ワークロード:
RequestAuthenticationとAuthorizationPolicyのリソースは、selectorを使用して特定のワークロードをターゲットにします。そのため、ポリシーが一致できるラベルを持つワークロード(Kubernetes Deployment など)がクラスタで実行されている必要があります。たとえば、httpbinサンプルはapp: httpbinラベル付きで実行されるように構成されています。Istio JWT トークンガイドにある、httpbinとcurlを含む設定を自由に使用してください。
JWKS の取得を有効にする方法
Envoy プロキシが外部 jwksUri から JWKS 鍵を取得できるように Cloud Service Mesh を構成する主な方法は 2 つあります。
1. ServiceEntry と DestinationRule を使用する手動構成(推奨)
これはほとんどの本番環境シナリオで推奨される方法であり、MCP を使用する Cloud Service Mesh では必須です。この方法では、メッシュが外部 JWKS プロバイダとどのように連携するかを明示的に制御できます。
ServiceEntry を使用して外部サービスを定義する
まず、外部 JWKS プロバイダをメッシュ内の既知のサービスにするために、Istio の ServiceEntry を作成する必要があります。このリソースにより、データプレーン内の Envoy プロキシで DNS 解決と適切なルーティングが可能になります。
jwksUri: "https://your-auth-provider.com/.well-known/jwks.json" を使用する RequestAuthentication ポリシーの場合、次の ServiceEntry を作成します。
apiVersion: networking.istio.io/v1beta1
kind: ServiceEntry
metadata:
name: "external-jwks-provider-se"
namespace: your-namespace
spec:
hosts:
- "your-auth-provider.com" # Hostname from your jwksUri
location: MESH_EXTERNAL
ports:
- number: 443
name: https
protocol: TLS
resolution: DNS
DestinationRule を使用して接続設定を構成する
JWKS プロバイダ(特に、特定の TLS または mTLS 構成が必要なプロバイダ)への接続用に、クライアントサイドの TLS 設定を指定する DestinationRule が必要になる場合もあります。
- 公開鍵証明書を使用するプロバイダの場合は、
tls.modeをSIMPLEに設定したDestinationRuleを作成して、標準のサーバーサイド TLS 検証を有効にします。 - クライアント証明書(mTLS)が必要なプロバイダの場合は、
tls.modeをMUTUALに設定し、Envoy が提示する必要がある証明書と鍵のパスを指定します。
この DestinationRule により、前の手順で定義した ServiceEntry の接続ポリシーが構成されます。
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: "external-jwks-provider-dr"
namespace: your-namespace
spec:
host: "your-auth-provider.com" # Must match a host in the ServiceEntry
trafficPolicy:
tls:
# Use SIMPLE for standard server-side TLS.
mode: SIMPLE
# If the JWKS provider uses a custom CA, provide the CA cert bundle.
# caCertificates: /path/to/provider-ca-cert.pem
# For providers requiring mTLS from Envoy, uncomment the following:
# mode: MUTUAL
# clientCertificate: /path/to/client-cert.pem
# privateKey: /path/to/client-key.pem
# caCertificates: /path/to/provider-ca-cert.pem
これらのリソースが存在し、正しく構成されていれば、Envoy はこれらのリソースを使用して安全な接続を確立し、JWKS 鍵を取得します。
2. Cloud Service Mesh による自動構成(Traffic Director の使用時のみ)
HTTPS jwksUri のホスト名とポートをカバーするユーザー定義の ServiceEntry が RequestAuthentication ポリシーで見つからない場合は、Envoy が JWKS 鍵を取得するために必要な設定が Cloud Service Mesh によって自動的に構成されます。この自動化により、jwksUri へのデフォルトの接続(HTTPS、標準 TLS)で十分な共通のシナリオ用の設定が簡素化されます。
自動構成の条件: この自動動作は、次の条件に該当する場合に適用されます。
- Cloud Service Mesh で Traffic Director を使用している。
jwksUriでhttpsスキームが使用されている。jwksUriがクラスタ ローカル以外の外部サービスを指している。jwksUriのホスト名とポートをすでに管理している参照可能なServiceEntry(RequestAuthenticationポリシーの Namespace とServiceEntryのexportToフィールドに基づく)が存在しない。
上記の条件が満たされていれば、JWKS を取得するように Envoy プロキシが構成される際に、ServiceEntry または DestinationRule のリソースを jwksUri 用に明示的に作成する必要はありません。
RequestAuthentication の構成
JWKS の取得方法に関係なく、RequestAuthentication ポリシーを使用して JWT 検証ルールを定義します。
apiVersion: security.istio.io/v1
kind: RequestAuthentication
metadata:
name: "jwt-example"
namespace: your-namespace # Replace with your application's namespace
spec:
selector:
matchLabels:
app: your-app # Replace with your application's label (e.g. httpbin)
jwtRules:
- issuer: "testing@secure.istio.io"
jwksUri: "https://raw.githubusercontent.com/istio/istio/release-1.26/security/tools/jwt/samples/jwks.json"
jwtRules の主なフィールド(詳細については、Istio RequestAuthentication のドキュメントを参照):
issuer: JWT の発行者。jwksUri: プロバイダの公開鍵セット(JWKS)の HTTPS URI。fromHeaders(省略可): JWT が想定されるヘッダーの場所を指定します。fromParams(省略可): JWT が想定されるクエリ パラメータを指定します。forwardOriginalToken(省略可): true の場合、元のトークンがアップストリーム サービスに転送されます。
AuthorizationPolicy による JWT 認証の適用
有効な JWT を持たないリクエストを拒否するには、RequestAuthentication ポリシーを AuthorizationPolicy と組み合わせる必要があります。次のポリシーでは、指定した発行者とサブジェクトからの有効な JWT が提示された場合にのみ、your-app ワークロードへのリクエストを許可します。
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
name: "require-jwt-for-your-app"
namespace: your-namespace # Replace with your application's namespace
spec:
selector:
matchLabels:
app: your-app # Replace with your application's label (e.g. httpbin)
action: ALLOW
rules:
- from:
- source:
# This principal is typically in the format "issuer/subject"
requestPrincipals: ["testing@secure.istio.io/sub-from-jwt"] # Replace with the expected principal
認可での JWT クレームの使用に関する詳細な例とユースケースについては、JWT トークンタスク用の Istio 認可をご覧ください。
次のステップ
- Istio の RequestAuthentication API の詳細を確認する。
- Cloud Service Mesh の AuthorizationPolicy の概要を確認する。
- Istio における JWT 用の AuthorizationPolicy の例を確認する。