本小节演示如何去构建针对HTTP流量的授权。

1. 准备工作

  • 读取授权概念

  • 安装带有开启双向TLS的istio.

  • 部署Bookinfo案例应用

2. 针对使用HTTP流量的工作流配置访问控制

使用Istio,您可以轻松地为网格中的工作负载设置访问控制。本任务向您展示如何使用Istio授权设置访问控制。首先,配置一个简单的拒绝所有策略,拒绝向工作负载发出的所有请求,然后逐渐地、增量地授予对工作负载的更多访问权。

  1. 运行以下命令在默认名称空间中创建一个拒绝所有策略。策略没有选择器字段,该字段将策略应用于默认名称空间中的每个工作负载。spec:策略字段的值为空{}。这个值意味着不允许任何流量,有效地拒绝了所有请求。
  1. $ kubectl apply -f - <<EOF
  2. apiVersion: security.istio.io/v1beta1
  3. kind: AuthorizationPolicy
  4. metadata:
  5. name: deny-all
  6. namespace: default
  7. spec:
  8. {}
  9. EOF

将浏览器指向Bookinfo productpage (http://$GATEWAY_URL/productpage)。您应该看到“RBAC:拒绝访问”。该错误显示配置的拒绝所有策略正在按预期工作,并且Istio没有任何规则允许对网格中的工作负载进行任何访问。

  1. 运行以下命令创建一个productpage-viewer策略,以允许使用GET方法访问productpage工作负载。该策略没有在规则中设置from字段,这意味着允许所有源,有效地允许所有用户和工作负载:
  1. $ kubectl apply -f - <<EOF
  2. apiVersion: "security.istio.io/v1beta1"
  3. kind: "AuthorizationPolicy"
  4. metadata:
  5. name: "productpage-viewer"
  6. namespace: default
  7. spec:
  8. selector:
  9. matchLabels:
  10. app: productpage
  11. rules:
  12. - to:
  13. - operation:
  14. methods: ["GET"]
  15. EOF

将浏览器指向Bookinfo productpage (http://$GATEWAY_URL/productpage)。现在您应该看到“Bookinfo示例”页面。但是,你可以在页面上看到以下错误:

  • Error fetching product details
  • Error fetching product reviews on the page.

这些错误是预料之中的,因为我们没有授予productpage工作负载对详细信息和检查工作负载的访问权限。接下来,您需要配置一个策略来授予对这些工作负载的访问权。

  1. 运行以下命令创建details-viewer策略,以允许productpage工作负载使用集群发出请求。cluster.local/ns/default/sa/bookinfo-productpage服务账号,通过GET方法访问详细工作负载:
  1. $ kubectl apply -f - <<EOF
  2. apiVersion: "security.istio.io/v1beta1"
  3. kind: "AuthorizationPolicy"
  4. metadata:
  5. name: "details-viewer"
  6. namespace: default
  7. spec:
  8. selector:
  9. matchLabels:
  10. app: details
  11. rules:
  12. - from:
  13. - source:
  14. principals: ["cluster.local/ns/default/sa/bookinfo-productpage"]
  15. to:
  16. - operation:
  17. methods: ["GET"]
  18. EOF
  1. 运行以下命令创建一个策略reviews-viewer,以允许productpage工作负载使用集群发出请求。使用cluster.local/ns/default/sa/bookinfo-productpage服务账号,通过GET方法访问reviews工作负载:
  1. $ kubectl apply -f - <<EOF
  2. apiVersion: "security.istio.io/v1beta1"
  3. kind: "AuthorizationPolicy"
  4. metadata:
  5. name: "reviews-viewer"
  6. namespace: default
  7. spec:
  8. selector:
  9. matchLabels:
  10. app: reviews
  11. rules:
  12. - from:
  13. - source:
  14. principals: ["cluster.local/ns/default/sa/bookinfo-productpage"]
  15. to:
  16. - operation:
  17. methods: ["GET"]
  18. EOF

将浏览器指向Bookinfo productpage (http://$GATEWAY_URL/productpage)。现在,您应该会看到“Bookinfo Sample”页面,其中“Book Details”位于页面的左下角,“Book Reviews”位于页面的右下角。然而,在“Book Reviews”部分,有一个错误评Ratings service currently unavailable

这是因为reviews工作负载没有访问额定工作负载的权限。要修复这个问题,您需要将reviews工作负载访问权限授予ratings工作负载。接下来,我们配置一个策略来授予reviews工作负载访问权限。

  1. 运行以下命令创建ratings-viewer策略,以允许审查工作负载使用集群cluster.local/ns/default/sa/bookinfo-reviews service账户发出请求,通过GET方法访问ratings工作负载
  1. $ kubectl apply -f - <<EOF
  2. apiVersion: "security.istio.io/v1beta1"
  3. kind: "AuthorizationPolicy"
  4. metadata:
  5. name: "ratings-viewer"
  6. namespace: default
  7. spec:
  8. selector:
  9. matchLabels:
  10. app: ratings
  11. rules:
  12. - from:
  13. - source:
  14. principals: ["cluster.local/ns/default/sa/bookinfo-reviews"]
  15. to:
  16. - operation:
  17. methods: ["GET"]
  18. EOF

使用浏览器访问http://$GATEWAY_URL/productpage 你应该在“Book Reviews” 部分看到”black”和“red” ratings.

3. 清空本实验

  1. 从你的配置文件中移除所有授权策略
  1. $ kubectl delete authorizationpolicy.security.istio.io/deny-all
  2. $ kubectl delete authorizationpolicy.security.istio.io/productpage-viewer
  3. $ kubectl delete authorizationpolicy.security.istio.io/details-viewer
  4. $ kubectl delete authorizationpolicy.security.istio.io/reviews-viewer
  5. $ kubectl delete authorizationpolicy.security.istio.io/ratings-viewer