基于Istio的授权
每个envoy代理都运行一个授权引擎,该引擎在运行时授权请求。
- 当请求到达代理时,授权引擎根据当前授权策略评估请求上下文,并返回授权结果ALLOW或DENY。
- 授权策略支持ALLOW或DENY动作,拒绝策略优先于允许策略。
- 如果将任何允许策略应用于工作负载,则默认情况下,不符合该策略的访问都将被禁止。
授权策略
selector字段指定策略的目标
action字段指定允许还是拒绝请求
rules指定何时触发动作
- rules下的from字段指定请求的来源
- rules下的to字段指定请求的操作
- rules下的when字段指定应用规则所需的条件
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: "httpbin-viewer"
namespace: foo
spec:
selector:
matchLabels:
app: httpbin
action: ALLOW
rules:
- from:
- source:
principals: ["cluster.local/ns/bar/sa/sleep"]
to:
- operation:
methods: ["GET"]
when:
- key: request.auth.claims
values: ["https://accounts.google.com"]
策略目标
- 可以通过metadata/namespace字段和可选的selector字段来指定策略的范围和目标
- metadata/namespace告诉策略适用于哪个命名空间。如果将其值设置为根名称空间,则该策略将用于网格中的所有名称空间。
- 根命名空间的值时可配置的,默认值为istio-system
- 可以使用selector字段来进一步限制策略以应用于特定工作负载。
- 如果未设置,则授权策略将应用于与授权策略相同的命名空间中的所有工作负载。
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: "httpbin-viewer"
namespace: foo
spec:
selector:
matchLabels:
app: httpbin
action: ALLOW
rules:
- to:
- operation:
methods: ["GET"]
值匹配
授权策略中的大多数字段都支持以下所有匹配模式:
- 完全匹配: 即完整的字符串匹配
- 前缀匹配: “*”结尾的字符串。例如, “test.abc.*”匹配“test.abc.com”、“test.abc.cn”
- 后缀匹配: “*”开头的字符串。例如, “*.abc.com”匹配“test.abc.com”、“test1.abc.com”
- 存在匹配: * 用于指定非空的任意内容,可以使用格式filedname:[“*”]指定必须存在的字段,这意味着该字段可以匹配任意内容,但是不能为空
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: "httpbin-viewer"
namespace: foo
spec:
selector:
matchLabels:
app: httpbin
action: ALLOW
rules:
- to:
- operation:
paths: ["/test/*", "*/info"]
全部允许和默认全部拒绝授权策略
允许完全访问default命名空间中的所有工作负载
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: allow-all
namespace: default
spec:
action: ALLOW
rules:
- {}
不允许任何对admin命令空间工作负载的访问
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: deny-all
namespace: admin
spec:
{}
认证与未认证身份
如果要使工作负载可公开访问,则需要将source部分留空
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: "httpbin-viewer"
namespace: foo
spec:
selector:
matchLabels:
app: httpbin
version: v1
action: ALLOW
rules:
- to:
- operation:
methods: ["GET", "POST"]
将principal设置为"*" 代表仅允许经过认证的用户
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: "httpbin-viewer"
namespace: foo
spec:
selector:
matchLabels:
app: httpbin
version: v1
action: ALLOW
rules:
- from:
- source:
principals: ["*"]
- to:
- operation:
methods: ["GET", "POST"]
在普通TCP协议上使用istio授权
如果您授权策略中对TCP工作负载使用了任何只适用于HTTP的字段,istio将会忽略它们
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: "httpbin-viewer"
namespace: foo
spec:
selector:
matchLabels:
app: httpbin
action: ALLOW
rules:
- from:
- source:
principals: ["cluster.local/ns/default/sa/http-bin-v2"]
- to:
- operation:
ports: ["8080"]