请求认证(Request Authentication)
请求认证定义工作负载支持哪些请求身份验证方法。网关或Sidecar会根据配置的认证规则对请求进行认证。如果请求携带了非法的认证信息,则会被拒绝。一个请求如果没有包含任何认证信息也会通过认证,但不会获得认证过后的合法身份。如果要限制仅允许经过认证的请求通过,需要配合AuthorizationPolicy实现。本文介绍请求认证的配置示例和字段说明。
配置示例
示例一:限制所有httpbin的工作负载收到的请求必须携带JWT
apiVersion: security.istio.io/v1beta1
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/v1beta1
kind: AuthorizationPolicy
metadata:
name: httpbin
namespace: foo
spec:
selector:
matchLabels:
app: httpbin
rules:
- from:
- source:
requestPrincipals: ["*"]
示例二:限制default命名空间下的工作负载收到的请求必须携带JWT
apiVersion: security.istio.io/v1beta1
kind: RequestAuthentication
metadata:
name: req-authn-for-all
namespace: default
spec:
jwtRules:
- issuer: "issuer-foo"
jwksUri: https://example.com/.well-known/jwks.json
---
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: require-jwt-for-all
namespace: default
spec:
rules:
- from:
- source:
requestPrincipals: ["*"]
示例三:对于不同的Host允许携带不同的JWT
apiVersion: security.istio.io/v1beta1
kind: RequestAuthentication
metadata:
name: httpbin
namespace: foo
spec:
selector:
matchLabels:
app: httpbin
jwtRules:
- issuer: "issuer-foo"
- issuer: "issuer-bar"
---
apiVersion: security.istio.io/v1beta1
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"]
字段说明
RequestAuthentication
字段 | 类型 | 是否必须 | 说明 |
selector | 否 | 定义在当前命名空间中哪些工作负载应用当前配置。如果该配置存在于根命名空间(istio-system),selector将会匹配所有命名空间中的工作负载。如果未配置,selector将匹配到所有工作负载。 | |
jwtRules | 否 | 定义一个JWT规则列表,用于在指定工作负载上使用JWT规则进行验证。后续请求的有效身份将会从JWT中获取。只有当JWT出现在请求的指定位置时才会触发指定的规则。根据JWTRule中的配置对JWT进行验证时,如果验证失败,请求会被拒绝。 重要 不支持一个请求在多个位置携带不同的TOKEN。此类请求身份是未定义的。 |
JWTRule
JWT(JSON Web Token)用于身份验证,由RFC 7519定义。关于如何在认证流程中使用JWT,请参见OAuth 2.0和OIDC 1.0。
JWT示例 | 说明 |
| JWT需要 |
| 表示一个不在默认位置的Token。本示例Token在 |
字段 | 类型 | 是否必须 | 说明 |
issuer | string | 是 | 指定JWT的Issuer(签发者)。具有不同Issuer的JWT将会被拒绝。 |
audiences | string[] | 否 | JWT的audiences列表,表示允许这些audiences访问网格内的应用,否则将拒绝该请求。如果audiences为空,则不限制请求的audiences。 |
jwks | string | 是 | 用于JWT的JWKS。 |
fromHeaders | 否 | 期望JWT存在于哪些Header中。以下示例表示期望从
| |
fromParams | string | 否 | 期望JWT存在于哪些请求参数中。以下示例表示期望能通过
重要 当前不支持请求在不同的位置携带不同的JWT,否则请求的principal将是未定义的。 |
outputPayloadToHeader | string | 否 | 指定一个Header名称。如果一个JWT验证成功,验证过的信息将被添加该Header中,传递给上游服务。添加的信息格式是base64_encoded(jwt_payload_in_JSON)。如果未指定,则不会添加该Header。 |
forwardOriginalToken | bool | 否 | 默认为
|
JWTHeader
指定JWT所在的Header信息。
字段 | 类型 | 是否必须 | 说明 |
name | string | 是 | HTTP Header的名称。 |
prefix | string | 否 | 用于在请求中寻找Token。在解码Token之前,网关或Sidecar会去除这个前缀。例如
|