排查Kubernetes集群的RBAC权限滥用,不能只盯着有没有越权漏洞,更要关注合法的权限是否被过度授予,或者被恶意进程、失陷容器利用。很多安全事件中,攻击者并不是通过0day打穿集群,而是利用了一个拥有过高权限的ServiceAccount,通过合法的API调用完成了横向移动。所以,排查的第一步是梳理集群中所有角色绑定,找出那些绑定了cluster-admin或拥有pods、secrets、exec、create等高风险动词的主体。
直接从kubectl命令入手,查看所有ClusterRoleBinding和RoleBinding,输出格式要包含主体类型、主体名称、绑定的角色以及命名空间。这条命令可以快速生成一份完整的权限清单:
kubectl get clusterrolebindings,rolebindings --all-namespaces -o custom-columns='KIND:.kind,NAMESPACE:.metadata.namespace,NAME:.metadata.name,ROLE:.roleRef.name,SUBJECTS:.subjects[*].kind,SUBJECT_NAME:.subjects[*].name' | grep -v '<none>'
输出结果中,重点关注Subject类型为ServiceAccount、User或Group的条目。如果某个ServiceAccount绑定了cluster-admin,但该账户只属于一个业务命名空间,这就构成了明显的权限滥用风险。接下来需要确认这个ServiceAccount是否被Pod实际挂载,以及该Pod是否真的需要集群范围的完全控制权。
定位高风险ServiceAccount后,必须追溯其使用情况。通过以下命令可以列出所有挂载了指定ServiceAccount的Pod:
kubectl get pods --all-namespaces -o json | jq -r '.items[] | select(.spec.serviceAccountName=="目标SA名称") | "\(.metadata.namespace)/\(.metadata.name)"'
如果发现没有任何Pod挂载该ServiceAccount,说明这是一个悬空的高权限账户,应立即清理。如果有Pod在使用,则需要深入检查该Pod的运行时行为,判断其是否真正需要所列权限。很多时候,开发人员为了调试方便,临时给default ServiceAccount绑定了高权限,事后忘记回收,这就埋下了隐患。
排查完静态绑定,还要关注动态的权限提升路径。Kubernetes中,拥有create pod权限的用户,实际上可以通过创建特权Pod来逃逸到节点,进而控制整个集群。同样,拥有impersonate权限的用户可以模拟其他高权限账户进行操作。排查时需要特别留意Role或ClusterRole中是否包含了这些危险动词。可以写一个简单的脚本,遍历所有Role和ClusterRole,检查rules中是否出现了escalate、impersonate、create pods或update deployments等组合。
另一个容易被忽视的滥用点是RoleBinding的跨命名空间引用。虽然RoleBinding本身是命名空间级别的资源,但它可以引用集群级别的ClusterRole。这意味着,一个只存在于dev命名空间的ServiceAccount,如果通过RoleBinding绑定了某个拥有secrets读权限的ClusterRole,它就只能读取dev命名空间下的Secret。但如果该ClusterRole还被其他命名空间的RoleBinding引用,那么权限的扩散范围就需要重新评估。排查时,要逐一审查每个ClusterRole被哪些RoleBinding引用,确保其权限没有意外泄露到非目标命名空间。
审计日志是发现权限滥用的关键证据。如果集群开启了审计功能,可以直接查询apiserver的审计记录,过滤出由可疑ServiceAccount发起的API请求。重点关注响应码为200或201的创建、删除、更新操作,以及大量读取Secret的请求。审计日志的查询可以按用户和命名空间分组,统计每个主体在特定时间窗口内的操作频率。如果某个CI/CD系统的ServiceAccount突然开始列举所有命名空间的Pod,这很可能是凭据泄露的信号。
排查完现有风险后,安全策略的落地必须从最小权限原则出发,建立一套可执行的、自动化的约束机制。第一步是彻底清理所有非必要的cluster-admin绑定。除了集群核心组件和经过严格审批的管理员账户外,任何业务应用都不应直接持有cluster-admin权限。对于确实需要跨命名空间操作的系统组件,比如日志收集器或监控代理,应创建专用的ClusterRole,仅授予读取pod、nodes和metrics的权限,并严格限制verbs为get、list和watch。
接下来,为每个命名空间建立独立的ServiceAccount,并严格遵循“一个应用一个账户”的原则。禁止多个无关应用共享同一个ServiceAccount,避免权限混淆。在部署应用时,通过PodSpec显式指定serviceAccountName,而不是依赖命名空间的default账户。同时,利用automountServiceAccountToken字段,对于完全不需要访问API Server的Pod,直接关闭Token的自动挂载,从根本上阻断权限滥用的可能。
策略落地不能仅靠人工审核,必须借助准入控制器实现自动化校验。OPA Gatekeeper或Kyverno这类策略引擎,可以编写自定义规则,在资源创建时拦截不符合安全要求的配置。例如,可以创建一条ConstraintTemplate,禁止任何Pod挂载包含cluster-admin绑定的ServiceAccount。规则逻辑是:当检测到Pod的serviceAccountName字段指向的ServiceAccount,在集群范围内存在cluster-admin绑定关系时,直接拒绝部署并给出明确提示。
另一条关键策略是限制RoleBinding的创建权限本身。普通开发者不应拥有创建RoleBinding或ClusterRoleBinding的权限,否则最小权限原则很容易被绕过。可以将这类操作收归到集群管理员或通过审批流程自动化的平台工具中。如果必须开放部分绑定权限,则利用准入控制器限制其只能绑定预先定义好的、权限范围受控的Role,并强制限定在特定命名空间内。
对于Secret的访问控制,需要实施更细粒度的策略。即使一个Pod需要读取Secret,也应该只允许它读取自身命名空间下特定名称的Secret,而不是整个命名空间的所有Secret。这可以通过RBAC中的resourceNames字段来实现。在定义Role时,明确列出允许访问的Secret名称,避免使用通配符。同时,结合Pod安全策略或Pod安全标准,限制容器以root用户运行、禁止添加特权、限制卷类型挂载,防止通过挂载宿主机路径或Docker Socket来绕过权限控制。
持续监控是策略落地的最后一道防线。部署Falco这类的运行时安全工具,编写规则检测异常的API调用行为。例如,当检测到某个Pod首次调用list secrets API,或者一个非系统Pod尝试创建ClusterRoleBinding时,立即生成告警。将这类告警接入安全信息与事件管理系统,与RBAC的静态分析结果进行关联,可以快速识别出权限滥用事件并启动响应流程。
定期执行权限审计也是必不可少的环节。使用kube-bench或kubescape等开源工具,可以自动化扫描集群中存在的权限配置问题,生成合规报告。将审计任务集成到CI/CD流水线或定时任务中,确保每一次配置变更后都能及时评估安全影响。对于发现的每一项高风险权限,都要追溯到具体的负责人和业务需求,形成闭环管理。只有将排查、策略、监控和审计形成一个持续运转的流程,才能真正遏制RBAC权限滥用,而不是仅仅做一次性的清理运动。
