除了 RBAC, 还有 ABAC, WebHook.

12.2.1 介绍 RBAC 授权插件

授权插件运行在 API 服务.

了解动作

API 服务使用 REST, 所以用 GET, POST, PUT, DELETE 等操作资源.
资源包括 Pod, Service, Secret 等. 所以动作就是 CRUD 这些资源.

image.png

了解 RBAC 插件

12.2.2 介绍 RBAC 资源

  • Role
  • ClusterRole
  • RoleBinding
  • ClusterRoleBinding

image.png

可以绑定不再命名空间下的集群角色:

image.png

开始练习

确保使用 Kubenetes 1.6 以上.

创建命名空间和运行 pod

image.png

列出 pod 中的服务

  1. $ curl localhost:8001/api/v1/namespaces/foo/services
  2. {
  3. "kind": "Status",
  4. "apiVersion": "v1",
  5. "metadata": {
  6. },
  7. "status": "Failure",
  8. "message": "services is forbidden: User \"system:serviceaccount:foo:default\" cannot list resource \"services\" in API group \"\" in the namespace \"foo\"",
  9. "reason": "Forbidden",
  10. "details": {
  11. "kind": "services"
  12. },
  13. "code": 403
  14. }

12.2.3 使用 Role 和 RoleBinding

image.png

image.png

创建角色

$ kubectl create -f service-reader.yaml -n foo

也可以在命令行中创建:

$ kubectl create role service-reader --verb=get --verb=list --resource=services -n bar

绑定角色到 ServiceAccount

操作主体可以是用户, ServiceAccount, 或一个组.

$ kubectl create rolebinding test --role=service-reader --serviceaccount=foo:default -n foo

image.png

RoleBinding 的 yaml 格式:

image.png
image.png

测试:

# 进入容器内部
$ kubectl exec -it test -n foo sh

$ curl localhost:8001/api/v1/namespaces/foo/services
{
  "kind": "ServiceList",
  "apiVersion": "v1",
  "metadata": {
    "resourceVersion": "8176683"
  },
  "items": []
}

在角色绑定中使用其他命名空间的 ServiceAccount

$ kubectl edit rolebinding test -n foo

添加新项, 允许 bar 中的 pod 访问 foo 中的资源:

image.png

image.png

12.2.4 使用 ClusterRole 和 ClusterRoleBinding

有 Cluster* 的原因:

  • 跨多个 namespace 的资源管理
  • 对一些不表示资源的 URL 进行管理: /healthz
  • 管理不在 namespace 的资源
    • Node
    • PersistentVolume
    • Namespace

ClusterRole 是一种集群级资源.

允许访问集群级别的资源

创建角色:

$ kubectl create clusterrole pv-reader --verb=get,list --resource=persistentvolumes

查看该角色的 yaml 格式:

image.png

在 foo 命名空间的 pod 中运行:

image.png

创建 RoleBinding:

$ kubectl create rolebinding pv-test --clusterrole=pv-reader --serviceaccount=foo:default -n foo

查看 RoleBinding 的 yaml 格式:

image.png

用 RoleBinding 绑定 ClusterRole 是无法访问集群级资源的:

image.png

清理之前的 RoleBinding:

$ kubectl delete rolebinding pv-test

创建 ClusterRoleBinding:

$ kubectl create clusterrolebinding pv-test --clusterrole=pv-reader --serviceaccount=foo:default

image.png

允许访问非资源型的 URL

查看 system:discovery ClusterRole:

image.png

查看 system:discovery ClusterRoleBinding:

image.png
image.png

使用 ClusterRole 来授权访问指定命名空间中的资源

查看自有的 view ClusterRole:

image.png

绑定 view:

$ kubectl create clusterrolebinding view-test --clusterrole=view --serviceaccount=foo:default

可以访问指定命名空间中的 pod:

image.png

使用命名空间中的 RoleBinding:

$ kubectl create rolebinding view-test --clusterrole=view --serviceaccount=foo:default -n foo

image.png

总结 Role, ClusterRole, RoleBinding 和 ClusterRoleBinding 的组合

image.png

理解上表的关键点在于 “重用”:

  • 注意表中括号中的文字

12.2.5 了解默认的 ClusterRole 和 ClusterRoleBinding

查看 kubernetes 自动创建的 ClusterRole 和 ClusterRoleBinding:

$ kubectl get clusterrolebindings
$ kubectl get clusterroles
  • 用 view ClusterRole 允许对资源的只读访问
  • 用 edit ClusterRole 允许对资源的修改
  • 用 admin ClusterRole 赋予一个命名空间全部的控制权
  • 用 cluster-admin ClusterRole 得到完全的控制权

12.2.6 理性地授予授权权限

  • 为每个 pod 创建特定的 ServiceAccount
  • 假设你的应用会被入侵