Kubernetes 权限控制

权限控制离不开用户管理系统、认证和授权,下面就简单讲一下这三个概念。

用户管理系统,一般存放着用户的相关信息,最主要的有用户名、用户密码和用户组。

认证(Authentication, AuthN)主要是验证用户的合法性,比如用户名和密码正确即认证成功。

授权(Authorization, AuthZ)主要是验证用户是否有权限来做某事,通常可以给单个用户某些权限,也可以给用户组某些权限,在该用户组里的用户会继承这些权限。

Kubernetes 里的权限控制有三种方式,分别是 RBAC, ABAC, Webhook。

RBAC - Role Based Access Control

RBAC 权限控制是 Kubernetes 主推的方式,RBAC 本身也是使用比较广泛的。

在 Kubernetes 中,RBAC 三要素: Can 主体subject 动词verb 目标object ?

比如:Can Alice create pod?

Subject 分为 User、Group、ServiceAccount,其中:

  • User 为用户,Kubernetes 对用户格式没要求,字符串都可以,比如 Alice 就是一个用户。
  • Group 为组,可以是用户组,也可以是 ServiceAccount 组。
  • ServiceAccount 为服务账户,比如用户创建的 Pod 里运行的程序再调用 Kubernetes API 创建资源时所使用的账户就叫 ServiceAccount。

Kubernetes 预留了system:开头的组作为特殊用途,有以下几类:

  • system:serviceaccounts 代表系统里的所有 ServiceAccount
  • system:serviceaccounts:ns1 代表 ns1 namesapce 下的所有 ServiceAccount
  • system:autenticated 代表所有已登录用户
  • system:unauthenticated 代表所有未登录用户

Verb 内置的主要有 create、get、list、watch、update、patch、delete,用户还可以自定义各种动词,比如 eat、wear、live、use等。

Object 就是 Kubernetes 资源,包含内置的资源,比如 Deployment、Service、Pod 等,和自定义的资源。

Subject、Verb、Object 是通过 Role/Rolebinding 来组织到一起进行工作的。

Role/ClusterRole

Role/ClusterRole 中定义了 Verb 和 Object,意思为能做什么,比如 创建 Pod、查看 Service 等。

Role 必须定义在某个 namespace 里面并且所操作的资源必须是 namespace 级别的,ClusterRole 既可以定义集群级别的资源也可以定义 Namespace 级别的资源。

Role 只能被 Rolebinding 所绑定,ClusterRole 既可以被 Rolebinding 绑定又可以被 ClusterRoleBinding 绑定。

当 ClusterRole 被 RoleBinding 绑定时表示某个主体(Subject)可以在某个 namespace 里做什么,比如 Alice 可以在 ns1 namespace 里创建 Pod。

当 ClusterRole 被 ClusterRoleBinding 绑定时表示某个主体(Subject)可以在整个集群中里做什么,比如 Alice 可以在任意 namespace 里创建 Pod。

Role 示例,可以在 ns1 里创建 Pod:

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: create-pod
  namespace: ns1
rules:
  - apiGroups: ["v1"]
    resources: ["pods"]
    verbs: ["create"]

ClusterRole 示例,可以在所有 namespace 里创建 Pod 和创建集群资源 PersistenVolume:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: create-pod
rules:
  - apiGroups: ["v1"]
    resources: ["pods", "persistentvolumes"]
    verbs: ["create"]

Rolebinding/ClusterRoleBinding

Rolebinding/ClusterRoleBinding 就是将 Subject 与 Verb 和 Object 绑定到一起,作用是指定能做什么。

RoleBinding 示例,Alice 可以在 ns1 里创建 Pod:

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: alice-create-pod
  namespace: ns1
subjects:
  - kind: User
    name: Alice
    apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: create-pod
  apiGroup: rbac.authorization.k8s.io

ClusterRoleBinding 示例,Alice 可以在任意 namespace 里创建 Pod 和集群资源 PersistentVolume:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: alice-create-pod
subjects:
  - kind: User
    name: Alice
    apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: create-pod
  apiGroup: rbac.authorization.k8s.io

ABAC - Attribute Based Access Control

ABAC 是通过将属性组合在一起的策略来授予用户权限,需要在 Kuberentes Apiserver 启动时指定一个静态的策略文件,使用起来不够灵活并且目录处于 Beta 状态,近几年几乎没什么改动,用户比较少。

下面就是一个示例,表示 Alice 可以在 namespace ns1 里管理 Pod:

{"apiVersion": "abac.authorization.kubernetes.io/v1beta1", "kind": "Policy", "spec": {"user": "alice", "namespace": "ns1", "resource": "pods", "apiGroup": "v1"}}

Namespace ns1 里的 ServiceAccount sa1 可以管理 Pod:

{"apiVersion": "abac.authorization.kubernetes.io/v1beta1", "kind": "Policy", "spec": {"user": "system:serviceaccount:ns1:sa1", "namespace": "ns1", "resource": "pods", "apiGroup": "v1"}}

Webhook

Webhook 是将授权放到外部一个服务上去,每当某个用户要对 Kubernetes 进行操作时,都先去外部服务上问一下是否有权限,只有有权限时才允许操作。

RBAC 模式下系统内置的 ClusterRole

Kubernetes 系统会内置一系列 ClusterRole 供用户和其自己核心组件使用,下面主要说一下面向用户的 ClusterRole。

  • cluster-admin 即集群管理员,可以用 ClusterRoleBinding 将其绑定给某个用户,表示这个用户为可以在集群中做任何事情。
  • admin 即管理员,可以用某个 Namespace 里的 RoleBinding 将其绑定给某个用户,表示该用户是该 Namespace 的管理员。
  • edit 即编辑,可以用某个 Namespace 里的 RoleBinding 将其绑定给某个用户,表示该用户是该 Namespace 的编辑。
  • view 即查阅者,可以用某个 Namespace 里的 RoleBinding 将其绑定给某个用户,表示该用户是该 Namespace 的查阅者。

通常如果 Kubernetes 集群里只使用其核心资源的话,以上权限足够了,但是想要使用自定义资源并且更细粒度的控制权限,就需要用到 Aggregated ClusterRole 了。

Aggregated ClusterRole

用户可以创建一个 Aggregated ClusterRole 并指定 Label Selector,当这个 Aggregated ClusterRole 被绑定到某个用户时,那么该用户也会拥有这个 Label 的其他 ClusterRole 权限。

自定义 Verb 和 Object

除了内置的 Verb 和 Object 之外,用户还可以自定义 Verb 与 Object 并实现自己的逻辑,比如:Can Alice Ride Bike。

后续写 Kubernetes CSI 存储端到端的多租户时会详细说明一下。