Kubernetes RBAC Forbidden 排查:确认谁在访问什么

从请求身份、资源作用域和角色绑定三方面定位 Forbidden,并用最小权限原则完成修复。

文章目录 · 4 节

API 返回 Forbidden 说明身份认证通常已经成功,但授权规则不允许当前动作。排查的核心是明确主体、verb、资源、API Group 和命名空间五个要素。

复现授权判断

kubectl auth can-i get pods -n production --as=system:serviceaccount:ops:reader
kubectl auth can-i --list -n production --as=system:serviceaccount:ops:reader
kubectl api-resources | grep -i deployment

先从错误日志获取真实身份。Pod 默认使用其 ServiceAccount,用户经代理或 OIDC 登录后则可能带有额外 group,不能只按 kubeconfig 中的名字推断。

检查绑定链路

kubectl get role,rolebinding -n production -o yaml
kubectl get clusterrole,clusterrolebinding -o yaml
kubectl describe rolebinding app-reader -n production

RoleBinding 可以引用 ClusterRole,但权限仍限制在绑定所在命名空间。子资源需要单独授权,例如读取 Pod 日志对应 pods/log

修复原则

  • 仅添加报错所需的 verb 和 resource
  • 能用 Role 就不要创建 ClusterRoleBinding
  • 不用 cluster-admin 验证后长期保留
  • 对 impersonation、secrets 和 exec 权限进行额外审计

收尾清单

用原身份再次执行 kubectl auth can-i 和实际请求,并检查审计日志。将临时绑定设置负责人和到期时间,避免权限永久堆积。