本小节演示如何去构建针对HTTP流量的授权。
1. 准备工作
读取授权概念
安装带有开启双向TLS的istio.
部署Bookinfo案例应用
2. 针对使用HTTP流量的工作流配置访问控制
使用Istio,您可以轻松地为网格中的工作负载设置访问控制。本任务向您展示如何使用Istio授权设置访问控制。首先,配置一个简单的拒绝所有策略,拒绝向工作负载发出的所有请求,然后逐渐地、增量地授予对工作负载的更多访问权。
- 运行以下命令在默认名称空间中创建一个拒绝所有策略。策略没有选择器字段,该字段将策略应用于默认名称空间中的每个工作负载。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:拒绝访问”。该错误显示配置的拒绝所有策略正在按预期工作,并且Istio没有任何规则允许对网格中的工作负载进行任何访问。
- 运行以下命令创建一个productpage-viewer策略,以允许使用GET方法访问productpage工作负载。该策略没有在规则中设置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示例”页面。但是,你可以在页面上看到以下错误:
- Error fetching product details
- Error fetching product reviews on the page.
这些错误是预料之中的,因为我们没有授予productpage工作负载对详细信息和检查工作负载的访问权限。接下来,您需要配置一个策略来授予对这些工作负载的访问权。
- 运行以下命令创建details-viewer策略,以允许productpage工作负载使用集群发出请求。cluster.local/ns/default/sa/bookinfo-productpage服务账号,通过GET方法访问详细工作负载:
$ 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工作负载使用集群发出请求。使用cluster.local/ns/default/sa/bookinfo-productpage服务账号,通过GET方法访问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
工作负载没有访问额定工作负载的权限。要修复这个问题,您需要将reviews
工作负载访问权限授予ratings
工作负载。接下来,我们配置一个策略来授予reviews
工作负载访问权限。
- 运行以下命令创建ratings-viewer策略,以允许审查工作负载使用集群cluster.local/ns/default/sa/bookinfo-reviews service账户发出请求,通过GET方法访问
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
使用浏览器访问http://$GATEWAY_URL/productpage
你应该在“Book Reviews” 部分看到”black”和“red” ratings.
3. 清空本实验
- 从你的配置文件中移除所有授权策略
$ 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