一、安全机制的说明
Kubernetes作为一个分布式集群的管理工具,保证集群的安全性是其一个重要的任务。API Server是集群内部各个组件通信的中介,也是外部控制的入口。所以Kubernetes的安全机制基本就是围绕保护APIServer来设计的
Authentication:认证(Authentication)
Authorization:授权(Authorization)
Admission Control:准入控制(Admission Control)
Kubernetes Api Server:Kubernetes API 服务器(Kubernetes Api Server)
pod serviceAccount:Pod 服务账户(pod serviceAccount)
二、认证
1、分类
◆ HTTP Token 认证:通过一个 Token 来识别合法用户
▢ HTTP Token 的认证是用一个很长的特殊编码方式的并且难以被模仿的字符串 - Token 来表达客户的一种方式。Token 是一个很长的很复杂的字符串,每一个 Token 对应一个用户名存储在 API Server 能访问的文件中。当客户端发起 API 调用请求时,需要在 HTTP Header 里放入 Token
◆ HTTP Base 认证:通过 用户名+密码 的方式认证
▢ 用户名+:+密码 用 BASE64 算法进行编码后的字符串放在 HTTP Request 中的 Header Authorization 域里发送给服务端,服务端收到后进行解码,获取用户名及密码
◆ 最严格的 HTTPS 证书认证:基于 CA 根证书签名的客户端身份认证方式
2、认证模式
双向的https认证,能达到金融级别

3、需要认证的节点
4、需要吗
5、证书签发方式
除了kubelet能自动签发,剩下的都得手动
7、kubeconfig
8、ServiceAccount
组成
补充
.总结
ApiServer 需要认证的类型
组件类认证(无需加密)
认证方式:通过 127.0.0.1 非安全地址访问
适用场景:基于 Kubeadm 部署且与 ApiServer 处于同一台机器
具体组件:
Controller Manager
Scheduler
需要加密的认证类型
证书手动颁发
适用组件:
kube-proxy
kubectl
证书自动颁发
适用组件:
- kubelet
Pod 与 Service Account (SA) 认证凭证
安全凭证组成:
ca.crt
集群的根证书
用于 Pod 确认 ApiServer 的安全性
token
使用 ApiServer 的私钥签发
基于 JWT 标准的字符串
用于 ApiServer 确认 Pod 的安全性
namespace
- 用于标识当前 Pod 的作用域
三、鉴权
1、类型
上面认证过程,只是确认通信的双方都确认了对方是可信的,可以相互通信。而鉴权是确定请求方有哪些资源的权限。API Server 目前支持以下几种授权策略(通过 API Server 的启动参数"--authorization-mode"设置)
◆ AlwaysDeny:表示拒绝所有的请求,一般用于测试
◆ AlwaysAllow:允许接收所有请求,如果集群不需要授权流程,则可以采用该策略
◆ ABAC(Attribute-Based Access Control):基于属性的访问控制,表示使用用户配置的授权规则对用户请求进行匹配和控制
◆ Webhook:通过调用外部 REST 服务对用户进行授权
◆ RBAC(Role-Based Access Control):基于角色的访问控制,现行默认规则
2、RBAC
资源对象
RBAC引入了4个新的顶级资源对象:Role(角色)、ClusterRole(集群角色)、RoleBirding(角色绑定)、ClusterRoleBinding(集群角色绑定),4种对象类型均可以通过kubectl与API操作.
用户绑定角色、角色绑定权限
用户哪里来
3、Role 角色
在RBACAPI中,Role表示一组规则权限,权限只会增加(累加权限),不存在一个资源一开始就有很多权限而通过RBAC对其进行减少的操作;Role可以定义在一个namespace中,如果想要跨namespace则可以创建ClusterRole
4、集群角色 clusterRole
ClusterRole具有与Role相同的权限角色控制能力,不同的是ClusterRole是集群级别的,ClusterRole
可以用于:
集群级别的资源控制(例如node访问权限)
非资源型endpoints(例如`/health`访问)
所有命名空间资源控制(例如pods)
5、角色绑定 Rolebinding + role,名字空间
RoloBinding可以将角色中定义的权限授予用户或用户组,RoleBinding包含一组权限列表(subjects),权限列表中包含有不同形式的待授予权限资源类型(users,groups,or service accounts);RoloBinding同样包含对被Bind的Role引用;RoleBinding适用于某个命名空间内授权,而ClusterRoleBinding适用于集群范围内的授权
6、集群角色绑定 rolebinding + clusterRole,名字空间
RoleBinding同样可以引用ClusterRole来对当前namespace内用户、用户组或ServiceAccount进行授权,这种操作允许集群管理员在整个集群内定义一些通用的ClusterRRole,然后在不同的namespace中使用RoleBinding来引用
7、集群角色绑定
使用ClusterRoleBinding可以对整个集群中的所有命名空间资源权限进行授权;以下
ClusterRoleBinding样例展示了授权manager组内所有用户在全部命名空间中对secrets进行访问
8、Resources
Kubernetes集群内一些资源一般以其名称字符串来表示,这些字符串一般会在API的URL地址中出现;
同时某些资源也会包含子资源,例如logs资源就属于pods的子资源原,API中URL样例如下
如果要在RBAC授权模型中控制这些子资源的访问权限,可以通过/分隔符来实现,以下是一个定义pods资源logs访问权限的Role定义样例
9、Subjects
RoleBinding 和 ClusterRoleBinding 可以将 Role 绑定到 Subjects;Subjects 可以是 groups、users 或者 service accounts
Subjects 中 Users 使用字符串表示,它可以是一个普通的名字字符串,如 "alice";也可以是 email 格式的邮箱地址,如 "wangyanglinux@163.com";甚至是一组字符串形式的数字 ID 。但是 Users 的前缀 system: 是系统保留的,集群管理员应该确保普通用户不会使用这个前缀格式
Groups 书写格式与 Users 相同,都为一个字符串,并且没有特定的格式要求;同样 system: 前缀为系统保留
10、资源分割
创还能一个用户只能管理dev名字空间
cd /etc/kubernetes/pki/
vi gevuser.json
{ "CN": "devuser", "hosts": [], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "ST": "BeiJing", "L": "BeiJing", "O": "k8s", "OU": "system" } ] }
下载证书,本地有
# 下载CFSSL工具 wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 mv cfssl_linux-amd64 /usr/local/bin/cfssl wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 mv cfssljson_linux-amd64 /usr/local/bin/cfssljson wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 mv cfssl-certinfo_linux-amd64 /usr/local/bin/cfssl-certinfo
上传到,/usr/local/bin
加入权限
chmod a+x /usr/local/bin/cfssl*
生成devuser证书
cfssl gencert -ca=ca.crt -ca-key=ca.key -profile=kubernetes devuser.json | cfssljson -bare devuser
设置集群参数
export KUBE_APISERVER="https://192.168.125.101:6443" kubectl config set-cluster kubernetes \ --certificate-authority=ca.crt \ --embed-certs=true \ --server=${KUBE_APISERVER} \ --kubeconfig=devuser.kubeconfig
设置上下文
kubectl config set-context kubernetes \ --cluster=kubernetes \ --user=devuser \ --namespace=dev \ --kubeconfig=devuser.kubeconfig
创建名字空间
kubectl create ns dev
绑定
kubectl create rolebinding devuser-admin-binding --clusterrole=admin --user=devuser --namespace=dev # 设置默认上下文 kubectl config use-context kubernetes --kubeconfig=devuser.kubeconfig
没权限,不能get
创建一个dev的用户,密码123,去找家目录下的配置文件
11、资源与角色类型的匹配

12、常见集群角色
- view ClusterRole(查看角色)
权限范围:允许读取一个命名空间中的大多数资源
排除资源 :不能读取 Role、RoleBinding 和 Secret
适用场景:适合只需要查看权限的用户或服务账户
- edit ClusterRole(编辑角色)
权限范围:允许读取和修改 Secret
排除资源 :不能查看或修改 Role 和 RoleBinding
安全考虑:防止权限扩散,确保安全边界
适用场景:适合需要修改应用配置但不涉及权限管理的用户
- admin ClusterRole(管理员角色)
权限范围 :赋予对命名空间中资源的完全控制权
包含权限:可以读取和修改命名空间中的任何资源
排除资源:ResourceQuota 和命名空间资源本身
与 edit 的主要区别 :可以查看和修改 Role 和 RoleBinding
适用场景:命名空间级别的管理员
- cluster-admin ClusterRole(集群管理员角色)
权限范围 :对 Kubernetes 集群的完全控制权限
权限级别:最高权限级别,相当于集群超级用户
适用场景:集群运维管理员,需要全局管理权限的用户
🎯 使用建议
最小权限原则:根据实际需求分配最小必要的角色
权限隔离:通过 RoleBinding 将角色绑定到特定命名空间
安全审计:定期审查集群角色绑定,防止权限滥用