HTTP 流量授权

该任务向您展示了如何在 Istio 网格中为 HTTP 流量设置授权。可在授权概念页面了解更多内容。

开始之前

本任务假设你已经:

部署 Bookinfo 应用后通过 http://$GATEWAY_URL/productpage 访问 product 页面,可以看到如下内容:

  • Book Details 在左下方,包括:图书类型,页数,出版社等。
  • Book Reviews 在页面右下方。

当刷新页面时,应用会在 product 页面中以轮询的方式显示不同版本的评论:如红色星标,黑色星标,或者没有星标。

如果没有在浏览器中看到预期的输出,请过几秒钟重试,因为缓存和其他传输开销会导致一些延迟。

此任务需要启用双向 TLS,因为以下示例使用策略中的主体和命名空间。

为 HTTP 流量的工作负载配置访问控制

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

  • 运行下面的命令在 default 命名空间里创建一个 deny-all 策略。该策略没有 selector 字段,它会把策略应用于 default 命名空间中的每个工作负载。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: access denied"。该错误表明配置的 deny-all 策略按期望生效了,并且 Istio 没有任何规则允许对网格中的工作负载进行任何访问。

  • 运行下面的命令创建一个 productpage-viewer 策略以容许通过 GET 方法访问 productpage 工作负载。该策略没有在 rules 中设置 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 Sample” 页面,但会发现页面中有如下的错误:

  • Error fetching product details
  • Error fetching product reviews这些错误是预期的,因为我们没有授权 productpage 工作负载去访问 detailsreviews 工作负载。接下来,你需要配置一个策略来容许访问其他工作负载。
  • 运行下面的命令创建一个 details-viewer 策略以容许 productpage 工作负载以 GET 方式,通过使用 cluster.local/ns/default/sa/bookinfo-productpage ServiceAccount 去访问 details 工作负载:
  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
  • 运行下面的命令创建一个 reviews-viewer 策略以容许 productpage 工作负载以 GET 方式,通过使用 cluster.local/ns/default/sa/bookinfo-productpage ServiceAccount 去访问 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 工作负载没有权限访问 ratings 工作负载。为修复这个问题,你需要授权 reviews 工作负载可以访问 ratings 工作负载。下一步我们配置一个策略来容许 reviews 工作负载访问。

  • 运行下面的命令创建一个 ratings-viewer 策略以容许 reviews 工作负载以 GET 方式,通过使用 cluster.local/ns/default/sa/bookinfo-reviews ServiceAccount 去访问 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

在浏览器访问 Bookinfo productpage (http://$GATEWAY_URL/productpage)。你会在 “Book Reviews” 部分看到“黑色”和“红色”评分。

恭喜! 您成功地应用了授权策略为使用 HTTP 流量的工作负载进行了访问控制。

清除

  • 从你的配置中删除所有的授权策略:
  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

相关内容

TCP 流量的授权

展示如何设置 TCP 流量的访问控制。

安全

描述 Istio 的授权与鉴权功能。

授权策略信任域迁移

阐述如何在不更改授权策略的前提下从一个信任域迁移到另一个。

基于 Istio 授权的 Micro-Segmentation

描述 Istio 的授权功能以及如何在各种用例中使用它。

Istio v1beta1 授权策略概述

Istio v1beta1 授权策略的设计原则、基本概述及迁移操作。

基于组和列表声明的授权

有关如何在 Istio 中配置基于组的授权和列表类型声明的授权的教程。