配置安全访问控制

本任务将演示如何通过使用Istio认证提供的服务账户,来安全地对服务做访问控制。

当Istio双向TLS认证打开时,服务器就会根据其证书来认证客户端,并从证书获取客户端的服务账户。服务账户在source.user的属性中。请参考Istio auth identity了解Istio中服务账户的格式。

开始之前

  • 根据quick start的说明在开启认证的Kubernetes中安装Istio。注意,应当在installation steps中的第四步开启认证。

  • 部署BookInfo示例应用。

  • 执行下列命令创建bookinfo-productpage服务账户,并重新部署productpage服务及其服务账户。

    1. kubectl create -f <(istioctl kube-inject -f samples/bookinfo/kube/bookinfo-add-serviceaccount.yaml)

    期望看到类似如下的输入:

    1. serviceaccount "bookinfo-productpage" created
    2. deployment "productpage-v1" configured

    注意:如果使用default之外的命名空间,需要通过istioctl -n namespace ...来指定命名空间。

使用denials做访问控制

在示例应用BookInfo中,productpage服务会同时访问reviews服务和details服务。现在让details服务拒绝来自productpage服务的请求:

  1. 在浏览器中打开BookInfo的productpage (http://$GATEWAY_URL/productpage)页面。

    将会在页面左下部看到”Book Details”部分,包括了类型、页数、出版社等信息。productpage服务是从details服务获取的”Book Details”信息。

  2. 明确拒绝从productpagedetails的请求。

    执行下列命令来安装拒绝规则及对应的handler和实例。

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

    将会看到类似下面的输出:

    1. Created config denier/default/denyproductpagehandler at revision 2877836
    2. Created config checknothing/default/denyproductpagerequest at revision 2877837
    3. Created config rule/default/denyproductpage at revision 2877838

    注意denyproductpage 规则中的下述内容:

    1. 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适配器配置中指定的。

  3. 在浏览器中刷新productpage页面。

    将会看到消息

    Error fetching product details! Sorry, product details are currently unavailable for this book.

    出现在页面的左下部分。这就验证了从productpagedetails的访问是被禁止的。

清除

  • 清除mixer配置:

    1. istioctl delete -f samples/bookinfo/kube/mixer-rule-deny-serviceaccount.yaml
  • 如果不打算继续接下来的更多任务,可参考BookInfo cleanup的指南来关闭应用。

进阶阅读