K8s角色权限配置:区分开发、运维、审计账号边界
在Kubernetes多租户环境中,开发、运维与审计三类账号的权限边界若仅靠“约定”维持,往往会在人员变动、故障应急或合规检查时暴露风险。RBAC(基于角色的访问控制)提供了可声明、可版本化、可审计的授权机制,关键在于把角色设计成与职责一一对应的最小权限集合,而不是给所有人分配cluster-admin。
一、三类账号的职责差异决定了权限差异
三类账号的核心区别不在于“级别高低”,而在于操作对象和操作性质不同。开发关注应用的迭代与排障,运维关注集群与工作负载的稳定性,审计关注“谁在什么时候做了什么”,通常不参与变更。
- 开发账号:在指定命名空间内创建、更新、删除Deployment、Service、ConfigMap等资源,读取Pod日志,可能需要exec进入自己的Pod进行调试。
- 运维账号:跨命名空间管理节点、工作负载、存储、网络与准入策略,执行扩缩容、驱逐、节点维护等操作,权限高于开发但应避免持有全部密钥读取能力。
- 审计账号:以只读方式访问资源对象、事件、审计日志与RBAC规则本身,用于合规核查与事后追溯,不应具备create、update、delete、exec等动词权限。
二、用Role与ClusterRole划分作用域
RBAC的授权由“规则(rule)”与“绑定(binding)”两部分组成。规则定义能对哪些资源执行哪些动词,绑定决定谁获得这些规则。命名空间内的权限使用Role与RoleBinding,集群级资源使用ClusterRole与ClusterRoleBinding,这是控制权限外溢的第一道边界。
开发账号:命名空间内的Role
为每个开发团队或环境建立独立命名空间,在命名空间内定义Role,仅授予该团队所需资源的读写权限。日志读取可通过pods/log子资源单独授权,exec权限应审慎评估,必要时限制到特定Pod标签或仅在调试命名空间开放。RoleBinding将Role绑定到团队对应的Group,而不是逐个绑定到个人用户,便于人员进出时统一调整。
运维账号:按职责拆分的ClusterRole
运维往往需要跨命名空间操作,可使用ClusterRole。但建议按职责拆分为多个ClusterRole,例如“节点与存储维护”“工作负载与发布管理”“网络与准入策略管理”,再通过ClusterRoleBinding或按命名空间的RoleBinding组合授予。这样即使某个运维账号被误用,影响范围也被限制在特定领域。
审计账号:只读ClusterRole
审计账号通常需要跨命名空间查看资源与事件,可绑定一个只读ClusterRole,规则中仅包含get、list、watch。注意secrets属于敏感资源,即使是只读权限也应单独评估,避免审计账号读取到业务密钥内容。审计所需的API审计日志、事件记录一般在控制平面或日志平台侧查看,不应通过提升集群内权限来获取。
三、账号边界落地的几个关键点
- 以Group而非User授权:将权限绑定到身份提供商中的组,人员调整只需改组成员关系,避免在集群内堆积大量个人绑定。
- 默认拒绝,显式授予:RBAC本身是白名单模型,不要用通配符“*”覆盖resources或verbs,除非确有必要的运维场景并有额外审计。
- 区分读写与敏感读取:view类内置ClusterRole适合只读场景,但需确认其是否包含secrets等敏感资源,必要时自建只读角色。
- 定期复核绑定关系:人员转岗、项目结束、临时提权后,应及时回收RoleBinding与ClusterRoleBinding,避免权限长期沉淀。
- 结合准入与审计日志:RBAC决定“能不能做”,准入控制决定“做的内容是否合规”,审计日志回答“实际做了什么”,三者配合才能形成完整闭环。
四、常见踩坑与规避建议
- 把开发账号直接绑定到cluster-admin,导致误删集群级资源的风险显著上升。
- 为图方便给审计账号授予exec权限,使只读边界形同虚设。
- 用RoleBinding绑定ClusterRole时忽略命名空间限制,造成权限范围超出预期。
- 临时提权后未设置到期回收机制,绑定关系长期残留。
- 只配置RBAC而不开启或留存审计日志,事后无法还原操作过程。
总体而言,K8s权限配置的目标不是把权限做得越细越好,而是让开发、运维、审计三类账号各自停留在职责所需的边界内,并让这条边界可查、可改、可追溯。配合命名空间隔离、身份组管理与定期权限复核,可以在不增加过多运维负担的前提下,显著降低越权操作与合规风险。