【每日一个云原生小技巧 #69】Kubernetes 基于角色的访问控制

基于角色的访问控制(RBAC, Role-Based Access Control)是一种广泛使用的访问控制机制,特别是在 Kubernetes 环境中。它基于角色分配权限,而不是直接将权限分配给单个用户,从而实现更有效和更安全的权限管理。
  1. 最小权限原则:为用户和服务账户仅分配完成其任务所必需的最少权限。
  2. 使用预定义的角色:利用 Kubernetes 提供的预定义角色来简化权限管理。
  3. 定期审计权限:定期审计 RBAC 配置,确保只有适当的用户和服务具有必要的权限。
  4. 区分命名空间级别和集群级别的角色:根据需要在命名空间级别或集群级别定义角色和角色绑定。

使用场景

  1. 多用户 Kubernetes 集群:在企业或组织中,不同团队成员需要不同的访问权限。
  2. 自动化工作流程:为 CI/CD 管道或自动化脚本配置适当的权限。
  3. 合规性和安全性要求:确保满足数据保护和安全合规性的要求。

使用技巧

  1. 定义精细的角色:创建细粒度的角色,确保每个角色只包含完成特定任务所需的最小权限集。
  2. 使用命名空间隔离资源:利用命名空间来隔离资源和权限,为不同的团队或项目提供独立的环境。
  3. 利用角色绑定和集群角色绑定:使用 RoleBinding 将角色分配给命名空间内的用户,使用 ClusterRoleBinding 将角色分配给整个集群的用户。
  4. 定期检查和修订:定期检查和修订 RBAC 策略,确保它们符合当前的业务和安全需求。

使用案例

案例1:为特定命名空间的用户分配只读权限

假设你需要为一个用户在特定命名空间中分配只读权限。

创建角色

代码语言:javascript
复制
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: mynamespace
  name: read-only
rules:
- apiGroups: [""]
  resources: ["pods", "pods/log"]
  verbs: ["get", "list", "watch"]

这个角色 read-only 允许用户在 mynamespace 命名空间中对 Pod 和 Pod 日志进行读取操作。

创建角色绑定

代码语言:javascript
复制
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: read-only-binding
  namespace: mynamespace
subjects:
- kind: User
  name: username
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: read-only
  apiGroup: rbac.authorization.k8s.io

这个 RoleBindingread-only 角色绑定到用户 username,从而让该用户在 mynamespace 命名空间中拥有只读权限。

案例2:创建集群级别管理员角色

假设你需要创建一个集群级别的管理员角色,该角色具有对所有资源的完全

访问权限。

创建集群角色(ClusterRole)

代码语言:javascript
复制
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: super-admin
rules:
- apiGroups: ["*"]
  resources: ["*"]
  verbs: ["*"]

这个 super-admin 集群角色提供对所有 API 组(apiGroups)、所有资源(resources)的所有操作(verbs)的权限。

创建集群角色绑定(ClusterRoleBinding)

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

这个 ClusterRoleBindingsuper-admin 集群角色绑定到用户 adminuser,从而让该用户拥有对整个 Kubernetes 集群的完全访问权限。

结论

基于角色的访问控制(RBAC)是 Kubernetes 中管理权限的有效方法。通过精心设计的角色和角色绑定,可以实现精确的权限控制,同时确保安全性和合规性。重要的是要定期审查和更新 RBAC 配置,以反映变化的需求和最佳实践。