要求認証

要求認証

RequestAuthentication は、ワークロードでサポートされているリクエスト認証方式を定義します。設定された認証ルールに基づいて、リクエストに無効な認証情報が含まれている場合、リクエストは拒否されます。認証クレデンシャルが含まれていないリクエストは受け入れられますが、認証されたIDは持ちません。認証されたリクエストのみにアクセスを制限するには、認可ルールを साथに使用する必要があります。 例

  • ラベルapp:httpbinを持つワークロードのすべてのリクエストにJWTを必須にする
apiVersion: security.istio.io/v1
kind: RequestAuthentication
metadata:
  name: httpbin
  namespace: foo
spec:
  selector:
    matchLabels:
      app: httpbin
  jwtRules:
  - issuer: "issuer-foo"
    jwksUri: https://example.com/.well-known/jwks.json
---
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
  name: httpbin
  namespace: foo
spec:
  selector:
    matchLabels:
      app: httpbin
  rules:
  - from:
    - source:
        requestPrincipals: ["*"]
  • ルート名前空間(デフォルトでは「istio-system」)のポリシーは、メッシュ内のすべての名前空間のワークロードに適用されます。次のポリシーは、すべてのワークロードが有効なJWTトークンを含むリクエストのみを受け入れるようにします。
apiVersion: security.istio.io/v1
kind: RequestAuthentication
metadata:
  name: req-authn-for-all
  namespace: istio-system
spec:
  jwtRules:
  - issuer: "issuer-foo"
    jwksUri: https://example.com/.well-known/jwks.json
---
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
  name: require-jwt-for-all
  namespace: istio-system
spec:
  rules:
  - from:
    - source:
        requestPrincipals: ["*"]
  • 次の例は、異なるhostに対して異なるJWT要件を設定する方法を示しています。 RequestAuthenticationは、issuer-fooまたはissuer-barのいずれかによって発行されたJWTを受け入れることができると宣言しています(公開鍵セットはOpenID Connectの仕様から暗黙的に設定されます)。
apiVersion: security.istio.io/v1
kind: RequestAuthentication
metadata:
  name: httpbin
  namespace: foo
spec:
  selector:
    matchLabels:
      app: httpbin
  jwtRules:
  - issuer: "issuer-foo"
  - issuer: "issuer-bar"
---
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
  name: httpbin
  namespace: foo
spec:
  selector:
    matchLabels:
      app: httpbin
  rules:
  - from:
    - source:
        requestPrincipals: ["issuer-foo/*"]
    to:
    - operation:
        hosts: ["example.com"]
  - from:
    - source:
        requestPrincipals: ["issuer-bar/*"]
    to:
    - operation:
        hosts: ["another-host.com"]
  • パスごとに異なる要件を設定するように、認可ポリシーを微調整できます。たとえば、/healthzを除くすべてのパスでJWTを要求するには、同じRequestAuthenticationを使用できますが、認可ポリシーは次のようになります。
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
  name: httpbin
  namespace: foo
spec:
  selector:
    matchLabels:
      app: httpbin
  rules:
  - from:
    - source:
        requestPrincipals: ["*"]
  - to:
    - operation:
        paths: ["/healthz"]

[実験的] 派生したメタデータに基づくルーティングがサポートされるようになりました。プレフィックス「@」は、リクエストのヘッダーではなく、内部メタデータとの一致を示すために使用されます。現在、この機能は次のメタデータに対してのみサポートされています。

  • request.auth.claims.{claim-name}[.{nested-claim}]*は、検証済みのJWTトークンから抽出されます。ネストされたクレーム名には、セパレータとして.または[]を使用します。例:request.auth.claims.subrequest.auth.claims.name.givenNamerequest.auth.claims[foo.com/name]。詳細については、JWTクレームベースのルーティングを参照してください。

JWTクレームメタデータとの一致の使用は、Gatewayでのみサポートされています。次の例を示します。

  • JWTをデコードおよび検証するためのRequestAuthentication。これにより、@request.auth.claimsをVirtualServiceで使用できるようになります。
  • リクエストに有効なプリンシパルがあるかどうかを確認するためのAuthorizationPolicy。これにより、リクエストにJWTが必要になります。
  • 「sub」クレームに基づいてリクエストをルーティングするためのVirtualService。
apiVersion: security.istio.io/v1
kind: RequestAuthentication
metadata:
  name: jwt-on-ingress
  namespace: istio-system
spec:
  selector:
    matchLabels:
      app: istio-ingressgateway
  jwtRules:
  - issuer: "example.com"
    jwksUri: https://example.com/.well-known/jwks.json
---
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
  name: require-jwt
  namespace: istio-system
spec:
  selector:
    matchLabels:
      app: istio-ingressgateway
  rules:
  - from:
    - source:
        requestPrincipals: ["*"]
---
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: route-jwt
spec:
  hosts:
  - foo.prod.svc.cluster.local
  gateways:
  - istio-ingressgateway
  http:
  - name: "v2"
    match:
    - headers:
        "@request.auth.claims.sub":
          exact: "dev"
    route:
    - destination:
        host: foo.prod.svc.cluster.local
        subset: v2
  - name: "default"
    route:
    - destination:
        host: foo.prod.svc.cluster.local
        subset: v1
フィールドタイプ説明必須
selectorWorkloadSelector

オプション。セレクターは、リクエスト認証ポリシーを適用する場所を決定します。セレクターは、リクエスト認証ポリシーと同じ名前空間にあるワークロードと一致します。リクエスト認証ポリシーがルート名前空間にある場合、セレクターはさらにすべての名前空間にあるワークロードと一致します。

設定されていない場合、セレクターはすべてのワークロードと一致します。

特定のポリシーに対して、selectorまたはtargetRefsのいずれか一方のみを設定できます。

いいえ
targetRefsPolicyTargetReference[]

オプション。targetRefsは、ポリシーを適用するリソースのリストを指定します。指定されたターゲットリソースは、ポリシーが適用されるワークロードを決定します。

現在、以下のリソース添付タイプがサポートされています。

  • 同じ名前空間にあるkind: Gatewaygroup: gateway.networking.k8s.io
  • 同じ名前空間にあるkind: Servicegroup: ""またはgroup: "core"。このタイプは、ウェイポイントに対してのみサポートされています。

設定されていない場合、ポリシーはセレクターで定義されているとおりに適用されます。セレクターとtargetRefsのいずれか一方のみを設定できます。

注:Istioバージョン1.22より前のマルチリビジョン環境でtargetRefsフィールドを使用している場合は、istio.io/revラベルを使用してポリシーを1.22以降を実行しているリビジョンに固定することを強くお勧めします。これは、アップグレードプロセス中に、古いコントロールプレーン(targetRefsフィールドを認識していない)に接続されているプロキシが、ポリシーを名前空間全体として誤って解釈するのを防ぐためです。

注:ウェイポイントプロキシは、ポリシーを適用するためにこのフィールドを使用する必要があります。 selectorポリシーは無視されます。

いいえ
jwtRulesJWTRule[]

選択したワークロードのプロキシで検証できるJWTのリストを定義します。有効なトークンは、認証されたIDを抽出するために使用されます。各ルールは、ルールによって認識される場所にトークンが提示された場合にのみアクティブになります。トークンは、JWTルールの設定に基づいて検証されます。検証に失敗した場合、リクエストは拒否されます。注:複数のトークン(異なる場所)を持つリクエストはサポートされていません。このようなリクエストの出力プリンシパルは未定義です。

いいえ

JWTRule

RFC 7519で定義されている、認証用のJSON Webトークン(JWT)トークン形式。OAuth 2.0OIDC 1.0を参照して、認証フロー全体でどのように使用されるかを確認してください。

https://example.comによって発行されたJWTの仕様。対象ユーザーのクレームは、bookstore_android.apps.example.comまたはbookstore_web.apps.example.comのいずれかである必要があります。トークンは、Authorizationヘッダー(デフォルト)に表示する必要があります。JSON Web Key Set(JWKS)は、OpenID Connectプロトコルに従って検出されます。

issuer: https://example.com
audiences:
- bookstore_android.apps.example.com
  bookstore_web.apps.example.com

この例では、デフォルト以外の場所(x-goog-iap-jwt-assertionヘッダー)にあるトークンを指定しています。また、JWKSを取得するURIを明示的に定義しています。

issuer: https://example.com
jwksUri: https://example.com/.secret/jwks.json
fromHeaders:
- "x-goog-iap-jwt-assertion"
フィールドタイプ説明必須
issuerstring

JWTを発行した発行者を識別します。issuerを参照してください。異なるissクレームを持つJWTは拒否されます。

例:https://foobar.auth0.com 例:1234567-compute@developer.gserviceaccount.com

はい
audiencesstring[]

アクセスが許可されているJWT audiencesのリスト。これらの対象ユーザーのいずれかを含むJWTは受け入れられます。

対象ユーザーが空の場合、サービス名は受け入れられます。

audiences:
- bookstore_android.apps.example.com
  bookstore_web.apps.example.com
いいえ
jwksUristring

JWTの署名を検証するための、プロバイダーの公開鍵セットのURL。OpenID Discoveryを参照してください。

鍵セットドキュメントが(a)発行者のOpenID Discoveryから取得できるか、(b)発行者の電子メールドメイン(例:Googleサービスアカウント)から推測できる場合はオプションです。

例:https://www.googleapis.com/oauth2/v1/certs

注:jwksUrijwksのいずれか一方のみを使用する必要があります。

いいえ
jwksstring

JWTの署名を検証するための、JSON Web Key Setの公開鍵。https://auth0.com/docs/jwksを参照してください。

注:jwksUrijwksのいずれか一方のみを使用する必要があります。

いいえ
fromHeadersJWTHeader[]

JWTが期待されるヘッダーの場所のリスト。たとえば、JWTがx-jwt-assertionヘッダーにあり、Bearerプレフィックスが付いている場合、場所の仕様は次のようになります。

  fromHeaders:
  - name: x-jwt-assertion
    prefix: "Bearer "

注:複数のトークン(異なる場所)を持つリクエストはサポートされていません。このようなリクエストの出力プリンシパルは未定義です。

いいえ
fromParamsstring[]

JWTが期待されるクエリパラメータのリスト。たとえば、JWTがクエリパラメータmy_token(例:/path?my_token=<JWT>)を介して提供される場合、設定は次のようになります。

  fromParams:
  - "my_token"

注:複数のトークン(異なる場所)を持つリクエストはサポートされていません。このようなリクエストの出力プリンシパルは未定義です。

いいえ
outputPayloadToHeaderstring

このフィールドは、正常に検証されたJWTペイロードをバックエンドに出力するヘッダー名を指定します。転送されるデータは、base64_encoded(jwt_payload_in_JSON)です。指定されていない場合、ペイロードは出力されません。

いいえ
fromCookiesstring[]

JWTが期待されるCookie名のリスト。 // たとえば、設定が次の場合

  from_cookies:
  - auth-token

JWTは、リクエストのauth-token Cookieから抽出されます。

注:複数のトークン(異なる場所)を持つリクエストはサポートされていません。このようなリクエストの出力プリンシパルは未定義です。

いいえ
forwardOriginalTokenbool

trueに設定すると、元のトークンはアップストリームリクエストのために保持されます。デフォルトはfalseです。

いいえ
outputClaimToHeadersClaimToHeader[]

このフィールドは、正常に検証されたトークンでクレームをHTTPヘッダーにコピーする操作のリストを指定します。これは、ペイロード全体ではなく個々のクレームを出力できるため、output_payload_to_headerとは異なります。リストの各操作で指定されたヘッダーは一意である必要があります。string / int / bool型のネストされたクレームもサポートされています。

  outputClaimToHeaders:
  - header: x-my-company-jwt-group
    claim: my-group
  - header: x-test-environment-flag
    claim: test-flag
  - header: x-jwt-claim-group
    claim: nested.key.group

[実験的]この機能は実験的な機能です。

いいえ
timeoutDuration

PILOT_JWT_ENABLE_REMOTE_JWKS環境変数によって決定されるリゾルバーが、JWKSのフェッチを待機する最大時間。デフォルトは5秒です。

いいえ

JWTHeader

このメッセージは、JWTトークンを抽出するヘッダーの場所を指定します。

フィールドタイプ説明必須
namestring

HTTPヘッダー名。

はい
prefixstring

トークンをデコードする前に削除する必要があるプレフィックス。たとえば、Authorization: Bearer <token>の場合、プレフィックスは末尾にスペースが付いたBearerです。ヘッダーにこの正確なプレフィックスがない場合、無効と見なされます。

いいえ

ClaimToHeader

このメッセージは、クレームをヘッダーにコピーするための詳細を指定します。

フィールドタイプ説明必須
headerstring

作成されるヘッダーの名前。ヘッダーがリクエストに既に存在する場合は、上書きされます。

はい
claimstring

コピー元のクレームの名前。string / int / bool型のクレームのみがサポートされています。クレームが存在しない場合、またはクレームのタイプがサポートされていない場合、ヘッダーは存在しません。

はい
この情報は役に立ちましたか?
改善のための提案はありますか?

フィードバックありがとうございます!