配置安全访问控制
本任务将演示如何通过使用Istio认证提供的服务账户,来安全地对服务做访问控制。
当Istio双向TLS认证打开时,服务器就会根据其证书来认证客户端,并从证书获取客户端的服务账户。服务账户在source.user
的属性中。请参考Istio auth identity了解Istio中服务账户的格式。
开始之前
根据quick start的说明在开启认证的Kubernetes中安装Istio。注意,应当在installation steps中的第四步开启认证。
部署BookInfo示例应用。
执行下列命令创建
bookinfo-productpage
服务账户,并重新部署productpage
服务及其服务账户。kubectl create -f <(istioctl kube-inject -f samples/bookinfo/kube/bookinfo-add-serviceaccount.yaml)
期望看到类似如下的输入:
serviceaccount "bookinfo-productpage" created
deployment "productpage-v1" configured
注意:如果使用
default
之外的命名空间,需要通过istioctl -n namespace ...
来指定命名空间。
使用denials做访问控制
在示例应用BookInfo中,productpage
服务会同时访问reviews
服务和details
服务。现在让details
服务拒绝来自productpage
服务的请求:
在浏览器中打开BookInfo的
productpage
(http://$GATEWAY_URL/productpage)页面。将会在页面左下部看到”Book Details”部分,包括了类型、页数、出版社等信息。
productpage
服务是从details
服务获取的”Book Details”信息。明确拒绝从
productpage
到details
的请求。执行下列命令来安装拒绝规则及对应的handler和实例。
istioctl create -f samples/bookinfo/kube/mixer-rule-deny-serviceaccount.yaml
将会看到类似下面的输出:
Created config denier/default/denyproductpagehandler at revision 2877836
Created config checknothing/default/denyproductpagerequest at revision 2877837
Created config rule/default/denyproductpage at revision 2877838
注意
denyproductpage
规则中的下述内容:match: destination.labels["app"] == "details" && source.user == "cluster.local/ns/default/sa/bookinfo-productpage"
匹配到了来自details服务上的服务账户 “spiffe://cluster.local/ns/default/sa/bookinfo-productpage“的请求。
注意: 如果使用
default
之外的命名空间,请在source.user
的值中使用自己的命名空间替换default
。该规则使用
denier
适配器来拒绝这些请求。适配器通常通过一个预先配置的状态码和消息来拒绝请求。状态码和消息是在denier适配器配置中指定的。在浏览器中刷新
productpage
页面。将会看到消息
“Error fetching product details! Sorry, product details are currently unavailable for this book.“
出现在页面的左下部分。这就验证了从
productpage
到details
的访问是被禁止的。
清除
清除mixer配置:
istioctl delete -f samples/bookinfo/kube/mixer-rule-deny-serviceaccount.yaml
如果不打算继续接下来的更多任务,可参考BookInfo cleanup的指南来关闭应用。