リモート 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 ワークロード: RequestAuthenticationAuthorizationPolicy のリソースは、selector を使用して特定のワークロードをターゲットにします。そのため、ポリシーが一致できるラベルを持つワークロード(Kubernetes Deployment など)がクラスタで実行されている必要があります。たとえば、httpbin サンプルは app: httpbin ラベル付きで実行されるように構成されています。Istio JWT トークンガイドにある、httpbincurl を含む設定を自由に使用してください。

JWKS の取得を有効にする方法

Envoy プロキシが外部 jwksUri から JWKS 鍵を取得できるように Cloud Service Mesh を構成する主な方法は 2 つあります。

これはほとんどの本番環境シナリオで推奨される方法であり、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.modeSIMPLE に設定した DestinationRule を作成して、標準のサーバーサイド TLS 検証を有効にします。
  • クライアント証明書(mTLS)が必要なプロバイダの場合は、tls.modeMUTUAL に設定し、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 のホスト名とポートをカバーするユーザー定義の ServiceEntryRequestAuthentication ポリシーで見つからない場合は、Envoy が JWKS 鍵を取得するために必要な設定が Cloud Service Mesh によって自動的に構成されます。この自動化により、jwksUri へのデフォルトの接続(HTTPS、標準 TLS)で十分な共通のシナリオ用の設定が簡素化されます。

自動構成の条件: この自動動作は、次の条件に該当する場合に適用されます。

  • Cloud Service Mesh で Traffic Director を使用している。
  • jwksUrihttps スキームが使用されている。
  • jwksUri がクラスタ ローカル以外の外部サービスを指している。
  • jwksUri のホスト名とポートをすでに管理している参照可能な ServiceEntryRequestAuthentication ポリシーの Namespace と ServiceEntryexportTo フィールドに基づく)が存在しない。

上記の条件が満たされていれば、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 認可をご覧ください。

次のステップ