K8S-RBAC 认证中心

在 Kubernetes(K8S)集群中,安全管理至关重要,其中认证、授权和准入控制是保障集群安全的三大核心机制。本文将详细介绍 K8S 的 RBAC(基于角色的访问控制)认证授权策略,帮助读者深入理解 K8S 的安全管理体系。

一、K8S 安全管理概述

K8S 集群的访问控制流程主要包括三个环节:认证(Authenticating)、授权(Authorization)和准入控制(Admission Control)。所有对集群的请求都必须经过这三个环节的检查,才能被 API Server 处理。

1.1 认证

认证是对客户端身份的验证,K8S 支持多种认证方式:

  1. 令牌(Token)认证:基于对称密钥的认证方式,客户端使用共享密钥进行身份验证。
  2. SSL 认证(TLS):双向认证机制,客户端和服务器互相验证对方的证书,确保通信安全。

K8S 中有两类账号:

  • User Account:面向人类用户的账号,跨命名空间。
  • Service Account :为 Pod 中的进程设计的账号,局限于所在命名空间,每个命名空间会自动创建一个default Service 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 规则中,资源可以通过名称或层级关系引用:

  1. 基础资源引用:直接指定资源名称,如podsdeployments
  2. 层级资源引用:使用 "/" 分割资源和子资源,如pods/log
  3. 特定资源实例:通过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 授权的常见操作:

  1. 为指定 Service Account 授权

shell

复制代码
kubectl create rolebinding my-sa-view --clusterrole=view --serviceaccount=my-namespace:my-sa --namespace=my-namespace
  1. 为默认 Service Account 授权

shell

复制代码
kubectl create rolebinding default-view --clusterrole=view --serviceaccount=my-namespace:default --namespace=my-namespace
  1. 为命名空间中所有 Service Account 授权

shell

复制代码
kubectl create rolebinding serviceaccounts-view --clusterrole=view --group=system:serviceaccounts:my-namespace --namespace=my-namespace

六、使用 kubectl 创建 RBAC 资源

  1. 在命名空间 rbac 中为用户 es 授权 admin ClusterRole

shell

复制代码
kubectl create rolebinding bob-admin-binding --clusterrole=admin --user=es --namespace=rbac
  1. 集群范围内为用户 root 授予 cluster-admin 权限

shell

复制代码
kubectl create clusterrolebinding cluster-binding --clusterrole=cluster-admin --user=root

七、限制用户操作集群

通过 SSL 证书创建用户并限制其权限:

  1. 生成证书

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
  1. 添加用户到 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
  1. 切换用户并授权

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 的核心安全机制,能够灵活地管理集群资源的访问权

相关推荐
叽里咕噜怪13 小时前
docker-compose 编排ruoy实践
运维·docker·容器
深耕AI17 小时前
【Docker命令】以LocalAI部署为例
运维·docker·容器
深耕AI17 小时前
如何深入理解 `docker ps` 输出:从容器健康状态变化说起
docker·容器·rpc
hanyi_qwe18 小时前
Docker 镜像的创建 【docker (四)】
运维·docker·容器
幺零九零零21 小时前
Docker底层-Namespaces
运维·docker·容器
Ancelin安心21 小时前
Windows搭建和使用vulhub的一些常用命令
linux·运维·服务器·网络安全·docker·容器·vulhub
仰望星空的打工人1 天前
雨云云应用部署frp
服务器·docker·容器
汪碧康1 天前
【k8s-1.34.2安装部署】九.k8s多集群管理平台xkube-v3.9安装部署
云原生·容器·kubernetes·kubelet·xkube·eeenet
java_logo1 天前
LocalAI Docker 容器化部署指南
docker·容器·eureka·localai·docker部署localai·localai部署教程·localai部署文档
逆流°只是风景-bjhxcc1 天前
【k8s】Kubernetes 探针(livenessProbe、readinessProbe、startupProbe)
云原生·容器·kubernetes