Kubernetes RBAC 认证授权
在 Kubernetes RBAC 认证授权详解Kubernetes 集群中,安全控制至关重要,其中认证、授权和准入控制构成了三层安全防线。本文将重点解析基于角色的访问控制(RBAC)机制,帮助你理解如何在 K8s 中实现精细化的权限管理。
一、K8s 安全架构概述
Kubernetes 集群的所有访问都通过 kube-apiserver 进行,任何请求都需要经过三个阶段的检查:
- 认证(Authentication):验证客户端身份,确认 "你是谁"
- 授权(Authorization):检查权限,决定 "你能做什么"
- 准入控制(Admission Control):对请求进行额外验证和修改,在对象持久化前生效
认证机制
K8s 支持多种认证方式:
- 令牌(Token)认证:基于共享密钥的对称认证
- SSL/TLS 认证:双向证书验证,确保通信双方身份
K8s 中有两类账号:
- User Account:面向人类用户的账号,跨命名空间
- Service Account:面向 Pod 中进程的账号,属于特定命名空间,每个命名空间默认创建一个
default服务账号
查看当前 Pod 使用的服务账号:
shell
kubectl get pods <pod-name> -o yaml | grep "serviceAccountName"
二、RBAC 授权机制
RBAC(基于角色的访问控制)是 K8s 推荐的授权方式,通过将权限分配给角色,再将角色绑定给用户,实现灵活的权限管理。
RBAC 包含四个核心资源对象:
1. Role(角色)
命名空间级别的权限集合,仅对所属命名空间有效。
示例:创建一个能读取 Pod 的角色
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: rbac
name: pod-read
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "watch", "list"]
2. ClusterRole(集群角色)
集群级别的权限集合,可用于:
- 集群范围的资源(如 Node)
- 非资源型路径(如
/healthz) - 所有命名空间的资源
示例:创建一个能访问所有 Secrets 的集群角色
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: secrets-clusterrole
rules:
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get", "watch", "list"]
3. RoleBinding(角色绑定)
将角色绑定到用户,仅在当前命名空间有效。可以绑定 Role 或 ClusterRole,但绑定 ClusterRole 时也仅对当前命名空间生效。
示例:将 pod-read 角色绑定给用户 es
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: pod-read-bind
namespace: rbac
subjects:
- kind: User
name: es
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: pod-read
apiGroup: rbac.authorization.k8s.io
4. ClusterRoleBinding(集群角色绑定)
将 ClusterRole 绑定到用户,在整个集群范围内有效。
三、资源引用方式
在 RBAC 规则中,资源可以通过以下方式引用:
- 基础资源引用:直接使用资源名称,如 "pods"、"deployments"
- 上下级资源引用:使用 "/" 分割,如 "pods/log"
- 特定资源实例:通过
resourceNames指定具体资源名称
示例:授权访问特定 ConfigMap
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: configmap-update
rules:
- apiGroups: [""]
resources: ["configmap"]
resourceNames: ["my-configmap"]
verbs: ["get", "update"]
查看集群支持的资源类型:
kubectl api-resources
四、常见角色绑定示例
绑定不同类型的主体:
- 用户绑定
subjects:
- kind: User
name: alice
apiGroup: rbac.authorization.k8s.io
- 组绑定
subjects:
- kind: Group
name: manager
apiGroup: rbac.authorization.k8s.io
- 服务账号绑定
subjects:
- kind: ServiceAccount
name: default
namespace: kube-system
- 所有认证用户
subjects:
- kind: Group
name: system:authenticated
apiGroup: rbac.authorization.k8s.io
五、Service Account 授权管理
为服务账号授权的常见场景:
- 为特定服务账号授权
kubectl create rolebinding my-sa-view \
--clusterrole=view \
--serviceaccount=my-namespace:my-sa \
--namespace=my-namespace
- 为命名空间默认服务账号授权
kubectl create rolebinding default-view \
--clusterrole=view \
--serviceaccount=my-namespace:default \
--namespace=my-namespace
- 为命名空间所有服务账号授权
kubectl create rolebinding serviceaccounts-view \
--clusterrole=view \
--group=system:serviceaccounts:my-namespace \
--namespace=my-namespace
六、实战:创建受限用户
下面演示如何创建一个只能操作特定命名空间的用户:
- 生成证书和私钥
cd /etc/kubernetes/pki/
umask 077; openssl genrsa -out lucky.key 2048
openssl req -new -key lucky.key -out lucky.csr -subj "/CN=lucky"
openssl x509 -req -in lucky.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out lucky.crt -days 3650
- 添加用户到 kubeconfig
kubectl config set-credentials lucky \
--client-certificate=./lucky.crt \
--client-key=./lucky.key \
--embed-certs=true
kubectl config set-context lucky@kubernetes \
--cluster=kubernetes \
--user=lucky
- 切换到新用户(此时无任何权限)
kubectl config use-context lucky@kubernetes
- 为用户授权特定命名空间权限
kubectl create ns lucky
kubectl create rolebinding lucky -n lucky \
--clusterrole=cluster-admin \
--user=lucky
- 验证权限
# 在授权的命名空间有操作权限
kubectl get pods -n lucky
# 在其他命名空间无权限
kubectl get pods -n default # 会报错
总结
RBAC 提供了灵活且强大的权限管理机制,通过角色和绑定的组合,可以实现精细化的访问控制。在实际使用中,应遵循最小权限原则,为每个用户或服务账号只分配必要的权限,以提高集群的安全性。
合理规划 RBAC 权限不仅能保护集群资源安全,还能规范团队协作流程,是 Kubernetes 集群管理的重要组成部分。
更多推荐
所有评论(0)