RBAC 授权

KubernetesBeginner
立即练习

简介

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 保护了集群。

你完成了以下操作:

  1. 创建具有有限只读权限的 Role(「门禁卡」)。
  2. 创建 RoleBinding,将这张权限卡授予用户 jane。
  3. 验证 jane 可以查看资源,但不能修改资源。

这是 Kubernetes 多用户安全的基础。不要向所有人授予完整的管理员权限!