Denier 适配器以及黑白名单
本文任务展示了使用简单的 Denier 适配器,基于属性的黑白名单或者基于 IP 的黑白名单对服务进行访问控制的方法
开始之前
按照安装指南在 Kubernetes 集群上部署 Istio。
部署 Bookinfo 示例应用。
初始化版本路由,对目标为
reviews
服务的请求,来自用户 “jason” 的请求分配给v2
版本,其他用户的请求分配到v3
版本。$ kubectl apply -f @samples/bookinfo/networking/virtual-service-all-v1.yaml@
然后运行如下命令:
$ kubectl apply -f @samples/bookinfo/networking/virtual-service-reviews-jason-v2-v3.yaml@
简单的 Denier 适配器
在 Istio 环境里,可以使用 Mixer 中的任何属性来对服务进行访问控制。这是一种简易的访问控制,使用 Mixer 选择器来有条件的拒绝请求。
比如 Bookinfo 示例应用中 ratings
服务会被多个版本的 reviews
服务访问。我们尝试切断来自 reviews:v3
的访问。
用浏览器打开 Bookinfo 的
productpage
(http://$GATEWAY_URL/productpage
)。如果用 “jason” 的身份登录,就应该能看到每条 Review 都伴随着黑色的星形图标,这表明
ratings
服务是被reviews
服务的v2
版本调用的。但如果使用其他用户登录(或者未登录),就会看到伴随 Review 的是红色的星星图标,这种情况下
ratings
服务是被reviews
服务的v3
版本调用的。显式拒绝
reviews:v3
服务的调用。运行下列命令设置一条拒绝规则,其中包含了一个
handler
以及一个instance
。$ kubectl apply -f @samples/bookinfo/policy/mixer-rule-deny-label.yaml@
请注意
denyreviewsv3
规则中的以下内容:match: destination.labels["app"] == "ratings" && source.labels["app"]=="reviews" && source.labels["version"] == "v3"
这段表达式匹配的条件是,来自服务
reviews
,version
标签值为v3
的,目标为ratings
服务的请求。这条规则使用
denier
适配器拒绝来自reviews:v3
服务的请求。这个适配器会使用预定的状态码和消息拒绝请求。状态码和消息的定义可以参考 Denier 适配器的配置文档。在浏览器中刷新
productpage
页面。如果已经登出或者使用不是 “jason” 的用户身份登录,就无法看到评级图标了,这是因为
reviews:v3
服务对ratings
服务的访问已经被拒绝了。反之,如果使用 “jason” 用户登录,因为这一用户使用的是reviews:v2
的服务,不符合拒绝条件,所以还是能够看到黑色的星形图标。
基于属性的 whitelists 或者 blacklists
Istio 支持基于属性的黑名单和白名单。下面的白名单配置和前面的 Denier
配置是等价的——拒绝来自 reviews:v3
的请求。
删除前文配置的 Denier 规则。
$ kubectl delete -f @samples/bookinfo/policy/mixer-rule-deny-label.yaml@
如果您使用的是 Istio 1.1.2 或更早版本,请使用以下配置:
$ kubectl delete -f @samples/bookinfo/policy/mixer-rule-deny-label-crd.yaml@
校验,在没有登录的情况下访问 Bookinfo 的
productpage
(http://$GATEWAY_URL/productpage
),应该是看不到星形图标的;如果使用 “jason” 用户登录,则应该看到黑星图标。应用白名单版本
v1,v2
的list
适配器的配置:$ kubectl apply -f @samples/bookinfo/policy/mixer-rule-deny-whitelist.yaml@
校验,在没有登录的情况下访问 Bookinfo 的
productpage
(http://$GATEWAY_URL/productpage
),应该是看不到星形图标的;如果使用 “jason” 用户登录,则应该看到黑星图标。
基于 IP 的 whitelists or blacklists
Istio 支持基于 IP 的黑名单和白名单。你可以给 Istio 设置接受或拒绝来自特定 IP 或子网的请求。
确认您可以访问到 Bookinfo 的
productpage
http://$GATEWAY_URL/productpage
。应用以下规则后,您将无法访问它。给 list 适配器创建配置, 其中包含子网
"10.57.0.0\16"
。 将以下 YAML 代码段另存为whitelistip-handler.yaml
:$ kubectl apply -f @samples/bookinfo/policy/mixer-rule-deny-ip.yaml@
试着访问 Bookinfo 的
productpage
http://$GATEWAY_URL/productpage
并验证您是否收到类似于的错误:PERMISSION_DENIED:staticversion.istio-system:<your mesh source ip> is not whitelisted
清理
删除基于属性的白名单和黑名单的 Mixer 配置:
$ kubectl delete -f @samples/bookinfo/policy/mixer-rule-deny-whitelist.yaml@
如果您使用 Istio 1.1.2 或更早版本,请使用以下配置:
$ kubectl delete -f @samples/bookinfo/policy/mixer-rule-deny-whitelist-crd.yaml@
删除基于 IP 的白名单和黑名单的 Mixer 配置:
$ kubectl delete -f @samples/bookinfo/policy/mixer-rule-deny-ip.yaml@
如果您使用 Istio 1.1.2 或更早版本,请使用以下配置:
$ kubectl delete -f @samples/bookinfo/policy/mixer-rule-deny-ip-crd.yaml@
移除应用路由规则:
$ kubectl delete -f @samples/bookinfo/networking/virtual-service-all-v1.yaml@
移除应用目标规则:
$ kubectl delete -f @samples/bookinfo/networking/destination-rule-all.yaml@
如果启用了双向 TLS,则需要运行如下命令:
$ kubectl delete -f @samples/bookinfo/networking/destination-rule-all-mtls.yaml@
如果没有计划尝试后续任务,参考 Bookinfo 清理部分的介绍,关停示例应用。