这个task展示如何在Istio网格中为服务设置基于角色的访问控制 (RBAC) 。你可以从 Istio RBAC concept page 阅读更多关于RBAC的内容。
注意:目前 Istio release可能没有最新的RBAC示例。所以在你继续前,你需要从https://github.com/istio/istio/tree/master/samples/bookinfo/kube中copy 如下配置文件到你安装Istio目录的“samples/bookinfo/kube”中,并替换掉原来的。文件包括bookinfo-add-serviceaccount.yaml, istio-rbac-enable.yaml, istio-rbac-namespace.yaml,istio-rbac-productpage.yaml, istio-rbac-details-reviews.yaml,istio-rbac-ratings.yaml.
在这个task,我们将基于Service Accounts控制访问,这在Istio网格中是密码认证。为了给予不同微服务不同权限,我们将新建一些服务账户,并在这些账户下重新部署运行Bookinfo 。 命令如下:
新建服务账户 bookinfo-productpage并使用这个账户重新部署 productpage 服务。新建服务账户 bookinfo-reviews并用这个账户重新部署 reviews (deployments reviews-v2 and reviews-v3) 服务。 kubectl apply -f <(istioctl kube-inject -f samples/bookinfo/kube/bookinfo-add-serviceaccount.yaml)预期结果
serviceaccount "bookinfo-productpage" created deployment "productpage-v1" configured serviceaccount "bookinfo-reviews" created deployment "reviews-v2" configured deployment "reviews-v3" configured注意: 如果你使用非 default 命名空间 使用 istioctl -n namespace ...来指定命名空间。
在你的浏览器上访问 Bookinfo productpage (http://$GATEWAY_URL/productpage)。你将看到:
“Book Details” 部分在页面左下部,包括type, pages, publisher, etc.“Book Reviews” 部分在页面右下部。为命名空间 “default” 使用如下命令来开启RBAC:
注意:如果你使用非 default 命名空间,编辑文件 samples/bookinfo/kube/istio-rbac-enable.yaml ,然后在"your-namespace",指定命名空间 ,位置在 rule 规则的 match 中,"match: destination.namespace == "your-namespace".
istioctl create -f samples/bookinfo/kube/istio-rbac-enable.yaml注意: 如果你在之前tasks中由冲突的rules,使用 istioctl replace 来替换istioctl create.
它也定义了 “requestcontext”,这是一个 authorization template 的实例。“requestcontext”在运行时定义了RBAC引擎的输入。
在你的浏览器上访问Bookinfo productpage (http://$GATEWAY_URL/productpage). 现在你应该看到"PERMISSION_DENIED:handler.rbac.istio-system:RBAC: permission denied." 。这是因为Istio RBAC “deny by default”, 这意味着你需要为所有访问的服务直接定义访问控制策略并授权。
注意: 这或许由于浏览器和Istio proxy的缓存存在延迟。
使用Istio RBAC,你能够轻松通过指定从一个命名空间的服务访问另一个命名空间的所有(或一系列)服务设置命名空间级访问控制。
在我们的Bookinfo示例中, “productpage”, “reviews”, “details”, “ratings” 都被部署在 “default” 命名空间中。Isito组件像 “ingress” 服务,被部署在“istio-system” 命名空间中。我们能定义一个策略,让所有 “default” 命名空间的服务在 “app” 标签设置一系列值 [“productpage”, “details”, “reviews”, “ratings”] 中的一个,来让相同命名空间 (i.e., “default” namespace)的服务和 “istio-system”命名空间的服务能够访问到。
运行下列命令新建一个命名空间级的访问控制策略。
istioctl create -f samples/bookinfo/kube/istio-rbac-namespace.yaml策略如下:
新建一个ServiceRole “service-viewer” ,它允许在命名空间 “default” 中的 “app” 标签中的值在[“productpage”, “details”, “reviews”, “ratings”]里的服务获得读权限。注意这有一个 “constraint” 说明服务 “app” 标签必须有列中的一个值。 apiVersion: "config.istio.io/v1alpha2" kind: ServiceRole metadata: name: service-viewer namespace: default spec: rules: - services: ["*"] methods: ["GET"] constraints: - key: "app" values: ["productpage", "details", "reviews", "ratings"] 新建一个ServiceRoleBinding ,为 “istio-system” and “default” 命名空间中的所有服务指定一个“service-viewer” 角色。 apiVersion: "config.istio.io/v1alpha2" kind: ServiceRoleBinding metadata: name: bind-service-viewer namespace: default spec: subjects: - properties: namespace: "istio-system" - properties: namespace: "default" roleRef: kind: ServiceRole name: "service-viewer"预期结果:
servicerole "service-viewer" created servicerolebinding "bind-service-viewer" created现在如果你在浏览器中访问Bookinfo productpage (http://$GATEWAY_URL/productpage). 你应该看到“Bookinfo Sample” 页, “Book Details” 部分在左下部,“Book Reviews” 在右下部。
注意: 这或许由于浏览器和Istio proxy的缓存存在延迟。
在你进行下个task前执行如下命令来移除配置:
istioctl delete -f samples/bookinfo/kube/istio-rbac-namespace.yaml这个task向你展示如何使用Istio的RBAC设置服务级的访问控制。在你开始前,请确保:
你开启了Istio RBAC你已经移除了命名空间级的Istio RBAC策略在你的浏览器上访问Bookinfo productpage (http://$GATEWAY_URL/productpage). 你应该看到 "PERMISSION_DENIED:handler.rbac.istio-system:RBAC: permission denied." 我们将逐渐为Bookinfo示例的服务中添加访问。
在这一步中,我们新建一个政策来允许外部请求通过Ingress查看 productpage 服务。 运行:
istioctl create -f samples/bookinfo/kube/istio-rbac-productpage.yaml策略如下:
新建一个 ServiceRole “productpage-viewer” ,允许对 “productpage” 服务的读取访问。 apiVersion: "config.istio.io/v1alpha2" kind: ServiceRole metadata: name: productpage-viewer namespace: default spec: rules: - services: ["productpage.default.svc.cluster.local"] methods: ["GET"] 新建一个ServiceRoleBinding “bind-productpager-viewer” ,为所有用户/服务分配一个 “productpage-viewer” 角色。 apiVersion: "config.istio.io/v1alpha2" kind: ServiceRoleBinding metadata: name: bind-productpager-viewer namespace: default spec: subjects: - user: "*" roleRef: kind: ServiceRole name: "productpage-viewer"在你的浏览器上访问Bookinfo productpage (http://$GATEWAY_URL/productpage). 现在你应该能看到 “Bookinfo Sample”页。但是页面上有错误"Error fetching product details" and "Error fetching product reviews" 。这些错误正如预想的那样,因为我们没有授权“productpage” 可以访问“details” and “reviews” 服务。我们在接下来的步骤中修复错误。
注意:由于浏览器或Istio proxy的缓存可能会带来延迟。
我们将新建一个策略来允许“productpage” 能够读取“details” and “reviews” 服务。注意在 setup step, 我们为 “productpage”服务新建了一个服务账户 “bookinfo-productpage” 。这个 “bookinfo-productpage” 服务账户就是对于 “productpage” 服务的认证身份。
运行:
istioctl create -f samples/bookinfo/kube/istio-rbac-details-reviews.yaml策略如下:
新建一个ServiceRole “details-reviews-viewer” , 允许读取访问 “details” and “reviews”服务。 apiVersion: "config.istio.io/v1alpha2" kind: ServiceRole metadata: name: details-reviews-viewer namespace: default spec: rules: - services: ["details.default.svc.cluster.local", "reviews.default.svc.cluster.local"] methods: ["GET"] 创建一个 ServiceRoleBinding “bind-details-reviews” ,为服务账户“cluster.local/ns/default/sa/bookinfo-productpage” (代表“productpage” 服务)分配“details-reviews-viewer”角色 apiVersion: "config.istio.io/v1alpha2" kind: ServiceRoleBinding metadata: name: bind-details-reviews namespace: default spec: subjects: - user: "cluster.local/ns/default/sa/bookinfo-productpage" roleRef: kind: ServiceRole name: "details-reviews-viewer"访问浏览器 Bookinfo productpage (http://$GATEWAY_URL/productpage). 现在你应该能看到 “Bookinfo Sample”页上“Book Details” 在左下部,“Book Reviews” 在右下部。然而,在“Book Reviews” 小节中,这有一个错误"Ratings service currently unavailable". 这是因为 “reviews”服务没有权限访问 “ratings”服务。为了修复这个问题,我们需要授权 “reviews”服务能够读取访问 “ratings” 。我们将在下一步中展示怎么做。
注意:由于浏览器或Istio proxy的缓存可能会带来延迟。
我们将新建一个策略来允许 “reviews”读取“ratings” 服务。注意在 setup step, 我们为“reviews” 服务创建了服务账户“bookinfo-reviews”。这个 “bookinfo-reviews” 服务账户对于 “reviews” 服务是认证身份。
执行下面命令来创建一个允许 “reviews”服务读取 “ratings”服务的策略
istioctl create -f samples/bookinfo/kube/istio-rbac-ratings.yaml策略如下:
新建一个ServiceRole “ratings-viewer” ,允许对 “ratings” 的读访问 apiVersion: "config.istio.io/v1alpha2" kind: ServiceRole metadata: name: ratings-viewer namespace: default spec: rules: - services: ["ratings.default.svc.cluster.local"] methods: ["GET"] 新建一个 ServiceRoleBinding “bind-ratings” ,为服务账户“cluster.local/ns/default/sa/bookinfo-reviews”(代表“reviews” 服务)分配一个“ratings-viewer”角色。 apiVersion: "config.istio.io/v1alpha2" kind: ServiceRoleBinding metadata: name: bind-ratings namespace: default spec: subjects: - user: "cluster.local/ns/default/sa/bookinfo-reviews" roleRef: kind: ServiceRole name: "ratings-viewer"在你的浏览器访问 Bookinfo productpage (http://$GATEWAY_URL/productpage). 现在你应该看到 “Book Reviews”小节出现“black” and “red”星级评定。
注意:由于浏览器或Istio proxy的缓存可能会带来延迟。
如果你只想在 “Book Reviews” 小节中看到 “red” 评级,你可以通过指定 “reviews” 服务的 “v3” 版本能够访问“ratings” 服务。
apiVersion: "config.istio.io/v1alpha2" kind: ServiceRoleBinding metadata: name: bind-ratings namespace: default spec: subjects: - user: "cluster.local/ns/default/sa/bookinfo-reviews" properties: version: "v3" roleRef: kind: ServiceRole name: "ratings-viewer"