Kubernetes 中的基于角色的访问控制 (RBAC)
想象一下管理一个繁忙的 Kubernetes 集群,其中多个团队部署应用程序、监控服务并排查问题。如果没有适当的访问控制,就会出现混乱,导致开发者意外修改关键资源,或未经授权的用户访问敏感数据。为了防止此类情况,Kubernetes 提供了基于角色的访问控制 (RBAC),这是一种基于用户角色的访问调控机制。
在本章中,我们将探索 Kubernetes 中的 RBAC,了解其组件,并学习如何使用 YAML 配置实现它。到最后,我们将能够定义角色、分配权限,并维护一个安全的集群环境。
什么是 RBAC?
RBAC 是一种安全机制,帮助我们根据用户的角色管理权限。它确保只有授权用户才能访问或修改 Kubernetes 中的资源。它基于四个关键组件运行:
- Role − 定义可以在哪些资源上执行哪些操作。
- RoleBinding − 将 Role 分配给用户或组。
- ClusterRole − 适用于整个集群的 Role。
- ClusterRoleBinding − 将 ClusterRole 授予用户或组。
为什么我们需要 RBAC?
没有 RBAC,任何有权访问集群的用户都可以删除 pods、修改配置,甚至关闭服务。这是一个安全噩梦!
有了 RBAC,我们可以:
- 限制对敏感数据的访问。
- 防止意外或恶意操作。
- 根据团队职责组织权限。
步骤 1:启用 RBAC
大多数现代 Kubernetes 发行版默认启用了 RBAC。要验证其状态,请运行:
kubectl api-versions | grep rbac.authorization.k8s.io
如果 RBAC 已启用,将看到以下输出:
rbac.authorization.k8s.io/v1
如果未启用,您可以在 Kubernetes API server 中使用 --authorization-mode=RBAC 标志简单启用它。
步骤 2:创建 Role
Kubernetes 中的 Role 定义特定 namespace 内的权限。假设我们想授予开发团队在 development namespace 中列出和获取 pods 的权限。
创建 Namespace
在定义 Role 之前,我们首先确保 development namespace 存在:
$ kubectl create namespace development
输出
namespace/development created
创建 Role 定义
使用编辑器,创建一个名为 role.yaml 的文件并添加以下内容:
apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: namespace: development name: developer-role rules: - apiGroups: [""] resources: ["pods"] verbs: ["get", "list"]
应用 Role:
$ kubectl apply -f role.yaml
输出
role.rbac.authorization.k8s.io/developer-role created
这确保了 Role 在 development namespace 中成功创建。
步骤 3:将 Role 绑定到用户
RoleBinding 将 Role 链接到用户或组。让我们将 developer-role 分配给名为 alice 的用户。
使用编辑器,创建以下名为 rolebinding.yaml 的文件并添加以下内容:
apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: developer-rolebinding namespace: development subjects: - kind: User name: alice apiGroup: rbac.authorization.k8s.io roleRef: kind: Role name: developer-role apiGroup: rbac.authorization.k8s.io
应用 RoleBinding:
$ kubectl apply -f rolebinding.yaml
输出
role.rbac.authorization.k8s.io/developer-role created
现在,Alice 可以在 development namespace 中列出和获取 pods,但无法进行更改。
步骤 4:创建 ClusterRole
如果我们需要一个跨所有 namespace 应用的 role,我们可以简单地创建 ClusterRole。例如,让 Alice 查看集群中的所有 pods。
使用编辑器,创建以下名为 clusterrole.yaml 的文件并添加以下内容:
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: cluster-viewer rules: - apiGroups: [""] resources: ["pods"] verbs: ["get", "list"]
应用 ClusterRole:
$ kubectl apply -f clusterrole.yaml
输出
clusterrole.rbac.authorization.k8s.io/cluster-viewer created
步骤 5:绑定 ClusterRole
由于此 role 应用于整个集群,我们可以使用 ClusterRoleBinding 授予 Alice 这些权限。
使用编辑器,创建以下名为 clusterrolebinding.yaml 的文件并添加以下内容:
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: cluster-viewer-binding subjects: - kind: User name: alice apiGroup: rbac.authorization.k8s.io roleRef: kind: ClusterRole name: cluster-viewer apiGroup: rbac.authorization.k8s.io
应用 ClusterRoleBinding:
kubectl apply -f clusterrolebinding.yaml
输出
clusterrolebinding.rbac.authorization.k8s.io/cluster-viewer-binding created
现在,Alice 可以在任何 namespace 中列出 pods。
步骤 6:验证 RBAC 权限
要确认 Alice 的权限,请使用 kubectl auth can-i:
kubectl auth can-i list pods --namespace=development --as=alice
如果权限设置正确,将看到以下输出:
yes
如果 Alice 尝试未经授权的操作,例如删除 pod:
kubectl auth can-i delete pods --namespace=development --as=alice
输出将是:
no
步骤 7:管理和审计 RBAC
列出现有 Roles
要查看 namespace 中的所有 roles:
$ kubectl get roles -n development
输出
NAME CREATED AT developer-role 2025-03-06T17:13:24Z
对于 ClusterRoles:
$ kubectl get clusterroles
输出
NAME CREATED AT admin 2025-02-25T10:07:12Z argocd-application-controller 2025-02-27T11:38:34Z argocd-applicationset-controller 2025-02-27T11:38:34Z argocd-server 2025-02-27T11:38:34Z calico-cni-plugin 2025-02-26T13:55:30Z calico-kube-controllers 2025-02-26T13:55:30Z calico-node 2025-02-26T13:55:30Z cluster-admin 2025-02-25T10:07:11Z cluster-viewer 2025-03-06T17:25:05Z edit 2025-02-25T10:07:12Z kubeadm:get-nodes 2025-02-25T10:07:18Z system:aggregate-to-admin 2025-02-25T10:07:12Z system:aggregate-to-edit 2025-02-25T10:07:12Z system:aggregate-to-view 2025-02-25T10:07:12Z system:auth-delegator 2025-02-25T10:07:13Z system:basic-user 2025-02-25T10:07:12Z system:certificates.k8s.io:certificatesigningrequests:nodeclient 2025-02-25T10:07:13Z system:certificates.k8s.io:certificatesigningrequests:selfnodeclient 2025-02-25T10:07:13Z system:certificates.k8s.io:kube-apiserver-client-approver 2025-02-25T10:07:13Z system:certificates.k8s.io:kube-apiserver-client-kubelet-approver 2025-02-25T10:07:14Z system:certificates.k8s.io:kubelet-serving-approver 2025-02-25T10:07:13Z system:certificates.k8s.io:legacy-unknown-approver 2025-02-25T10:07:13Z system:controller:attachdetach-controller 2025-02-25T10:07:14Z system:controller:certificate-controller 2025-02-25T10:07:15Z system:controller:clusterrole-aggregation-controller 2025-02-25T10:07:14Z system:controller:cronjob-controller 2025-02-25T10:07:14Z system:controller:daemon-set-controller 2025-02-25T10:07:14Z
检查 RoleBindings
要在某个 namespace 中查看 RoleBindings:
$ kubectl get rolebindings -n development
输出
NAME ROLE AGE developer-rolebinding Role/developer-role 13m
对于 ClusterRoleBindings:
$ kubectl get clusterrolebindings
输出
NAME ROLE AGE argocd-application-controller ClusterRole/argocd-application-controller 7d5h argocd-applicationset-controller ClusterRole/argocd-applicationset-controller 7d5h argocd-server ClusterRole/argocd-server 7d5h calico-cni-plugin ClusterRole/calico-cni-plugin 8d calico-kube-controllers ClusterRole/calico-kube-controllers 8d calico-node ClusterRole/calico-node 8d cluster-admin ClusterRole/cluster-admin 9d cluster-viewer-binding ClusterRole/cluster-viewer 9m52s kubeadm:cluster-admins ClusterRole/cluster-admin 9d kubeadm:get-nodes ClusterRole/kubeadm:get-nodes 9d kubeadm:kubelet-bootstrap ClusterRole/system:node-bootstrapper 9d
删除 Role 或 RoleBinding
要删除一个 Role:
$ kubectl delete role developer-role -n development
输出
role.rbac.authorization.k8s.io "developer-role" deleted
要删除一个 RoleBinding:
$ kubectl delete rolebinding developer-rolebinding -n development
输出
rolebinding.rbac.authorization.k8s.io "developer-rolebinding" deleted
总结
在 Kubernetes 中实现基于角色的访问控制 (RBAC) 是保护集群安全并确保对资源具有适当访问权限的基础。
定期审计和管理 RBAC 配置可以确保您的访问控制适应不断演变的团队结构和项目需求。随着 Kubernetes 环境的增长,良好实施的 RBAC 策略对于维护安全高效的基础设施变得不可或缺。
通过遵循本章概述的步骤,您可以自信地在 Kubernetes 集群中设置和管理 RBAC。