HTTP 流量授权
该任务向您展示了如何在 Istio 网格中为 HTTP 流量设置授权。可在授权概念页面了解更多内容。
开始之前
本任务假设你已经:
阅读了授权概念。
遵照 Istio 安装指南安装完成 Istio 并启用了双向 TLS。
部署了 Bookinfo 示例应用。
部署 Bookinfo 应用后通过 http://$GATEWAY_URL/productpage
访问 product 页面,可以看到如下内容:
- Book Details 在左下方,包括:图书类型,页数,出版社等。
- Book Reviews 在页面右下方。
当刷新页面时,应用会在 product 页面中以轮询的方式显示不同版本的评论:如红色星标,黑色星标,或者没有星标。
为 HTTP 流量的工作负载配置访问控制
使用 Istio,您可以轻松地为网格中的workloads设置访问控制。本任务向您展示如何使用 Istio 授权设置访问控制。首先,配置一个简单的 deny-all
策略,来拒绝工作负载的所有请求,然后逐渐地、增量地授予对工作负载更多的访问权。
运行下面的命令在
default
命名空间里创建一个deny-all
策略。该策略没有selector
字段,它会把策略应用于default
命名空间中的每个工作负载。spec:
字段为空值{}
,意思是不允许任何流量,有效地拒绝所有请求。$ kubectl apply -f - <<EOF apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: deny-all namespace: default spec: {} EOF
打开浏览器访问 Bookinfo 的
productpage
(http://$GATEWAY_URL/productpage
) 页面。你将会看到"RBAC: access denied"
。该错误表明配置的deny-all
策略按期望生效了,并且 Istio 没有任何规则允许对网格中的工作负载进行任何访问。运行下面的命令创建一个
productpage-viewer
策略以容许通过GET
方法访问productpage
工作负载。该策略没有在rules
中设置from
字段,这意味着所有的请求源都被容许访问,包括所有的用户和工作负载:$ kubectl apply -f - <<EOF apiVersion: "security.istio.io/v1beta1" kind: "AuthorizationPolicy" metadata: name: "productpage-viewer" namespace: default spec: selector: matchLabels: app: productpage rules: - to: - operation: methods: ["GET"] EOF
在浏览器里访问 Bookinfo 的
productpage
(http://$GATEWAY_URL/productpage
)。你将看到 “Bookinfo Sample” 页面,但会发现页面中有如下的错误:Error fetching product details
Error fetching product reviews
这些错误是预期的,因为我们没有授权
productpage
工作负载去访问details
和reviews
工作负载。接下来,你需要配置一个策略来容许访问其他工作负载。运行下面的命令创建一个
details-viewer
策略以容许productpage
工作负载以GET
方式,通过使用cluster.local/ns/default/sa/bookinfo-productpage
ServiceAccount 去访问details
工作负载:$ kubectl apply -f - <<EOF apiVersion: "security.istio.io/v1beta1" kind: "AuthorizationPolicy" metadata: name: "details-viewer" namespace: default spec: selector: matchLabels: app: details rules: - from: - source: principals: ["cluster.local/ns/default/sa/bookinfo-productpage"] to: - operation: methods: ["GET"] EOF
运行下面的命令创建一个
reviews-viewer
策略以容许productpage
工作负载以GET
方式,通过使用cluster.local/ns/default/sa/bookinfo-productpage
ServiceAccount 去访问reviews
工作负载:$ kubectl apply -f - <<EOF apiVersion: "security.istio.io/v1beta1" kind: "AuthorizationPolicy" metadata: name: "reviews-viewer" namespace: default spec: selector: matchLabels: app: reviews rules: - from: - source: principals: ["cluster.local/ns/default/sa/bookinfo-productpage"] to: - operation: methods: ["GET"] 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
工作负载:$ kubectl apply -f - <<EOF apiVersion: "security.istio.io/v1beta1" kind: "AuthorizationPolicy" metadata: name: "ratings-viewer" namespace: default spec: selector: matchLabels: app: ratings rules: - from: - source: principals: ["cluster.local/ns/default/sa/bookinfo-reviews"] to: - operation: methods: ["GET"] EOF
在浏览器访问 Bookinfo
productpage
(http://$GATEWAY_URL/productpage
)。你会在 “Book Reviews” 部分看到“黑色”和“红色”评分。恭喜! 您成功地应用了授权策略为使用 HTTP 流量的工作负载进行了访问控制。
清除
从你的配置中删除所有的授权策略:
$ kubectl delete authorizationpolicy.security.istio.io/deny-all $ kubectl delete authorizationpolicy.security.istio.io/productpage-viewer $ kubectl delete authorizationpolicy.security.istio.io/details-viewer $ kubectl delete authorizationpolicy.security.istio.io/reviews-viewer $ kubectl delete authorizationpolicy.security.istio.io/ratings-viewer