【每日一个云原生小技巧 #8】Kubernetes 中的 RBAC

介绍 RBAC

RBAC (Role-Based Access Control) 是 Kubernetes 中用于授权的一种机制。其基本思想是将一系列的操作权限与角色(Role)关联,然后再将特定的角色与用户或用户组关联。

使用 RBAC,管理员可以按最小权限原则分配权限,只给予用户执行其任务所需的最小权限。这有助于限制潜在的恶意行为和误操作,并增强了安全性。

使用场景

  1. 多租户集群: 在大型组织或云环境中,可能有多个团队或用户共享一个 Kubernetes 集群,RBAC 可以确保他们只能访问各自的资源。
  2. 保护敏感资源: 防止未经授权的用户访问或修改 ConfigMaps、Secrets 或 Persistent Volumes。
  3. 细粒度的权限管理: 允许开发团队部署应用,但不允许他们创建新的 namespaces 或查看其他团队的工作。

使用技巧

  1. 按最小权限原则分配: 默认不给权限,只在确实需要时给予。
  2. 利用 Role 与 ClusterRole: Role 是 namespace 级别的,只在一个 namespace 中有效。而 ClusterRole 是集群级别的,跨 namespaces。
  3. 明确绑定: 使用 RoleBindingClusterRoleBinding 将角色绑定到特定的用户、组或 Service Accounts。
  4. 审计与监视: 定期审查 RBAC 权限并监视 API 调用,以确保权限被正确使用。
  5. 利用现成的工具: 例如 kubectl auth can-i 命令,来检查权限。

使用案例

为特定 namespace 的开发者分配权限

想象一个场景,你希望开发团队能够在 development namespace 中管理 Pods,但不希望他们在其他 namespace 或修改其他资源。

  1. 创建一个 Role
代码语言:javascript
复制
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: development
  name: pod-manager
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "list", "create", "update", "delete"]
  1. 创建一个 RoleBinding

将上面的 Role 绑定到一个用户 dev-user:

代码语言:javascript
复制
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: pod-manager-binding
  namespace: development
subjects:
- kind: User
  name: "dev-user"
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: pod-manager
  apiGroup: rbac.authorization.k8s.io

为所有 namespaces 的管理员分配权限

你希望某个管理员能够管理所有 namespaces 的 Services。

  1. 创建一个 ClusterRole
代码语言:javascript
复制
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  # "name" is the name of the ClusterRole
  name: service-admin
rules:
- apiGroups: [""]
  resources: ["services"]
  verbs: ["get", "list", "create", "update", "delete"]
  1. 创建一个 ClusterRoleBinding

将上面的 ClusterRole 绑定到一个用户 admin-user:

代码语言:javascript
复制
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: service-admin-binding
subjects:
- kind: User
  name: "admin-user"
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: service-admin
  apiGroup: rbac.authorization.k8s.io

通过这些案例,我们可以看到 RBAC 是如何在 Kubernetes 中进行细粒度授权的,从而确保资源安全。