配置基础访问控制
下面的任务展示了如何使用 Kubernetes 标签来控制对一个服务的访问。
开始之前
- 在Kubernetes上遵循安装指南部署 Istio。
- 部署BookInfo 示例应用。
设置基于版本的应用路由,用户“jason”对
reviews服务的访问会被指向 v2 版本,其他用户则会访问到 v3 版本。istioctl create -f samples/bookinfo/kube/route-rule-reviews-test-v2.yamlistioctl create -f samples/bookinfo/kube/route-rule-reviews-v3.yaml
注意:如果在前面的任务中存在有冲突的规则,可以用
istiocl replace来替代istioctl create。注意:如果使用一个非
default的命名空间,需要使用istioctl -n namespace ...的方式来指定命名空间
使用denials进行访问控制
借助Istio能够根据Mixer中的任何属性来对一个服务进行访问控制。Mixer Selector可以进行对服务请求进行有条件的拒绝,这就构成了访问控制能力的基础。
BookInfo 示例应用中的ratings服务会被几个不同版本的reviews服务所访问。我们尝试切断reviews服务的v3版本对ratings服务的访问。
用浏览器访问BookInfo的
productpage页面(http://$GATEWAY_URL/productpage)。如果使用 “jason” 用户登录,会看到
ratings服务展示出的星星图标是黑色的,这证明被ratings服务是由 “v2” 版本的reviews服务调用的;如果登出或者使用其他用户登录,就会看到红色的星星,这代表 “v3” 版本的reviews服务在调用ratings服务。显式的拒绝从
v3版本reviews服务到ratings的访问。使用下列命令来创建Handler实例并拒绝规则:
istioctl create -f samples/bookinfo/kube/mixer-rule-deny-label.yaml
会产生类似的输出:
Created config denier/default/denyreviewsv3handler at revision 2882105Created config checknothing/default/denyreviewsv3request at revision 2882106Created config rule/default/denyreviewsv3 at revision 2882107
注意
denyreviewsv3规则:match: destination.labels["app"] == "ratings" && source.labels["app"]=="reviews" && source.labels["version"] == "v3"
代表从
v3版本的reviews服务到ratings服务的请求。这一规则使用
denier适配器来拒绝源于v3版本的reviews服务的请求。这一适配器会使用预置的状态码和消息来拒绝服务请求。状态码和消息的定义来自于 denier适配器的配置。在浏览器中刷新
productpage如果没有登录、或使用 “jason” 之外的用户登录,因为
ratings服务拒绝了来自reviews:v3的请求。而如果使用 “jason” 的身份登录(会使用
reviews:v2),就会看到黑色的星星了。
使用whitelists进行访问控制
Istio还支持基于属性的黑名单和白名单。下面的白名单配置是跟上一节中的denier配置等价的。这一规则也会拒绝来自v3版本reviews服务的请求。
删除上一节加入的配置:
istioctl delete -f samples/bookinfo/kube/mixer-rule-deny-label.yaml
验证未登录情况下对
productpage的访问(http://$GATEWAY_URL/productpage),会看到红色星星。但是在执行下面的步骤之后,只有使用 “jason” 登录才能看到星星。
创建
listchecker适配器,其中包含v1和v2的列表。把下面的 YAML 文件保存为whitelist-handler.yaml:apiVersion: config.istio.io/v1alpha2kind: listcheckermetadata:name: whitelistspec:# providerUrl: ordinarily black and white lists are maintained# externally and fetched asynchronously using the providerUrl.overrides: ["v1", "v2"] # overrides provide a static listblacklist: false
然后运行下列命令:
istioctl create -f whitelist-handler.yaml
创建一个
listentry模板的实例,用于解析版本标签。把下面的 YAML 代码保存为appversion-instance.yaml:apiVersion: config.istio.io/v1alpha2kind: listentrymetadata:name: appversionspec:value: source.labels["version"]
接下来运行下列命令:
istioctl create -f appversion-instance.yaml
启用
whitelist来检查ratings服务。创建
checkversion-rule.yaml:apiVersion: config.istio.io/v1alpha2kind: rulemetadata:name: checkversionspec:match: destination.labels["app"] == "ratings"actions:- handler: whitelist.listcheckerinstances:- appversion.listentry
并运行下列命令:
istioctl create -f checkversion-rule.yaml
验证,当未登录时访问Bookinfo
productpage(http://$GATEWAY_URL/productpage),则看不到星星。验证当用 “jason” 登录后,就会看到黑色的星星。
清理
删除 Mixer 配置:
istioctl delete -f checkversion-rule.yamlistioctl delete -f appversion-instance.yamlistioctl delete -f whitelist-handler.yaml
删除应用路由规则:
istioctl delete -f samples/bookinfo/kube/route-rule-reviews-test-v2.yamlistioctl delete -f samples/bookinfo/kube/route-rule-reviews-v3.yaml
如果不准备进行下面的任务,可以参考BookInfo 清理进行善后工作。
