跳到主要内容

使用 kubectl 测试 RBAC

kubectl 支持 auth can-i 命令,可以用来测试当前用户或指定用户/组是否有权限执行某个操作。这个命令非常有用,可以帮助我们验证 RBAC 权限配置是否正确

基本用法

kubectl auth can-i <动作> <资源> [选项]

测试当前用户

kubectl auth can-i create pods
kubectl auth can-i delete deployments -n default
kubectl auth can-i list secrets --all-namespaces

测试 ServiceAccount

kubectl auth can-i get pods \
--as=system:serviceaccount:default:app-controller

测试用户/组

kubectl auth can-i create deployments --as=alice
kubectl auth can-i get pods --as-group=developers

列出所有权限

kubectl auth can-i --list
kubectl auth can-i --list --as=system:serviceaccount:default:app-controller

实战示例

场景:验证应用权限配置

配置的 ClusterRole:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: app-controller
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "watch"]
- apiGroups: [""]
resources: ["configmaps"]
verbs: ["get", "list", "create", "update"]

测试权限:

SA="system:serviceaccount:default:app-controller"

# 应该有的权限
kubectl auth can-i get pods --as=$SA # yes
kubectl auth can-i list pods --as=$SA # yes
kubectl auth can-i create configmaps --as=$SA # yes

# 不应该有的权限
kubectl auth can-i delete pods --as=$SA # no
kubectl auth can-i get secrets --as=$SA # no

批量测试脚本

#!/bin/bash

SA="system:serviceaccount:default:app-controller"
tests=(
"pods:get:yes"
"pods:delete:no"
"configmaps:create:yes"
"secrets:get:no"
)

for test in "${tests[@]}"; do
IFS=':' read -r resource verb expected <<< "$test"
result=$(kubectl auth can-i $verb $resource --as=$SA 2>/dev/null)

if [ "$result" == "$expected" ]; then
echo "[PASS] $verb $resource"
else
echo "[FAIL] $verb $resource (expected: $expected, got: $result)"
fi
done

其他用法

测试子资源

kubectl auth can-i get pods/log
kubectl auth can-i create pods/exec

测试非资源 URL

kubectl auth can-i get --non-resource-url=/metrics
kubectl auth can-i get --non-resource-url=/healthz

测试特定资源名称

kubectl auth can-i get configmaps --resource-name=app-config

常用场景

# 集群管理员
kubectl auth can-i create namespaces
kubectl auth can-i delete nodes

# 开发人员
kubectl auth can-i create pods -n dev
kubectl auth can-i get pods/log -n dev

# ServiceAccount
kubectl auth can-i create deployments \
--as=system:serviceaccount:ci:deployer

# 安全审计
kubectl auth can-i list pods --as=system:anonymous