Kubernetes RBAC 鉴权

Kubernetes RBAC

Posted by alovn on December 9, 2020

RBAC 全称 Role Based Access Control,Kubernetes是基于角色访问控制实现授权决策。管理员可通过 Kubernetes API 动态配置权限策略。

RBAC API 声明了四种 Kubernetes 对象:Role、ClusterRole、RoleBinding 和 ClusterRoleBinding。可以通过 kubectl 工具查看管理描述对象。

1
2
3
4
kubectl get role
kubectl get clusterrole
kubectl get rolebinding
kubectl get clusterrolebinding

角色

Kubernetes 中角色分为两种:Role 和 ClusterRole。如果你希望在命名空间内定义角色,应该使用 Role; 如果你希望定义集群范围的角色,应该使用 ClusterRole。

Role

Role 用于给某个 namespace 中的资源鉴权使用, 在创建 Role 的时候必须指定该 Role 所属的命名空间。可以定义一组权限集合,例如:授予对 Pod 的读取访问权限:

1
2
3
4
5
6
7
8
9
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: role-pod-reader
  namespace: default
rules:
  - apiGroups: [""]
    resources: ["pods"]
    verbs: ["get", "list", "watch"]

ClusterRole

ClusterRole 是集群作用域的资源定义访问权限,可以跨所有的命名空间授权,可以授予集群范围的资源权限比如 node。

1
2
3
4
5
6
7
8
9
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  # "namespace" 被忽略,因为 ClusterRoles 不受名字空间限制
  name: role-nodes-reader
rules:
- apiGroups: [""]
  resources: ["nodes"]
  verbs: ["get", "watch", "list"]

参数

apiGroup 可配置参数有:””,”apps”, “autoscaling”, “batch”。

resources 可配置的参数有:”services”, “endpoints”, “pods”,”secrets”,”configmaps”,”crontabs”, “deployments”,”jobs”, “nodes”, “rolebindings”, “clusterroles”, “daemonsets”, “replicasets”, “statefulsets”, “horizontalpodautoscalers”, “replicationcontrollers”, “cronjobs”。

verbs 可配置的参数有:”get”, “list”, “watch”, “create”, “update”, “patch”, “delete”, “exec”。

角色绑定

RoleBinding 和 ClusterRoleBinding 是将角色中定义的权限赋予一个或一组用户。

  • 一个 RoleBinding 可以引用同一 namespace 中的任何 Role。
  • 一个 RoleBinding 可以引用某 ClusterRole 并将该 ClusterRole 绑定到 RoleBinding 所在的 namespace。
  • 如果你希望将某 ClusterRole 绑定到集群中所有 namespace,你要使用 ClusterRoleBinding。

示例

通过 roleRef 指定某个 Role 的绑定关系

1
2
3
4
5
6
7
8
9
10
11
12
13
14
apiVersion: rbac.authorization.k8s.io/v1
# 此角色绑定允许 "hello" 读取 "default" 名字空间中的 Pods
kind: RoleBinding
metadata:
  name: read-pods
  namespace: default
subjects:
- kind: User # 这里可以是 User、Group、ServiceAccount
  name: hello
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role # 这里必须是 Role 或 ClusterRole
  name: role-pod-reader     # 绑定的 Role 或 ClusterRole 的名称
  apiGroup: rbac.authorization.k8s.io