授权策略
Istio 授权策略在网格中的工作负载上启用访问控制。
授权策略支持 CUSTOM、DENY 和 ALLOW 操作以进行访问控制。当 CUSTOM、DENY 和 ALLOW 操作同时用于工作负载时,首先评估 CUSTOM 操作,然后评估 DENY 操作,最后评估 ALLOW 操作。评估由以下规则确定
- 如果有任何与请求匹配的 CUSTOM 策略,则进行评估,如果评估结果为拒绝,则拒绝请求。
- 如果有任何与请求匹配的 DENY 策略,则拒绝请求。
- 如果工作负载没有 ALLOW 策略,则允许请求。
- 如果有任何与请求匹配的 ALLOW 策略,则允许请求。
- 拒绝请求。
Istio 授权策略还支持 AUDIT 操作以决定是否记录请求。AUDIT 策略不会影响请求是否被允许或拒绝访问工作负载。请求将仅根据 CUSTOM、DENY 和 ALLOW 操作来允许或拒绝。
如果工作负载上存在与请求匹配的 AUDIT 策略,则请求将在内部标记为应进行审计。必须配置和启用单独的插件才能实际执行审计决策并完成审计行为。如果未启用此类支持插件,则不会对请求进行审计。
以下是 Istio 授权策略的示例。
它将 action
设置为 ALLOW
以创建允许策略。默认操作为 ALLOW
,但明确在策略中指定是有益的。
它允许来自以下来源的请求:
- 服务帐户
cluster.local/ns/default/sa/sleep
或 - 命名空间
test
访问具有以下属性的工作负载:
GET
方法,路径前缀为/info
,或POST
方法,路径为/data
。
前提是请求具有由 https://127.0.0.1
发行的有效 JWT 令牌。
任何其他请求都将被拒绝。
apiVersion: security.istio.io/v1
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://127.0.0.1"]
以下示例将 action
设置为 DENY
以创建拒绝策略。它拒绝来自 dev
命名空间的请求,这些请求针对 foo
命名空间中所有工作负载的 POST
方法。
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
name: httpbin
namespace: foo
spec:
action: DENY
rules:
- from:
- source:
namespaces: ["dev"]
to:
- operation:
methods: ["POST"]
以下示例将 action
设置为 DENY
以创建拒绝策略。它拒绝 foo
命名空间中所有工作负载的端口 8080
上所有使用 POST
方法的请求。
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
name: httpbin
namespace: foo
spec:
action: DENY
rules:
- to:
- operation:
methods: ["POST"]
ports: ["8080"]
当此规则应用于 TCP 流量时,method
字段(以及所有基于 HTTP 的属性)无法处理。对于 DENY
规则,缺少的属性被视为匹配。这意味着上述示例中,端口 8080
上的所有 TCP 流量都将被拒绝。如果我们删除 ports
匹配项,则所有 TCP 流量都将被拒绝。因此,建议始终将 DENY
策略限定到特定端口,尤其是在使用 HTTP 属性时 针对 TCP 端口的授权策略。
以下授权策略将 action
设置为 AUDIT
。它将审计对路径前缀为 /user/profile
的所有 GET
请求。
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
namespace: ns1
name: anyname
spec:
selector:
matchLabels:
app: myapi
action: AUDIT
rules:
- to:
- operation:
methods: ["GET"]
paths: ["/user/profile/*"]
授权策略范围(目标)由“metadata/namespace”和可选的 selector
确定。
- “metadata/namespace”指示策略应用于哪个命名空间。如果设置为根命名空间,则策略将应用于网格中的所有命名空间。
- 工作负载
selector
可用于进一步限制策略的应用范围。
例如,以下授权策略应用于 foo
命名空间中的所有工作负载。它不允许任何操作,并有效地拒绝对 foo
命名空间中工作负载的所有请求。
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
name: allow-nothing
namespace: foo
spec:
{}
以下授权策略允许对 foo
命名空间中工作负载的所有请求。
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
name: allow-all
namespace: foo
spec:
rules:
- {}
以下授权策略应用于 bar
命名空间中包含标签 app: httpbin
的工作负载。它不允许任何操作,并有效地拒绝对所选工作负载的所有请求。
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
name: allow-nothing
namespace: bar
spec:
selector:
matchLabels:
app: httpbin
以下授权策略应用于网格中所有命名空间中包含标签 version: v1
的工作负载。(假设根命名空间配置为 istio-system
)。
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
name: allow-nothing
namespace: istio-system
spec:
selector:
matchLabels:
version: v1
以下示例演示了如何使用 实验性注释 istio.io/dry-run
设置授权策略,以便在不实际执行的情况下试运行策略。
试运行注释允许您在将授权策略应用于生产流量之前更好地了解其影响。这有助于降低因不正确的授权策略而导致生产流量中断的风险。有关更多信息,请参阅 试运行任务。
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
name: dry-run-example
annotations:
"istio.io/dry-run": "true"
spec:
selector:
matchLabels:
app: httpbin
action: DENY
rules:
- to:
- operation:
paths: ["/headers"]
AuthorizationPolicy
AuthorizationPolicy 启用对工作负载的访问控制。
规则
规则匹配来自一组源的请求,这些请求执行一组操作,这些操作受一组条件的约束。当至少一个源、一个操作和所有条件匹配请求时,就会发生匹配。空规则始终匹配。
规则中的任何字符串字段都支持精确匹配、前缀匹配、后缀匹配和存在匹配
- 精确匹配:
abc
将匹配值abc
。 - 前缀匹配:
abc*
将匹配值abc
和abcd
。 - 后缀匹配:
*abc
将匹配值abc
和xabc
。 - 存在匹配:
*
将在值不为空时匹配。
来源
Source 指定请求的源标识。源中的字段使用 AND 连接。
例如,以下源将在主体为 admin
或 dev
且命名空间为 prod
或 test
且 IP 不为 203.0.113.4
时匹配。
principals: ["admin", "dev"]
namespaces: ["prod", "test"]
notIpBlocks: ["203.0.113.4"]
操作
Operation 指定请求的操作。操作中的字段使用 AND 连接。
例如,以下操作将在主机具有后缀 .example.com
且方法为 GET
或 HEAD
且路径不具有前缀 /admin
时匹配。
hosts: ["*.example.com"]
methods: ["GET", "HEAD"]
notPaths: ["/admin*"]
条件
条件指定其他必需的属性。
AuthorizationPolicy.ExtensionProvider
Rule.From
From 包含来源列表。
Rule.To
To 包含操作列表。
AuthorizationPolicy.Action
Action 指定要采取的操作。
Name | 描述 |
---|---|
ALLOW | 仅当请求与规则匹配时才允许请求。这是默认类型。 |
DENY | 如果请求与任何规则匹配,则拒绝请求。 |
AUDIT | 如果请求与任何规则匹配,则审核请求。 |
CUSTOM | CUSTOM 操作允许扩展处理用户请求,如果匹配的规则计算结果为 true。扩展程序独立且在本地 ALLOW 和 DENY 操作之前进行评估。当一起使用时,如果所有操作都返回允许,则请求被允许,换句话说,扩展程序不能绕过 ALLOW 和 DENY 操作做出的授权决定。扩展程序的行为由 MeshConfig 中声明的命名提供程序定义。授权策略通过指定提供程序的名称来引用扩展程序。扩展程序的一个用例示例是与自定义外部授权系统集成,将其授权决定委托给它。 以下授权策略适用于入口网关,如果请求路径具有前缀
|