配置基础访问控制

下面的任务展示了如何使用Kubernetes标签来控制对一个服务的访问。

开始之前

  • 在Kubernetes上遵循安装指南部署 Istio。
  • 部署BookInfo 示例应用。
  • 设置基于版本的应用路由,用户“jason”对reviews服务的访问会被指向 v2 版本,其他用户则会访问到 v3 版本。

    1. istioctl create -f samples/bookinfo/kube/route-rule-reviews-test-v2.yaml
    2. istioctl 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服务的访问。

  1. 用浏览器访问BookInfo的productpage页面(http://$GATEWAY_URL/productpage)。

    如果使用 “jason” 用户登录,会看到ratings服务展示出的星星图标是黑色的,这证明被ratings服务是由 “v2” 版本的reviews服务调用的;如果登出或者使用其他用户登录,就会看到红色的星星,这代表 “v3” 版本的reviews服务在调用ratings服务。

  2. 显式的拒绝从v3版本reviews服务到ratings的访问。

    使用下列命令来创建Handler实例并拒绝规则:

    1. istioctl create -f samples/bookinfo/kube/mixer-rule-deny-label.yaml

    会产生类似的输出:

    1. Created config denier/default/denyreviewsv3handler at revision 2882105
    2. Created config checknothing/default/denyreviewsv3request at revision 2882106
    3. Created config rule/default/denyreviewsv3 at revision 2882107

    注意denyreviewsv3规则:

    1. match: destination.labels["app"] == "ratings" && source.labels["app"]=="reviews" && source.labels["version"] == "v3"

    代表从v3版本的reviews服务到ratings服务的请求。

    这一规则使用denier适配器来拒绝源于v3版本的reviews服务的请求。这一适配器会使用预置的状态码和消息来拒绝服务请求。状态码和消息的定义来自于
    denier适配器的配置。

  3. 在浏览器中刷新productpage

    如果没有登录、或使用 “jason” 之外的用户登录,因为ratings服务拒绝了来自reviews:v3的请求。

    而如果使用 “jason” 的身份登录(会使用reviews:v2),就会看到黑色的星星了。

使用whitelists进行访问控制

Istio还支持基于属性的黑名单和白名单。下面的白名单配置是跟上一节中的denier配置等价的。这一规则也会拒绝来自v3版本reviews服务的请求。

  1. 删除上一节加入的配置:

    1. istioctl delete -f samples/bookinfo/kube/mixer-rule-deny-label.yaml
  2. 验证未登录情况下对productpage的访问(http://$GATEWAY_URL/productpage),会看到红色星星。

    但是在执行下面的步骤之后,只有使用 “jason” 登录才能看到星星。

  3. 创建listchecker适配器,其中包含v1v2的列表。把下面的 YAML 文件保存为
    whitelist-handler.yaml

    1. apiVersion: config.istio.io/v1alpha2
    2. kind: listchecker
    3. metadata:
    4. name: whitelist
    5. spec:
    6. # providerUrl: ordinarily black and white lists are maintained
    7. # externally and fetched asynchronously using the providerUrl.
    8. overrides: ["v1", "v2"] # overrides provide a static list
    9. blacklist: false

    然后运行下列命令:

    1. istioctl create -f whitelist-handler.yaml
  4. 创建一个listentry模板的实例,用于解析版本标签。把下面的 YAML 代码保存为
    appversion-instance.yaml

    1. apiVersion: config.istio.io/v1alpha2
    2. kind: listentry
    3. metadata:
    4. name: appversion
    5. spec:
    6. value: source.labels["version"]

    接下来运行下列命令:

    1. istioctl create -f appversion-instance.yaml
  5. 启用whitelist来检查ratings服务。

    创建checkversion-rule.yaml

    1. apiVersion: config.istio.io/v1alpha2
    2. kind: rule
    3. metadata:
    4. name: checkversion
    5. spec:
    6. match: destination.labels["app"] == "ratings"
    7. actions:
    8. - handler: whitelist.listchecker
    9. instances:
    10. - appversion.listentry

    并运行下列命令:

    1. istioctl create -f checkversion-rule.yaml
  6. 验证,当未登录时访问Bookinfo productpagehttp://$GATEWAY_URL/productpage),则看不到星星。

    验证当用 “jason” 登录后,就会看到黑色的星星。

清理

  • 删除 Mixer 配置:

    1. istioctl delete -f checkversion-rule.yaml
    2. istioctl delete -f appversion-instance.yaml
    3. istioctl delete -f whitelist-handler.yaml
  • 删除应用路由规则:

    1. istioctl delete -f samples/bookinfo/kube/route-rule-reviews-test-v2.yaml
    2. istioctl delete -f samples/bookinfo/kube/route-rule-reviews-v3.yaml
  • 如果不准备进行下面的任务,可以参考BookInfo 清理进行善后工作。

延伸阅读