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

相关推荐
阿里云云原生2 天前
阿里云获评 Agentic AI 开发平台领导者,函数计算 AgentRun 赢下关键分!
云原生
蝎子莱莱爱打怪3 天前
Centos7中一键安装K8s集群以及Rancher安装记录
运维·后端·kubernetes
崔小汤呀3 天前
Docker部署Nacos
docker·容器
缓解AI焦虑3 天前
Docker + K8s 部署大模型推理服务:资源划分与多实例调度
docker·容器
阿里云云原生3 天前
MSE Nacos Prompt 管理:让 AI Agent 的核心配置真正可治理
微服务·云原生
阿里云云原生3 天前
当 AI Agent 接管手机:移动端如何进行观测
云原生·agent
阿里云云原生3 天前
AI 原生应用开源开发者沙龙·深圳站精彩回顾 & PPT下载
云原生
阿里云云原生3 天前
灵感启发:日产文章 100 篇,打造“实时热点洞察”引擎
云原生
1candobetter3 天前
Docker Compose Build 与 Up 的区别:什么时候必须重建镜像
docker·容器·eureka
~莫子3 天前
Haproxy七层负载详解+实验详细代码
云原生