在 Kubernetes(K8S)集群中,安全管理至关重要,其中认证、授权和准入控制是保障集群安全的三大核心机制。本文将详细介绍 K8S 的 RBAC(基于角色的访问控制)认证授权策略,帮助读者深入理解 K8S 的安全管理体系。
一、K8S 安全管理概述
K8S 集群的访问控制流程主要包括三个环节:认证(Authenticating)、授权(Authorization)和准入控制(Admission Control)。所有对集群的请求都必须经过这三个环节的检查,才能被 API Server 处理。
1.1 认证
认证是对客户端身份的验证,K8S 支持多种认证方式:
- 令牌(Token)认证:基于对称密钥的认证方式,客户端使用共享密钥进行身份验证。
- SSL 认证(TLS):双向认证机制,客户端和服务器互相验证对方的证书,确保通信安全。
K8S 中有两类账号:
- User Account:面向人类用户的账号,跨命名空间。
- Service Account :为 Pod 中的进程设计的账号,局限于所在命名空间,每个命名空间会自动创建一个
defaultService Account。
查看 Pod 使用的 Service Account:
shell
kubectl get pods <pod-name> -o yaml | grep "serviceAccountName"
查看命名空间中的 Service Account:
shell
kubectl get sa
1.2 授权
授权是在认证通过后,确定客户端是否有权限执行特定操作的过程。K8S 1.6 之后,RBAC 成为主要的授权机制。
常用的授权插件有:
- Node(节点认证)
- ABAC(基于属性的访问控制)
- RBAC(基于角色的访问控制)
- Webhook(基于 HTTP 回调的访问控制)
1.3 准入控制
准入控制器位于 API Server 中,在对象被持久化之前拦截请求,用于修改或验证请求对象。常用的准入控制器包括 ServiceAccount、NamespaceLifecycle、LimitRanger 等。
二、RBAC 认证授权策略
RBAC(基于角色的访问控制)通过将权限分配给角色,再将角色绑定到用户,实现灵活的权限管理。RBAC 包含四个核心资源对象:Role、ClusterRole、RoleBinding 和 ClusterRoleBinding。
2.1 Role(角色)
Role 是命名空间内的权限集合,仅对所在命名空间的资源有效。
示例:定义一个读取 Pod 的 Role
yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: rbac
name: pod-read
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "watch", "list"]
2.2 ClusterRole(集群角色)
ClusterRole 是集群级别的权限集合,可用于:
- 集群范围的资源(如 Node)
- 非资源型路径(如 /healthz)
- 所有命名空间的资源
示例:定义一个访问所有 Secrets 的 ClusterRole
yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: secrets-clusterrole
rules:
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get", "watch", "list"]
2.3 RoleBinding 和 ClusterRoleBinding(角色绑定)
RoleBinding 用于将 Role 或 ClusterRole 绑定到命名空间内的用户,ClusterRoleBinding 用于将 ClusterRole 绑定到集群范围内的用户。
示例 1:将 pod-read 角色绑定到用户 es(命名空间 rbac)
yaml
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
示例 2:集群范围内绑定 ClusterRole
yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: read-secret-global
subjects:
- kind: Group
name: manager
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: secret-read
apiGroup: rbac.authorization.k8s.io
三、资源引用方式
在 RBAC 规则中,资源可以通过名称或层级关系引用:
- 基础资源引用:直接指定资源名称,如
pods、deployments - 层级资源引用:使用 "/" 分割资源和子资源,如
pods/log - 特定资源实例:通过
resourceNames指定具体资源名称
示例:授权读取 Pod 和 Pod 日志
yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: logs-reader
namespace: default
rules:
- apiGroups: [""]
resources: ["pods", "pods/log"]
verbs: ["get", "list"]
四、常见角色和绑定示例
4.1 角色示例
- 允许读写 deployments 资源
yaml
rules:
- apiGroups: ["extensions", "apps"]
resources: ["deployments"]
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
- 允许访问节点资源(需使用 ClusterRole)
yaml
rules:
- apiGroups: [""]
resources: ["nodes"]
verbs: ["get", "list", "watch"]
4.2 绑定示例
- 绑定用户
yaml
subjects:
- kind: User
name: alice
apiGroup: rbac.authorization.k8s.io
- 绑定 Service Account
yaml
subjects:
- kind: ServiceAccount
name: default
namespace: kube-system
- 绑定所有认证用户
yaml
subjects:
- kind: Group
name: system:authenticated
apiGroup: rbac.authorization.k8s.io
五、Service Account 授权管理
为 Service Account 授权的常见操作:
- 为指定 Service Account 授权
shell
kubectl create rolebinding my-sa-view --clusterrole=view --serviceaccount=my-namespace:my-sa --namespace=my-namespace
- 为默认 Service Account 授权
shell
kubectl create rolebinding default-view --clusterrole=view --serviceaccount=my-namespace:default --namespace=my-namespace
- 为命名空间中所有 Service Account 授权
shell
kubectl create rolebinding serviceaccounts-view --clusterrole=view --group=system:serviceaccounts:my-namespace --namespace=my-namespace
六、使用 kubectl 创建 RBAC 资源
- 在命名空间 rbac 中为用户 es 授权 admin ClusterRole
shell
kubectl create rolebinding bob-admin-binding --clusterrole=admin --user=es --namespace=rbac
- 集群范围内为用户 root 授予 cluster-admin 权限
shell
kubectl create clusterrolebinding cluster-binding --clusterrole=cluster-admin --user=root
七、限制用户操作集群
通过 SSL 证书创建用户并限制其权限:
- 生成证书
shell
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
shell
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
- 切换用户并授权
shell
kubectl config use-context lucky@kubernetes
kubectl create ns lucky
kubectl create rolebinding lucky -n lucky --clusterrole=cluster-admin --user=lucky
通过以上步骤,用户 lucky 将仅在 lucky 命名空间拥有管理员权限,无法操作其他命名空间的资源,实现了权限的精细化控制。
RBAC 作为 K8S 的核心安全机制,能够灵活地管理集群资源的访问权