请求认证

请求认证

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 成为请求的必备条件。
  • VirtualService 用于根据“sub”声明路由请求。
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: Gatewaygroup: gateway.networking.k8s.io,位于同一命名空间中。
  • kind: Servicegroup: ""group: "core",位于同一命名空间中。此类型仅支持用于路标。

如果未设置,则策略将根据选择器进行应用。最多只能设置选择器和 targetRefs 中的一个。

注意:如果您在 Istio 1.22 之前的多版本环境中使用 targetRefs 字段,则强烈建议您通过 istio.io/rev 标签将策略固定到运行 1.22+ 的版本上。这样做是为了防止连接到旧控制平面(不知道 targetRefs 字段)的代理在升级过程中将策略误解为命名空间范围的策略。

注意:路标代理需要使用此字段才能使策略生效;将忽略 selector 策略。

jwtRulesJWTRule[]

定义可以在选定的工作负载代理处验证的 JWT 列表。有效的令牌将用于提取已认证的身份。每个规则仅在令牌出现在规则识别的位置时才会激活。令牌将根据 JWT 规则配置进行验证。如果验证失败,则将拒绝请求。注意:不支持具有多个令牌(在不同位置)的请求,此类请求的输出主体未定义。

JWTRule

用于身份验证的 JSON Web 令牌 (JWT) 令牌格式,如 RFC 7519 中所定义。有关如何在整个身份验证流程中使用此格式,请参阅 OAuth 2.0OIDC 1.0

示例

https://example.com 发行的 JWT 的规范,其中受众声明必须是 bookstore_android.apps.example.combookstore_web.apps.example.com。令牌应显示在 Authorization 标头中(默认)。JSON Web 密钥集 (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 受众 列表。包含任何这些受众的 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 密钥集。请参阅 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 不同,因为它允许输出单个声明而不是整个负载。列表中每个操作中指定的标头必须是唯一的。还支持字符串/整数/布尔类型的嵌套声明。

  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>,prefix=Bearer 后跟一个空格。如果标头没有此确切的前缀,则将其视为无效。

ClaimToHeader

此消息指定将声明复制到标头的详细信息。

字段类型描述必填
headerstring

要创建的标头名称。如果请求中已存在此标头,则将覆盖它。

claimstring

要从中复制的声明名称。仅支持字符串/整数/布尔类型的声明。如果声明不存在或声明类型不受支持,则标头将不存在。

此信息是否有用?
您是否有任何改进建议?

感谢您的反馈!