RequestAuthentication

RequestAuthentication

RequestAuthentication 定義工作負載支援哪些請求身份驗證方法。如果請求包含無效的身份驗證資訊,則會根據設定的身份驗證規則拒絕請求。不包含任何身份驗證憑證的請求將被接受,但不會有任何經過身份驗證的身份。若要限制僅存取經過身份驗證的請求,則應搭配授權規則。範例

  • 要求標籤為 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-fooissuer-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 宣告中繼資料使用符合項。以下範例示範

  • RequestAuthentication 解碼並驗證 JWT。這也會使 @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

選填。此選擇器決定在哪裡應用請求身份驗證策略。此選擇器會與請求身份驗證策略相同命名空間中的工作負載匹配。如果請求身份驗證策略位於根命名空間中,則此選擇器還會與所有命名空間中的工作負載匹配。

如果未設定,則選擇器會與所有工作負載匹配。

對於給定的策略,selectortargetRefs 最多只能設定一個。

targetRefsPolicyTargetReference[]

選填。此 targetRefs 指定策略應套用至的資源列表。指定的目標資源將決定策略套用至哪些工作負載。

目前支援以下資源附加類型

  • kind: Gateway,且 group: gateway.networking.k8s.io 在同一命名空間中。
  • kind: Service,且 group: ""group: "core" 在同一命名空間中。此類型僅支援航點 (waypoints)。

如果未設定,則策略會按照選擇器的定義套用。selectortargetRefs 最多只能設定一個。

注意:如果您在 Istio 1.22 之前的多版本環境中使用 targetRefs 欄位,強烈建議您透過 istio.io/rev 標籤將策略固定到執行 1.22+ 的版本。這是為了防止連接到舊控制平面的代理(不了解 targetRefs 欄位)在升級過程中將策略錯誤地解釋為命名空間範圍。

注意:航點代理需要使用此欄位才能套用策略;selector 策略將被忽略。

jwtRulesJWTRule[]

定義可在選定工作負載的代理中驗證的 JWT 列表。有效的令牌將用於提取已驗證的身份。每個規則僅在令牌出現在規則識別的位置時才會啟動。令牌將根據 JWT 規則配置進行驗證。如果驗證失敗,請求將被拒絕。注意:不支援具有多個令牌(在不同位置)的請求,此類請求的輸出主體未定義。

JWTRule

JSON Web Token (JWT) 令牌格式,用於身份驗證,如 RFC 7519 所定義。請參閱 OAuth 2.0OIDC 1.0,了解如何在整個身份驗證流程中使用它。

範例

針對由 https://example.com 發行的 JWT 的規範,其中受眾聲明必須是 bookstore_android.apps.example.combookstore_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 的發行者。請參閱 發行者。具有不同 iss 聲明的 JWT 將被拒絕。

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

audiencesstring[]

允許存取的 JWT 受眾 列表。包含這些受眾中的任何一個的 JWT 都會被接受。

如果受眾為空,則服務名稱將被接受。

範例

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

供應商的公開金鑰集 URL,用於驗證 JWT 的簽名。請參閱 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 所在的標頭位置列表。例如,如果預期在 x-jwt-assertion 標頭中找到 JWT,並具有 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 的不同之處在於,它允許輸出個別聲明,而不是整個酬載。列表中每個操作中指定的標頭必須是唯一的。也支援字串/整數/布林類型的巢狀聲明。

  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

要複製的聲明名稱。僅支援字串/整數/布林類型的聲明。如果聲明不存在或聲明類型不受支援,則標頭將不會存在。

此資訊是否有用?
您是否有任何改進建議?

感謝您的回饋!