概述
授权策略(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 |
一组匹配规则,至少匹配其中一个才认为是匹配; 规则列表为空时,默认不匹配;当Action为ALLOW时,实际行为是所有的请求都被拒绝 |
action |
Action |
No |
授权策略的行为,支持以下可选值: ALLOW:如果匹配则允许访问,action默认值 DENY:如果匹配则拒绝访问 AUDIT:匹配的请求将被审计 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的策略,如果中间匹配到拒绝的场景,则拒绝请求,否则继续执行后续策略。