执行授权策略

将您的应用程序添加到环境网格后,您可以使用第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 测试时非常有用。

这些信息是否有用?
您是否有任何改进建议?

感谢您的反馈!