执行授权策略
将您的应用程序添加到环境网格后,您可以使用第4层授权策略来保护应用程序访问。
此功能允许您根据自动颁发给网格中所有工作负载的客户端工作负载标识来控制对服务的访问。
实施第4层授权策略
让我们创建一个授权策略,限制哪些服务可以与productpage
服务通信。该策略应用于具有app: productpage
标签的 Pod,并且仅允许来自服务帐户cluster.local/ns/default/sa/bookinfo-gateway-istio
的调用。(这是您在上一步中部署的 Bookinfo 网关使用的服务帐户。)
$ kubectl apply -f - <<EOF
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
name: productpage-viewer
namespace: default
spec:
selector:
matchLabels:
app: productpage
action: ALLOW
rules:
- from:
- source:
principals:
- cluster.local/ns/default/sa/bookinfo-gateway-istio
EOF
如果您在浏览器中打开 Bookinfo 应用程序(https://127.0.0.1:8080/productpage
),您将看到产品页面,就像以前一样。但是,如果您尝试从不同的服务帐户访问productpage
服务,则应该会看到错误。
让我们尝试从curl
Pod 访问 Bookinfo 应用程序
$ kubectl apply -f samples/curl/curl.yaml
由于curl
Pod 使用不同的服务帐户,因此它将无法访问productpage
服务
$ kubectl exec deploy/curl -- curl -s "http://productpage:9080/productpage"
command terminated with exit code 56
实施第7层授权策略
要实施第7层策略,您首先需要一个针对命名空间的航点代理。此代理将处理进入命名空间的所有第7层流量。
$ istioctl waypoint apply --enroll-namespace --wait
waypoint default/waypoint applied
namespace default labeled with "istio.io/use-waypoint: waypoint"
您可以查看航点代理并确保其状态为Programmed=True
$ kubectl get gtw waypoint
NAME CLASS ADDRESS PROGRAMMED AGE
waypoint istio-waypoint 10.96.58.95 True 42s
添加L7 授权策略将显式允许curl
服务向productpage
服务发送GET
请求,但不会执行任何其他操作
$ kubectl apply -f - <<EOF
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
name: productpage-viewer
namespace: default
spec:
targetRefs:
- kind: Service
group: ""
name: productpage
action: ALLOW
rules:
- from:
- source:
principals:
- cluster.local/ns/default/sa/curl
to:
- operation:
methods: ["GET"]
EOF
请注意,targetRefs
字段用于指定航点代理的授权策略的目标服务。rules 部分与之前类似,但这次我们添加了to
部分来指定允许的操作。
确认新的航点代理正在实施更新的授权策略
$ # This fails with an RBAC error because we're not using a GET operation
$ kubectl exec deploy/curl -- curl -s "http://productpage:9080/productpage" -X DELETE
RBAC: access denied
$ # This fails with an RBAC error because the identity of the reviews-v1 service is not allowed
$ kubectl exec deploy/reviews-v1 -- curl -s http://productpage:9080/productpage
RBAC: access denied
$ # This works as we're explicitly allowing GET requests from the curl pod
$ kubectl exec deploy/curl -- curl -s http://productpage:9080/productpage | grep -o "<title>.*</title>"
<title>Simple Bookstore App</title>
后续步骤
有了航点代理,您现在可以在命名空间中实施第7层策略。除了授权策略之外,我们还可以使用航点代理在服务之间拆分流量。这在进行金丝雀部署或 A/B 测试时非常有用。