Kubernetes 作为一个分布式集群的管理工具,保证集群的安全性是其一个重要的任务。API Server 是集群内部各个组件通信的中介, 也是外部控制的入口。所以 Kubernetes 的安全机制基本就是围绕保护 API Server 来设计的。
比如 kubectl 如果想向 API Server 请求资源,需要过三关,第一关是认证(Authentication),第二关是鉴权(Authorization), 第三关是准入控制(Admission Control),只有通过这三关才可能会被 K8S 创建资源。
1. Authentication:用于识别用户身份, 方式有: SSL证书,token, 用户名+密码等
2. Authorization:确认是否对资源具有相关的权限
3. Admission Control: 判断操作是否符合集群的要求
当kubectl ,ui,程序 等请求某个 k8s 接口,先认证(判断真伪),鉴权(是否有权限这么做?),
准入控制(能不能个这么干?)
三种客户端身份认证:
kube-apiserver
etcd
kubelet 连接kube-apiserver
kube-proxy连接 kube-apiserver
均采用 https传输方式
客户端携带一个token来请求server端,如果server端含有这个token,那么认证成功否则失败
比较原始的方式,在k8s中基本很少使用
RBAC(Role-Based Access Control,基于角色的访问控制):
负责完成授权(Authorization)工作。
根据API请求属性,决定允许还是拒绝。
Adminssion Control实际上是一个准入控制器插件列表,发送到API Server的请求都需要经过这个列表中的每个准入控制器 插件的检查,检查不通过,则拒绝请求。
RBAC(Role-Based Access Control,基于角色的访问控制),允许通过Kubernetes API动态配置策略。
• 角色
• 角色绑定
• 主体(subject)
用户或者用户组,服务账号,与具备某些权限的角色绑定,然后将该角色的权限继承过来,这一点类似阿里云的 ram 授权。这里需要注意 定义的角色是 Role作用域只能在指定的名称空间下有效,如果是ClusterRole可作用于所有名称空间下。
Rolebinding 和Role 对应,ClusterRoleBinding 和 ClusterRole 对应。
示例:为benjamin用户授权default命名空间Pod读取权限
1. 用K8S CA签发客户端证书
2. 生成kubeconfig授权文件
3. 创建RBAC权限策略
- mkdir /root/benjamin
-
- sh cert.sh
-
- cat > ca-config.json <
- {
- "signing": {
- "default": {
- "expiry": "87600h"
- },
- "profiles": {
- "kubernetes": {
- "usages": [
- "signing",
- "key encipherment",
- "server auth",
- "client auth"
- ],
- "expiry": "87600h"
- }
- }
- }
- }
- EOF
-
- cat > benjamin-csr.json <
- {
- "CN": "benjamin",
- "hosts": [],
- "key": {
- "algo": "rsa",
- "size": 2048
- },
- "names": [
- {
- "C": "CN",
- "ST": "BeiJing",
- "L": "BeiJing",
- "O": "k8s",
- "OU": "System"
- }
- ]
- }
- EOF
-
- cfssl gencert -ca=/opt/kubernetes/ssl/ca.pem -ca-key=/opt/kubernetes/ssl/ca-key.pem -config=ca-config.json -profile=kubernetes benjamin-csr.json | cfssljson -bare benjami
通过指定的ca配置生成 benjamin-key.pem benjamin.pem
6.2 生成kubeconfig授权文件
- cd /root/benjamin
-
- sh config.sh
-
- kubectl config set-cluster kubernetes \
- --certificate-authority=/opt/kubernetes/ssl/ca.pem \
- --embed-certs=true \
- --server=https://192.168.31.63:6443 \
- --kubeconfig=benjamin.kubeconfig
-
- # 设置客户端认证
- kubectl config set-credentials benjamin \
- --client-key=benjamin-key.pem \
- --client-certificate=benjamin.pem \
- --embed-certs=true \
- --kubeconfig=benjamin.kubeconfig
-
- # 设置默认上下文
- kubectl config set-context kubernetes \
- --cluster=kubernetes \
- --user=benjamin \
- --kubeconfig=benjamin.kubeconfig
-
- # 设置当前使用配置
- kubectl config use-context kubernetes --kubeconfig=benjamin.kubeconfig
执行 config.sh 生成benjamin.kubeconfig
6.3 创建RABC授权
- kind: Role
- apiVersion: rbac.authorization.k8s.io/v1
- metadata:
- namespace: default
- name: pod-reader
- rules:
- - apiGroups: [""]
- resources: ["pods"]
- verbs: ["get", "watch", "list"]
-
- ---
-
- kind: RoleBinding
- apiVersion: rbac.authorization.k8s.io/v1
- metadata:
- name: read-pods
- namespace: default
- subjects:
- - kind: User
- name: benjamin
- apiGroup: rbac.authorization.k8s.io
- roleRef:
- kind: Role
- name: pod-reader
- apiGroup: rbac.authorization.k8s.io
6.4 验证
将master节点的kubectl 命令分发到node节点
scp /usr/bin/kubectl 192.168.161.12:/usr/bin/
如果不指定 kubeconfig 文件的时候发现 查看不了
指定授权后的kubeconfig文件 可以查看你default名称空间下的 pod资源
查看default 名称空间下pod的日志发现也是不可以
但是却不能访问非 default 名称空间下的pod,和所有名称空间下的其他资源,因为授权查看的资源只有default名称空间下的pod资源。
增加权限验证
根据上面的rabc.yaml 增加resources 列表 查看pod日志和查看service的权限
重新应用配置 kubectl apply -f rabc.yaml
重新配置后:
可以查看default 空间下pod日志
可以查看default空间下service
如何让自定义授权文件成为默认文件?
cp benjamin.kubeconfig /root/.kube/config
如果没有 .kube 目录就创建一个,这样就会读取默认配置文件 /root/.kube/config
7、官网链接
Using RBAC Authorization | Kubernetes
总结:
你与日月齐光,明动四方
-
相关阅读:
基于Java的汽车维修预约管理系统设计与实现(源码+lw+部署文档+讲解等)
ROSCon 2023 大会回顾
儿童写作业用的护眼灯哪种好?双十一写作业护眼灯推荐
小谈设计模式(29)—访问者模式
Linux查看哪些进程占用的系统 buffer/cache 较高 (hcache,lsof)命令
pytorch中Tensor(张量)
[工业互联-2]:工业有线互联总线之CAN总线
三网话费接口API文档
java计算机毕业设计智能道路交通管理系统源代码+系统+数据库+lw文档
NLP工具再汇总
-
原文地址:https://blog.csdn.net/L2111533547/article/details/126215167