介绍 RBAC
RBAC (Role-Based Access Control) 是 Kubernetes 中用于授权的一种机制。其基本思想是将一系列的操作权限与角色(Role)关联,然后再将特定的角色与用户或用户组关联。
使用 RBAC,管理员可以按最小权限原则分配权限,只给予用户执行其任务所需的最小权限。这有助于限制潜在的恶意行为和误操作,并增强了安全性。
使用场景
- 多租户集群: 在大型组织或云环境中,可能有多个团队或用户共享一个 Kubernetes 集群,RBAC 可以确保他们只能访问各自的资源。
- 保护敏感资源: 防止未经授权的用户访问或修改 ConfigMaps、Secrets 或 Persistent Volumes。
- 细粒度的权限管理: 允许开发团队部署应用,但不允许他们创建新的 namespaces 或查看其他团队的工作。
使用技巧
- 按最小权限原则分配: 默认不给权限,只在确实需要时给予。
- 利用 Role 与 ClusterRole:
Role
是 namespace 级别的,只在一个 namespace 中有效。而ClusterRole
是集群级别的,跨 namespaces。 - 明确绑定: 使用
RoleBinding
或ClusterRoleBinding
将角色绑定到特定的用户、组或 Service Accounts。 - 审计与监视: 定期审查 RBAC 权限并监视 API 调用,以确保权限被正确使用。
- 利用现成的工具: 例如
kubectl auth can-i
命令,来检查权限。
使用案例
为特定 namespace 的开发者分配权限
想象一个场景,你希望开发团队能够在 development
namespace 中管理 Pods,但不希望他们在其他 namespace 或修改其他资源。
- 创建一个 Role
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
namespace: development
name: pod-manager
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "create", "update", "delete"]
- 创建一个 RoleBinding
将上面的 Role 绑定到一个用户 dev-user
:
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。
- 创建一个 ClusterRole
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"]
- 创建一个 ClusterRoleBinding
将上面的 ClusterRole 绑定到一个用户 admin-user
:
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 中进行细粒度授权的,从而确保资源安全。