Istio 的授权功能为网格中的工作负载提供网格、命名空间和工作负载级别的访问控制。授权架构如下所示:
每个 Envoy 代理都运行一个授权引擎,该引擎在运行时授权请求。当请求到达代理时,授权引擎根据当前授权策略评估请求上下文,并返回授权结果 ALLOW 或 DENY。 运维人员使用 .yaml 文件指定 Istio 授权策略。需要注意:拒绝策略优先于允许策略。
授权策略配置规则如下所示:
要配置授权策略,请创建一个 AuthorizationPolicy 自定义资源。一个授权策略包括选择器(selector),动作(action) 和一个规则(rules)列表:
selector 字段指定策略的目标
action 字段指定允许还是拒绝请求
rules 指定何时触发动作
rules 下的 from 字段指定请求的来源
rules 下的 to 字段指定请求的操作
rules 下的 when 字段指定应用规则所需的条件
下面通过实际例子来看看AuthorizationPolicy的规则。这里要沿用上一篇博客在foo和bar namespace下面创建的httpbin和sleep服务。
案例一:允许所有请求的AuthorizationPolicy,spec中不配置任何规则,即允许所有请求。
kubectl apply -f - <<EOF
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: allow-nothing
namespace: foo
spec:
{}
EOF
创建该AuthorizationPolicy后,从bar.sleep访问foo.httpbin和foo.sleep访问foo.httpbin都能成功
kubectl exec "$(kubectl get pod -l app=sleep -n bar -o jsonpath={.items..metadata.name})" -c sleep -n bar -- curl http://httpbin.foo:8000/headers
kubectl exec "$(kubectl get pod -l app=sleep -n foo -o jsonpath={.items..metadata.name})" -c sleep -n foo -- curl http://httpbin.foo:8000/headers
案例二:创建另外一个AuthorizationPolicy, 只控制了rule/to即允许访问foo namespace下的httpbin的GET请求。故创建下面的Policy后,通过上面的命令访问仍然能访问成功。
kubectl apply -f - <<EOF
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"]
EOF
案例三:接着再创建一个定义了From的AuthorizationPolicy,允许bar namespace下的sa=sleep的来源访问foo下面的httpbin的GET请求。
kubectl apply -f - <<EOF
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"]
EOF
再次用上面的命令访问,可以看到如果用foo namespace下的sa访问提示access deny。
上面通过实际例子演示了如何通过配置AuthorizationPolicy来控制应用于应用间访问授权。更多AuthorizationPolicy的配置规则可查看官网信息。