概述
授权策略(AuthorizationPolicy)提供全局、命名空间级工作负载级别的访问控制,支持工作负载之间及终端用户对网格内的工作负载的访问控制策略。
授权策略配置粒度
授权策略支持三种配置粒度,全局、命名空间和工作负载级;
- 当策略的命名空间为系统命名空间时(默认为istio-system),策略为全局生效;
- 当策略命名空间不是系统命名空间,且没有选择工作负载,策略将只在当前命名空间生效并覆盖全局策略;
- 当策略在非系统命名空间,且选择了工作负载,则只对指定工作负载生效。
下面的配置定义了对foo命名空间下的服务的授权策略:
- 请求方的service account是cluster.local/ns/default/sa/sleep或者命名空间是test。
- 只能对foo命名空间下的GET /info接口或者POST /data接口。
- 请求必须经过jwt认证,且iss必须是https://accounts.google.com。
- 其他情况全部拒绝访问。
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: httpbin
namespace: foo
spec:
action: ALLOW
rules:
- from:
- source:
principals: ["cluster.local/ns/default/sa/sleep"]
- source:
namespaces: ["test"]
to:
- operation:
methods: ["GET"]
paths: ["/info*"]
- operation:
methods: ["POST"]
paths: ["/data"]
when:
- key: request.auth.claims[iss]
values: ["https://accounts.google.com"]
创建授权策略
- 进入服务网格控制台,选择 网格安全中心 -> 授权策略,选择命名空间,列表页默认展示当前命名空间下的授权策略。
- 选择左上角 使用YAML创建,选择配置模板,编辑保存策略即可。
修改授权策略
- 进入服务网格控制台,选择 网格安全中心 -> 授权策略,选择命名空间,列表页默认展示当前命名空间下的授权策略。
- 选择右侧操作栏的修改,编辑保存策略即可。
删除授权策略
- 进入服务网格控制台,选择 网格安全中心 -> 授权策略,选择命名空间,列表页默认展示当前命名空间下的授权策略。
- 选择右侧操作栏的删除,即可删除选中的策略。
AuthorizationPolicy配置说明:
字段 | 类型 | 必选 | 说明 |
---|---|---|---|
selector | WorkloadSelector | No | 工作负载选择器,选择策略生效的工作负载。 |
rules | Rule | No | 一组匹配规则,至少匹配其中一个才认为是匹配; 1,规则列表为空时,默认不匹配。 2,当Action为ALLOW时,实际行为是所有的请求都被拒绝。 |
action | Action | No | 授权策略的行为,支持以下可选值: 1,ALLOW:如果匹配则允许访问,action默认值。 2,DENY:如果匹配则拒绝访问。 3,AUDIT:匹配的请求将被审计。 4,CUSTOM:使用外部授权服务对请求进行授权。 |
provider | ExtensionProvider (oneof) | No | 指定外部授权服务,需要跟action=CUSTOM时一起使用;引用MeshConfig中的extension provider。 |
Rule:定义具体的授权规则
字段 | 类型 | 必选 | 说明 |
---|---|---|---|
from | From | No | 请求源匹配。 |
to | To | No | 对目标的操作规则。 |
when | Condition | No | 其他匹配条件。 |
Source:对应From.source字段,定义请求源的匹配规则,所有条件是and关系(需要同时满足)
字段 | 类型 | 必选 | 说明 |
---|---|---|---|
principals | string | No | 匹配请求源端的SPIFFE信息,需要开启mTLS。 |
notPrincipals | string | No | 反向匹配请求源端的SPIFFE信息。 |
requestPrincipals | string | No | 匹配请求源jwt信息,格式为ISS/SUB,需要开启RequestAuthentication策略。 |
notRequestPrincipals | string | No | 反向匹配请求源jwt信息。 |
namespaces | string | No | 匹配请求源的命名空间,需要开启mTLS。 |
notNamespaces | string | No | 反向匹配请求源的命名空间。 |
ipBlocks | string | No | 匹配请求源的ip。 |
notIpBlocks | string | No | 反向匹配请求源的ip。 |
remoteIpBlocks | string | No | 匹配请求的X-Forwarded-For头部。 |
notRemoteIpBlocks | string | No | 反向匹配请求的X-Forwarded-For头部。 |
Operation:对应To.operation字段,定义了请求对目标端的操作信息
字段 | 类型 | 必选 | 说明 |
---|---|---|---|
hosts | string | No | 匹配请求的HTTP host,仅用于HTTP服务。 |
notHosts | string | No | 反向匹配请求的HTTP host。 |
ports | string | No | 匹配目标端口。 |
notPorts | string | No | 反向匹配目标端口。 |
methods | string | No | 匹配请求方法,仅用于HTTP服务。 |
notMethods | string | No | 反向匹配请求方法。 |
paths | string | No | 匹配请求路径,仅用于HTTP服务; 对于gRPC服务,路径为“/package.service/method”这种形式。 |
notPaths | string | No | 反向匹配请求路径。 |
Condition:定义了其他匹配条件
字段 | 类型 | 必选 | 说明 |
---|---|---|---|
key | string | Yes | 匹配的key。 |
values | string | No | Value匹配列表,values和notValues至少配置一个。 |
notValues | string | No | Value反向匹配列表,values和notValues至少配置一个。 |
说明存在多个授权策略的情况下优先匹配action=CUSTOM的策略,其次匹配action=DENY的策略,最后匹配action=ALLOW的策略,如果中间匹配到拒绝的场景,则拒绝请求,否则继续执行后续策略。