简介
Kubernetes 通常使用 RBAC(基于角色的访问控制)处理授权。
- 用户(User):员工,例如「Jane」。
- 角色(Role):具有特定访问权限的门禁卡,例如「可以进入服务器机房」「可以读取文档」。
- RoleBinding:将门禁卡交给员工的操作。
RBAC 很重要,因为集群访问不仅涉及身份认证。系统确认用户身份后,还需要判断该身份可以执行哪些操作。
在本实验中,你将扮演安全主管:
- 创建一张「访客通行证」(Role),允许持有者查看资源,但不能修改资源。
- 将这张通行证分配给名为
jane的用户。 - 验证 Jane 可以查看集群内容,但尝试修改内容时会被拒绝。
定义 Role
首先创建权限集合。我们需要一个「只读」角色。这个角色允许用户对 Pod 执行 list 和 get(读取)操作,但不允许创建或删除 Pod。
RBAC 负责 Kubernetes 的授权,而不是身份认证。身份认证回答「你是谁?」,授权回答「你可以做什么?」。本实验关注第二个问题:为特定资源类型明确指定允许执行的操作,这些操作称为 verbs。
创建名为 role.yaml 的文件:
nano role.yaml
粘贴以下 YAML 内容。此定义创建一个 Role,允许对 pods 执行 get、watch 和 list 操作。
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: pod-reader
rules:
- apiGroups: [""] ## "" indicates the core API group
resources: ["pods"]
verbs: ["get", "watch", "list"]
保存并退出(Ctrl+X、Y、Enter)。
现在,将这张权限卡应用到集群中:
kubectl apply -f role.yaml
确认 Role 已创建:
kubectl get roles
你应该能看到 pod-reader。
绑定 Role
现在我们已经有了权限卡(pod-reader)和员工(jane)。但 Jane 还没有这张卡。我们需要使用 RoleBinding 将两者关联起来。
Role 单独存在时不会授予任何权限,只有被 RoleBinding 引用后才会生效。这种分离是有意设计的:管理员可以先定义可重复使用的权限集合,再根据需要将它们分配给不同的用户、组或服务账号。
创建名为 rolebinding.yaml 的文件:
nano rolebinding.yaml
粘贴以下内容。它表示:「将 pod-reader 角色绑定给用户 jane」。
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-pods
namespace: default
subjects:
- kind: User
name: jane ## The employee
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: pod-reader ## The key card
apiGroup: rbac.authorization.k8s.io
保存并退出(Ctrl+X、Y、Enter)。
应用这个绑定:
kubectl apply -f rolebinding.yaml
现在,你已经正式授予 Jane 访问 default 命名空间的只读权限。
验证访问权限
如何测试这些权限?不需要退出当前账号,再以 Jane 的身份登录。Kubernetes 支持使用 --as 选项模拟用户身份,从而测试权限。
这是一种实用的管理技术。在将权限交给真实用户或自动化账号之前,先模拟该身份进行权限检查会更加安全。这样可以验证权限配置是否符合预期,同时避免在集群中产生不必要的影响。
验证 Jane 是否可以列出 Pod:
kubectl auth can-i list pods --as jane
输出应为 yes。
你还可以检查她是否可以获取某个 Pod 的详细信息:
kubectl auth can-i get pods --as jane
输出同样应为 yes。
这说明 RoleBinding 已正常生效。门禁卡可以通过门禁读取器了!
验证限制
安全性还体现在不能执行什么操作。由于 Jane 只有 pod-reader 角色,她应该严格禁止执行修改操作。
这正是最小权限原则的实际应用。与其授予宽泛权限,再希望用户谨慎操作,不如先仅授予完成任务所需的最少权限,只有在确实存在运维需求时才扩大权限范围。
检查 Jane 是否可以创建 Pod:
kubectl auth can-i create pods --as jane
输出应为 no。
检查 Jane 是否可以删除 Pod:
kubectl auth can-i delete pods --as jane
输出应为 no。
如果 Jane 实际执行这些命令,API 服务器会以「Forbidden」错误拒绝她的请求。这说明你的集群已受到保护,并遵循最小权限原则。
总结
在本实验中,你使用 RBAC 保护了集群。
你完成了以下操作:
- 创建具有有限只读权限的 Role(「门禁卡」)。
- 创建 RoleBinding,将这张权限卡授予用户
jane。 - 验证
jane可以查看资源,但不能修改资源。
这是 Kubernetes 多用户安全的基础。不要向所有人授予完整的管理员权限!


