十六、kubernetes 1.29 之 集群安全机制

一、安全机制的说明

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) 认证凭证

安全凭证组成:

  1. ca.crt

    • 集群的根证书

    • 用于 Pod 确认 ApiServer 的安全性

  2. token

    • 使用 ApiServer 的私钥签发

    • 基于 JWT 标准的字符串

    • 用于 ApiServer 确认 Pod 的安全性

  3. 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、常见集群角色

  1. view ClusterRole(查看角色)​
  • 权限范围​:允许读取一个命名空间中的大多数资源

  • 排除资源 ​:​不能读取 Role、RoleBinding 和 Secret

  • 适用场景​:适合只需要查看权限的用户或服务账户

  1. edit ClusterRole(编辑角色)​
  • 权限范围​:允许读取和修改 Secret

  • 排除资源 ​:​不能查看或修改 Role 和 RoleBinding

  • 安全考虑​:防止权限扩散,确保安全边界

  • 适用场景​:适合需要修改应用配置但不涉及权限管理的用户

  1. admin ClusterRole(管理员角色)​
  • 权限范围 ​:赋予对命名空间中资源的完全控制权

  • 包含权限​:可以读取和修改命名空间中的任何资源

  • 排除资源​:ResourceQuota 和命名空间资源本身

  • 与 edit 的主要区别 ​:​可以查看和修改 Role 和 RoleBinding

  • 适用场景​:命名空间级别的管理员

  1. cluster-admin ClusterRole(集群管理员角色)​
  • 权限范围 ​:对 Kubernetes 集群的完全控制权限

  • 权限级别​:最高权限级别,相当于集群超级用户

  • 适用场景​:集群运维管理员,需要全局管理权限的用户

🎯 使用建议

  • 最小权限原则​:根据实际需求分配最小必要的角色

  • 权限隔离​:通过 RoleBinding 将角色绑定到特定命名空间

  • 安全审计​:定期审查集群角色绑定,防止权限滥用

四、准入控制

1、功能

相关推荐
迎仔8 分钟前
05-AI与网络安全
人工智能·安全·web安全
小Pawn爷8 分钟前
1.Docker基础
运维·docker·容器
chinesegf10 分钟前
清理docker残留镜像images
运维·docker·容器
QT.qtqtqtqtqt27 分钟前
SQL注入漏洞
java·服务器·sql·安全
小Pawn爷29 分钟前
2.Docker的存储
运维·docker·容器
广州中轴线1 小时前
OpenStack on Kubernetes 生产部署实战(十七)
容器·kubernetes·openstack
礼拜天没时间.1 小时前
自定义镜像制作——从Dockerfile到镜像
linux·docker·容器·centos·bash
临水逸2 小时前
一次路径穿越漏洞引发的NAS安全危机:飞牛fnOS漏洞深度剖析与用户自救指南
网络·安全·web安全
luffy54592 小时前
windows下通过docker-desktop创建redis实例
windows·redis·docker·容器
狮驼岭的小钻风2 小时前
汽车V模型开发流程、ASPICE、汽车功能安全的基石是国际标准 ISO 26262
网络·安全·汽车