7.6.3 授权策略示例

下载本书示例后,切换到目录authorizationsample下可查看所有相关代码。

执行如下命令,创建命名空间authorizationsample并添加标签istio-injection,值为enabled:


kubectl create namespace authorizationsample
kubectl label namespace authorizationsample istio-injection=enabled

以下示例中使用的yaml文件可以从根目录下authorizationsample文件夹中获取,例如client.yaml位于根目录下的authorizationsample/client.yaml,以此类推。

创建命名空间authorizationsample下的部署与服务:


kubectl apply -n authorizationsample -f client.yaml
kubectl apply -n authorizationsample -f server.yaml

以下命令(可以从authpolicy/sample文件夹中的test1.sh中获取,执行前需要对该文件进行chmod+授权)可以方便对客户端和服务端的调用进行检查:


kubectl exec $(kubectl get pod -l app=client -n authorizationsample -o jsonpath=
{.items..metadata.name}) -c client -n authorizationsample -- curl "http:// server:8000/
ip" -s -o /dev/null -w "client to server: %{http_code}\n"

通过从客户端向服务端发送HTTP请求(可以使用curl命令),所有请求都应该成功进行并且返回的HTTP状态码为200,如下所示:


client to server: 200

运行以下命令为命名空间authorizationsample启用Istio授权,以下yaml内容可以从根目录下的authorizationsample/rbac-conf ig-ON.yaml中获得:


kubectl apply -f - << EOF
apiVersion: "rbac.istio.io/v1alpha1"
kind: ClusterRbacConfig
metadata:
  name: default
spec:
  mode: 'ON_WITH_INCLUSION'
  inclusion:
    namespaces: ["authorizationsample"]
EOF

再次访问从客户端向服务端发送HTTP请求,返回的HTTP状态码为403,如下所示:


kubectl exec $(kubectl get pod -l app=client -n authorizationsample -o jsonpath=
{.items..metadata.name}) -c client -n authorizationsample -- curl "http:// server:
8000/ip" -s -o /dev/null -w "client to server: %{http_code}\n"
client to server: 403

或者执行如下命令,应该看到"RBAC:access denied"。这是因为Istio授权是“默认拒绝”,这意味着需要明确定义访问控制策略用以授予对任何服务的访问权限。


kubectl exec $(kubectl get pod -l app=client -n authorizationsample -o jsonpath=
{.items..metadata.name}) -c client -n authorizationsample -- curl -s "http:// server:
8000/ip"
RBAC: access denied

运行以下命令以创建命名空间级的访问控制策略,以下yaml内容可以从根目录下的authorizationsample/namespace-policy.yaml中获得::


kubectl apply -f - <<EOF
apiVersion: "rbac.istio.io/v1alpha1"
kind: ServiceRole
metadata:
  name: service-viewer
  namespace: authorizationsample
spec:
  rules:
  - services: ["*"]
    methods: ["GET"]
    constraints:
    - key: "destination.labels[app]"
      values: ["server"]
---
apiVersion: "rbac.istio.io/v1alpha1"
kind: ServiceRoleBinding
metadata:
  name: bind-service-viewer
  namespace: authorizationsample
spec:
  subjects:
  - properties:
      source.namespace: "authorizationsample"  
  roleRef:
    kind: ServiceRole
    name: "service-viewer"
EOF

执行上述授权策略后,该策略应当具有以下效果:

·创建一个名为service-viewer的ServiceRole,允许访问命名空间authorizationsample下的具有app标签且app标签值为server的任何服务。

·创建一个名为bind-service-viewer的ServiceRoleBinding,将service-viewer角色分配给命名空间authorizationsample中的所有服务。

再次执行如下命令,应该看到合理的返回结果。由于缓存和其他信息传递的开销,可能会有一些延迟,返回结果可能仍为访问拒绝,请稍候再次执行访问。


kubectl exec $(kubectl get pod -l app=client -n authorizationsample -o jsonpath=
{.items..metadata.name}) -c client -n authorizationsample -- curl -s "http:// server:
8000/ip"
{
  "origin": "127.0.0.1"
}