AuthorizationPolicy
(授权策略)实现了对网格中工作负载的访问控制。
授权策略支持访问控制的 CUSTOM
、DENY
和 ALLOW
操作。当 CUSTOM
、DENY
和 ALLOW
动作同时用于一个工作负载时,首先评估 CUSTOM
动作,然后是 DENY
动作,最后是 ALLOW
动作。评估是按以下顺序进行:
- 如果有任何
CUSTOM
策略与请求相匹配,如果评估结果为拒绝,则拒绝该请求。 - 如果有任何
DENY
策略与请求相匹配,则拒绝该请求。 - 如果没有适合该工作负载的
ALLOW
策略,允许该请求。 - 如果有任何
ALLOW
策略与该请求相匹配,允许该请求。 - 拒绝该请求。
Istio 授权策略还支持 AUDIT
动作,以决定是否记录请求。AUDIT
策略不影响请求是否被允许或拒绝到工作负载。请求将完全基于 CUSTOM
、DENY
和 ALLOW
动作被允许或拒绝。
如果工作负载上有一个与请求相匹配的 AUDIT 策略,则请求将被内部标记为应该被审计。必须配置并启用一个单独的插件,以实际履行审计决策并完成审计行为。如果没有启用这样的支持插件,该请求将不会被审计。目前,唯一支持的插件是 Stackdriver 插件。
下面是一个 Istio 授权策略的例子。
它将 action
设置为 ALLOW
来创建一个允许策略。默认动作是 ALLOW
,但在策略中明确规定是很有用的。
它允许请求来自:
- 服务账户
cluster.local/ns/default/sa/sleep
或 - 命名空间
test
来访问以下工作负载:
- 在前缀为
/info
的路径上使用GET
方法,或者 - 在路径
/data
上使用POST
方法
且当请求具有由 https://accounts.google.com
发布的有效 JWT 令牌时。
任何其他请求将被拒绝。
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"]
下面是另一个例子,它将 action
设置为 DENY
以创建一个拒绝策略。它拒绝来自 dev
命名空间对 foo
命名空间中所有工作负载的 POST
请求。
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: httpbin
namespace: foo
spec:
action: DENY
rules:
- from:
- source:
namespaces: ["dev"]
to:
- operation:
methods: ["POST"]
下面的授权策略将 action
设置为 AUDIT
。它将审核任何对前缀为 /user/profile
的路径的 GET 请求。
apiVersion: security.istio.io/v1beta1
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
可以用来进一步限制策略的适用范围。
例如,以下授权策略适用于 bar
命名空间中包含标签 app: httpbin
的工作负载。
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: policy
namespace: bar
spec:
selector:
matchLabels:
app: httpbin
以下授权策略适用于命名空间 foo
中的所有工作负载。
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: policy
namespace: foo
spec:
{}
以下授权策略适用于网格中所有命名空间中包含标签 version: v1
的工作负载(假设根命名空间被配置为 istio-config
)。
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: policy
namespace: istio-config
spec:
selector:
matchLabels:
version: v1
- 关于
AuthorizationPolicy
配置的详细用法请参考 Istio 官方文档。 - 关于认证策略条件的详细配置请参考 Istio 官方文档。