リモート 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 の例を確認する。