Denials 和黑白名单

此任务说明了如何使用简单的 denials、基于属性的黑白名单、基于 IP 的黑白名单来控制对服务的访问。

开始之前

  • 请按照此安装指南中的说明,在 Kubernetes 上安装 Istio。

  • 部署 Bookinfo 样例应用。

  • 初始化直接访问 reviews 服务的应用程序的版本路由请求,对于测试用户 “jason” 的请求直接指定到 v2 版本,其他用户的请求指定到 v3 版本。

    Zip
    $ kubectl apply -f @samples/bookinfo/networking/virtual-service-all-v1.yaml@
    

    然后执行以下命令:

    Zip
    $ kubectl apply -f @samples/bookinfo/networking/virtual-service-reviews-jason-v2-v3.yaml@
    

简单的 denials

通过 Istio 您可以根据 Mixer 中可用的任意属性来控制对服务的访问。 这种简单形式的访问控制是基于 Mixer 选择器的条件拒绝请求功能实现的。

考虑 Bookinfo 示例应用,其中 ratings 服务可通过 reviews 服务的多个版本进行访问。 我们想切断对 reviews 服务 v3 版本的访问。

  1. 将浏览器定位到 Bookinfo productpage (http://$GATEWAY_URL/productpage)。

    如果您以 “jason” 用户身份登录,则每个评论都应看到黑色的星标, 它表示 ratings 服务是通过 “v2” 版本 reviews 服务访问到的。

    如果您以其他任何用户身份登录(或登出),则每个评论都应看到红色的星标, 它表示 ratings 服务是通过 “v3” 版本 reviews 服务访问到的。

  2. 要想明确地拒绝对 v3 版本 reviews 服务的访问。

    连同处理程序和实例,执行以下命令来配置拒绝规则。

    Zip
    $ 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"
    

    它将带有 v3 标签的 reviews 工作负载请求与 ratings 工作负载进行匹配。

    该规则通过使用 denier 适配器来拒绝 v3 版本 reviews 服务的请求。 适配器始终拒绝带有预配置状态码和消息的请求。 状态码和消息在 denier 适配器配置中指定。

  3. 在浏览器里刷新 productpage

    如果您已登出或以非 “json” 用户登录,因为v3 reviews 服务已经被拒绝访问 ratings 服务,所以您不会再看到红色星标。 相反,如果您以 “json” 用户(v2 reviews 服务 用户)登录,可以一直看到黑色星标。

基于属性的 白名单黑名单

Istio 支持基于属性的白名单和黑名单。 以下白名单配置等同于上一节的 denier 配置。 此规则能有效地拒绝 v3 版本 reviews 服务的请求。

  1. 移除上一节 denier 配置。

    Zip
    $ kubectl delete -f @samples/bookinfo/policy/mixer-rule-deny-label.yaml@
    

    如果您正在使用 Istio 1.1.2 或更早版本:

    Zip
    $ kubectl delete -f @samples/bookinfo/policy/mixer-rule-deny-label-crd.yaml@
    
  2. 当您不登录去访问 Bookinfo productpage (http://$GATEWAY_URL/productpage) 时进行验证,会看到红星。 再执行以下步骤之后,除非您以 “json” 用户登录,否则不会看到星标。

  3. 将配置应用于 list 适配器以让 v1,v2 版本位于白名单中;

    Zip
    $ kubectl apply -f @samples/bookinfo/policy/mixer-rule-deny-whitelist.yaml@
    
  4. 当您不登录去访问 Bookinfo productpage (http://$GATEWAY_URL/productpage) 时进行验证,不会看到星标。 以 “jason” 用户登录后验证,您会看到黑色星标。

基于 IP 的 白名单黑名单

Istio 支持基于 IP 地址的 白名单黑名单 。 您可以配置 Istio 接受或拒绝从一个 IP 地址或一个子网发出的请求。

  1. 您可以访问位于 http://$GATEWAY_URL/productpage 的 Bookinfo productpage 来进行验证。 一旦应用以下规则,您将无法访问它。

  2. 将配置应用于 list 适配器以添加 ingress 网关中的子网 "10.57.0.0\16" 到白名单中:

    Zip
    $ kubectl apply -f @samples/bookinfo/policy/mixer-rule-deny-ip.yaml@
    
  3. 尝试访问位于 http://$GATEWAY_URL/productpage 的 Bookinfo productpage 进行验证, 您会获得一个类似的错误:PERMISSION_DENIED:staticversion.istio-system:<your mesh source ip> is not whitelisted

清除

  • 对于简单的 denials,移除 Mixer 配置:

    Zip
    $ kubectl delete -f @samples/bookinfo/policy/mixer-rule-deny-label.yaml@
    
  • 对于基于属性的黑白名单,移除 Mixer 配置:

    Zip
    $ kubectl delete -f @samples/bookinfo/policy/mixer-rule-deny-whitelist.yaml@
    

    如果您使用 Istio 1.1.2 或更早版本:

    Zip
    $ kubectl delete -f @samples/bookinfo/policy/mixer-rule-deny-whitelist-crd.yaml@
    
  • 对于基于 IP 的白黑名单,移除 Mixer 配置:

    Zip
    $ kubectl delete -f @samples/bookinfo/policy/mixer-rule-deny-ip.yaml@
    

    如果您使用 Istio 1.1.2 或更早版本:

    Zip
    $ kubectl delete -f @samples/bookinfo/policy/mixer-rule-deny-ip-crd.yaml@
    
  • 移除应用程序路由规则:

    ZipZip
    $ kubectl delete -f @samples/bookinfo/networking/virtual-service-all-v1.yaml@
    $ kubectl delete -f @samples/bookinfo/networking/virtual-service-reviews-jason-v2-v3.yaml@
    
  • 如果您不打算探索任何后续任务,请参考清除 Bookinfo 指南来关闭应用程序。

这些信息有用吗?
Do you have any suggestions for improvement?

Thanks for your feedback!