| name | auditing-kubernetes-rbac-permissions |
| description | Kubernetes 基于角色的访问控制(RBAC)审计,系统性地审查角色、集群角色、绑定关系及服务账户权限,以识别过度宽松的访问配置、权限提升路径及违反最小权限原则的情况。 |
| domain | cybersecurity |
| subdomain | container-security |
| tags | ["containers","kubernetes","security","RBAC","access-control"] |
| version | 1.0 |
| author | mahipal |
| license | Apache-2.0 |
审计 Kubernetes RBAC 权限
概述
Kubernetes 基于角色的访问控制(RBAC)审计系统性地审查角色、集群角色、绑定关系及服务账户权限,以识别过度宽松的访问配置、权限提升路径及违反最小权限原则的情况。rbac-tool、KubiScan 和 rakkess 等工具可自动发现危险的权限组合。
前置条件
- 启用 RBAC 的 Kubernetes 集群(自 1.6 版本起为默认配置)
- 具有 cluster-admin 访问权限的 kubectl 以进行完整审计
- 已安装 rbac-tool、rakkess 或 KubiScan
核心概念
RBAC 组件
| 资源 | 作用域 | 用途 |
|---|
| Role | 命名空间 | 授予命名空间内的权限 |
| ClusterRole | 集群 | 授予集群范围的权限 |
| RoleBinding | 命名空间 | 在命名空间内将 Role/ClusterRole 绑定到主体 |
| ClusterRoleBinding | 集群 | 将 ClusterRole 绑定到集群范围的主体 |
危险权限组合
| 权限 | 风险等级 | 影响 |
|---|
* on * 资源 | 严重 | 等同于 cluster-admin |
| create pods | 高 | 可部署特权 Pod |
| create pods/exec | 高 | 可 exec 进入任意 Pod |
| get secrets | 高 | 可读取所有 Secret |
| create clusterrolebindings | 严重 | 可提升至 cluster-admin |
| impersonate users | 严重 | 可伪装成任意用户 |
| escalate on roles | 严重 | 可授予超出自身的权限 |
| bind on roles | 高 | 可创建新的角色绑定 |
实施步骤
步骤 1:枚举所有 RBAC 资源
kubectl get clusterroles -o name | wc -l
kubectl get clusterroles --no-headers | grep -v "system:"
kubectl get clusterrolebindings -o wide
kubectl get roles -A
kubectl get rolebindings -A -o wide
kubectl get clusterroles,clusterrolebindings,roles,rolebindings -A -o yaml > rbac-export.yaml
步骤 2:识别通配符权限
kubectl get clusterroles -o json | jq -r '
.items[] |
select(.rules[]? |
(.verbs | index("*")) and
(.resources | index("*"))
) |
.metadata.name'
kubectl get clusterroles -o json | jq -r '
.items[] |
select(.rules[]? |
(.verbs | index("create") or index("*")) and
(.resources | index("pods") or index("*"))
) |
.metadata.name'
kubectl get clusterroles -o json | jq -r '
.items[] |
select(.rules[]? |
(.verbs | index("get") or index("list") or index("*")) and
(.resources | index("secrets") or index("*"))
) |
.metadata.name'
步骤 3:检查服务账户权限
kubectl get serviceaccounts -A
for ns in $(kubectl get ns -o jsonpath='{.items[*].metadata.name}'); do
echo "=== $ns/default ==="
kubectl auth can-i --list --as=system:serviceaccount:$ns:default 2>/dev/null | grep -v "no"
done
kubectl get clusterrolebindings -o json | jq -r '
.items[] |
select(.roleRef.name == "cluster-admin") |
{binding: .metadata.name, subjects: [.subjects[]? | {kind, name, namespace}]}'
步骤 4:使用 rbac-tool 进行自动分析
kubectl krew install rbac-tool
kubectl rbac-tool viz --outformat dot | dot -Tpng > rbac-graph.png
kubectl rbac-tool who-can get secrets -A
kubectl rbac-tool who-can create pods -A
kubectl rbac-tool who-can '*' '*'
kubectl rbac-tool analysis
kubectl rbac-tool auditgen > rbac-audit.yaml
步骤 5:检查权限提升路径
kubectl get clusterroles -o json | jq -r '
.items[] |
select(.rules[]? |
(.verbs | index("escalate") or index("bind") or index("impersonate")) and
(.resources | index("clusterroles") or index("roles") or index("clusterrolebindings") or index("rolebindings") or index("users") or index("groups") or index("serviceaccounts"))
) |
.metadata.name'
kubectl get clusterroles -o json | jq -r '
.items[] |
select(.rules[]? |
(.verbs | index("impersonate"))
) |
{name: .metadata.name, rules: .rules}'
步骤 6:使用 KubiScan 审计
pip install kubiscan
kubiscan --risky-roles
kubiscan --risky-clusterroles
kubiscan --risky-subjects
kubiscan --risky-pods
kubiscan --all
验证命令
kubectl auth can-i create pods --as=system:serviceaccount:default:myapp
kubectl auth can-i --list --as=developer@example.com
kubescape scan framework nsa --controls-config rbac-controls.json
kubectl auth can-i delete nodes --as=system:serviceaccount:app:web-server
参考资料