TCP 流量的授权

该任务向您展示了在 Istio 网格中如何为 TCP 流量设置 Istio 授权。您可以在授权概念页面中了解到关于 Istio 授权的更多信息。

开始之前

本文任务假定您已经:

部署完 Bookinfo 应用后,打开 http://$GATEWAY_URL/productpage 地址进入到 Bookinfo 图书页面。在该页面中,您可以看到如下模块:

  • 在页面的左下方是图书详情 (Book Detail) 模块,内容包括:图书类型、页数、出版社等信息。
  • 在页面的右下方是图书评价(Book Reviews) 模块。

每次刷新页面后,图书页面的书评模块会有不同的版本样式,在三种版本(红色星级、黑色星级、没有星级)之间轮换。

如果您在按照说明操作时未在浏览器中看到预期的输出,请在几秒钟后重试,因为缓存和其他传播开销可能会导致有些延迟。

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

配置 TCP 工作负载的访问控制

默认情况下,Bookinfo 示例应用只使用 HTTP 协议。为了演示 TCP 流量的授权,您需要将应用更新到使用 TCP 的版本。按照下面的步骤,部署 Bookinfo 应用示例,并且将 ratings 服务升级到 v2 版本,在该版本中会使用 TCP 调用后端 MongoDB 服务,然后将授权策略应用到 MongoDB 工作负载上。

  • 使用 bookinfo-ratings-v2 服务账户安装 ratings 工作负载的 v2 版本:

Zip

  1. $ kubectl apply -f @samples/bookinfo/platform/kube/bookinfo-ratings-v2.yaml@

Zip

  1. $ kubectl apply -f <(istioctl kube-inject -f @samples/bookinfo/platform/kube/bookinfo-ratings-v2.yaml@)
  • 创建适当的 destination rules:

Zip

  1. $ kubectl apply -f @samples/bookinfo/networking/destination-rule-all-mtls.yaml@

因为 virtual service 规则中引用的 subset 项依赖 destination rules,所以在添加 virtual service 规则之前先等待几秒钟以让 destination rules 传播生效。

  • 在 destination rules 传播生效后,更新 reviews 工作负载以只使用 v2 版本的 ratings 工作负载:

Zip

  1. $ kubectl apply -f @samples/bookinfo/networking/virtual-service-ratings-db.yaml@

在这一页面中,您会在 Book Reviews 模块中看到一条错误信息:“Ratings service is currently unavailable.”。这是因为我们现在用的是 v2 版本的 ratings 工作负载,但是我们还没有部署 MongoDB。

  • 部署 MongoDB 工作负载:

Zip

  1. $ kubectl apply -f @samples/bookinfo/platform/kube/bookinfo-db.yaml@

Zip

  1. $ kubectl apply -f <(istioctl kube-inject -f @samples/bookinfo/platform/kube/bookinfo-db.yaml@)

部署了 MongoDB 工作负载之后,在将授权配置为仅允许授权请求之前,我们需要为工作负载应用默认的 deny-all 策略,以确保默认情况下拒绝对 MongoDB 工作负载的所有请求。

  • 对 MongoDB 工作负载应用默认的 deny-all 策略:
  1. $ kubectl apply -f - <<EOF
  2. apiVersion: security.istio.io/v1beta1
  3. kind: AuthorizationPolicy
  4. metadata:
  5. name: deny-all
  6. spec:
  7. selector:
  8. matchLabels:
  9. app: mongodb
  10. EOF

打开 Bookinfo 的 productpage 页面(http://$GATEWAY_URL/productpage)。您会看到:

  • 页面左下角的 Book Details 中包含了书籍类型、页数以及出版商等信息。
  • 页面右下角的 Book Reviews 显示了错误信息:“Ratings service is currently unavailable”。在配置了默认拒绝所有请求之后,我们需要创建一个 bookinfo-ratings-v2 策略以允许来自 cluster.local/ns/default/sa/bookinfo-ratings-v2 服务账户在 27017 端口上对 MongoDB 工作负载的请求。我们授权给这个服务账户,是因为来自 ratings-v2 工作负载的请求都用的是 cluster.local/ns/default/sa/bookinfo-ratings-v2 服务账户发出的。
  • 为来自 cluster.local/ns/default/sa/bookinfo-ratings-v2 服务账户的 TCP 流量增强工作负载级别的访问控制:
  1. $ kubectl apply -f - <<EOF
  2. apiVersion: security.istio.io/v1beta1
  3. kind: AuthorizationPolicy
  4. metadata:
  5. name: bookinfo-ratings-v2
  6. spec:
  7. selector:
  8. matchLabels:
  9. app: mongodb
  10. rules:
  11. - from:
  12. - source:
  13. principals: ["cluster.local/ns/default/sa/bookinfo-ratings-v2"]
  14. to:
  15. - operation:
  16. ports: ["27017"]
  17. EOF

打开 Bookinfo 的 productpage 页面(http://$GATEWAY_URL/productpage),您现在应该看到以下各节按预期工作:

  • 页面左下角的 Book Details 中包含了书籍类型、页数以及出版商等信息。
  • 页面右下角的 Book Reviews 显示了红色星级的书评。恭喜! 您已经成功部署了通过 TCP 流量进行通信的工作负载,并应用了网格级别和工作负载级别的授权策略来对请求实施访问控制。

清理

  • 删除 Istio 授权策略配置:
  1. $ kubectl delete authorizationpolicy.security.istio.io/deny-all
  2. $ kubectl delete authorizationpolicy.security.istio.io/bookinfo-ratings-v2
  • 删除 v2 版本的 ratings 工作负载和 MongoDB 的 deployment:

ZipZipZipZip

  1. $ kubectl delete -f @samples/bookinfo/platform/kube/bookinfo-ratings-v2.yaml@
  2. $ kubectl delete -f @samples/bookinfo/networking/destination-rule-all-mtls.yaml@
  3. $ kubectl delete -f @samples/bookinfo/networking/virtual-service-ratings-db.yaml@
  4. $ kubectl delete -f @samples/bookinfo/platform/kube/bookinfo-db.yaml@

相关内容

HTTP 流量授权

展示如何设置基于角色的 HTTP 流量访问控制。

安全

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

授权策略信任域迁移

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

基于 Istio 授权的 Micro-Segmentation

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

Istio v1beta1 授权策略概述

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

基于组和列表声明的授权

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