赞
踩
k8s的安全机制。分布式集群管理工具,就是容器编排
安全机制的核心:APIserver作为整个内部通信的中介,也是外部控制的入口,所有的安全机制都是围绕API server来进行设计
1、认证
2、鉴权
3、准入控制
只有三个条件都通过,才可以在k8s集群当中创建
1、HTTP Token:通过token识别合法用户,token是一个很长,很复杂的一个字符串,字符串是用来表达客户的一种方式,每个token对应一个用户名,用户名存储在APIserver能够访问的文件中
客户端发起请求时,HTTP headr包含token
客户端发起请求----token----APIserver(用户名存储文件)----解码-----用户名-----访问集群
2、http base:用户+密码的验证方式,用户名和密码都是通过base64进行加密,加密完成的字符串,http Request的header Atuthorization,发送给服务端,服务端收到加密字符串,解码,获取用户名和密码,验证通过,登录成功
3、https证书: 最严格的方式,也是最严谨的方式,基于CA根证书签名的客户端身份进行验证
1、k8s组件对api server组件的访问, kubelet kube-proxy
2、pod对APi server的访问,pod coredNS dashborad都是pod,也需要访问APi
3、客户端kubelet
- kubelet kube-proxy:都是通过APiserver的https证书,进行双向验证,都是用6443端口进行验证
- controller manager sheduler与APi server在一台服务器,可以直接使用APi server的非安全端口访问(8080端口)
1、手动签发 二进制部署就是手动签发证书,CA签发----把证书匹配到每个对应组件,然后访问6443即可
2、自动签发,kubeadm,kubelet第一次访问api server使用token,token通过之后,controller manager会为kubelet生成一个证书,以后都是通过证书访问,kubeadm修改了证书的有效期,默认1年
3、kubeconfig,文件包含集群的参数,CA证书,API server地址,客户端的参数(客户端的证书和私钥),集群的名称和用户名
- k8s组件通过启动时指定访问不同的kubeconfig,可以访问不同的集群----API server---namespace---资源对象---pod----容器
- kubeconfig既是集群的描述文件,也是一个集群信息的保存文件,包含了集群的访问方式和认证信息
- -/ .kube/config 保存的是kubectl的访问认证信息
4、service Account,就是为了方便pod中的容器访问API server
pod的动作(增删改查)动态的,每个pod手动生成一个证书,于是k8s使用了service Account来进行循环认证,service Account里面包含了统一的认证信息,直接进行api server访问
5、Secret 保存资源对象
- serverAccount 内部保存的token service-Account-token
- Secret保存的是自定义的保密信息
6、serviceAccount保存信息
- 1、token
- 2、ca.crt
- 3、namespace
- 都会被自动挂载
之前的认证过程,只是确认了双方都是可信的,可以相互通信的,鉴权是为了确定请求方的访问权限
- 1、ALwaysDeny 拒绝所有,一般是测试
- 2、ALwaysAllow 允许所有,用测试
- 3、ABAC attribute-base access control 基于属性的访问控制
- 4、webhook 外部访问集群内部的鉴权方式
- 5、RBAC role-base access control 基于角色的访问控制,也是k8s现在默认的规则机制
-
- 角色
- role 指定命名空间的资源控制权限
- 绑定角色
- rolebinding 将角色绑定到指定的命名空间
- 集群
- clusterrole 可以授权所有命名空间的资源控制权限
- 绑定集群
- clusterrolebinding 将集群的角色绑定到命名空间
准入控制是api server的一个准入控制器的插件列表,不同的插件可以实现不同的准入控制机制
一般情况下建议使用官方默认的准入控制器
- limitranger 命名空间的配置
- serviceAccount
- ResourceQuota 命名空间的配置限制
实现不同用户管理自己的命名空间
- 创建一个用户
- useradd lucky
- passwd lucky
-
- 上传证书到 /usr/local/bin 目录中
- chmod +x /usr/local/bin/cfssl*
- mkdir /opt/lucky
- cd /opt/lucky
-
- vim user-cert.sh
- cat > lucky-csr.json << EOF
- {
- "CN": "lucky",
- "hosts": [],
- "key": {
- "algo": "rsa",
- "size": 2048
- },
- "names": [
- {
- "C": "CN",
- "ST": "Nanjing",
- "L": "Nanjing",
- "O": "k8s",
- "OU": "system"
- }
- ]
- }
- EOF
- 赋权
- chmod +x user-cert.sh
- ./user-cert.sh
-
- /etc/kubernetes/pki/ 目录中会生成 lucky-key.pem、lucky.pem、lucky.csr
- cd /etc/kubernetes/pki/
- cfssl gencert -ca=ca.crt -ca-key=ca.key -profile=kubernetes /opt/lucky/lucky-csr.json | cfssljson -bare lucky
-
- cd /opt/lucky
- vim rbac-kubeconfig.sh
- APISERVER=$1
- # 设置集群参数
- export KUBE_APISERVER="https://$APISERVER:6443"
- kubectl config set-cluster kubernetes \
- --certificate-authority=/etc/kubernetes/pki/ca.crt \
- --embed-certs=true \
- --server=${KUBE_APISERVER} \
- --kubeconfig=lucky.kubeconfig
-
- # 设置客户端认证参数
- kubectl config set-credentials lucky \
- --client-key=/etc/kubernetes/pki/lucky-key.pem \
- --client-certificate=/etc/kubernetes/pki/lucky.pem \
- --embed-certs=true \
- --kubeconfig=lucky.kubeconfig
-
- # 设置上下文参数
- kubectl config set-context kubernetes \
- --cluster=kubernetes \
- --user=lucky \
- --namespace=lucky-cloud \
- --kubeconfig=lucky.kubeconfig
-
- kubectl create namespace lucky-cloud
- chmod +x rbac-kubeconfig.sh
- 生成鉴权
- ./rbac-kubeconfig.sh 20.0.0.70
-
- 使用上下文参数生成 lucky.kubeconfig 文件
- kubectl config use-context kubernetes --kubeconfig=lucky.kubeconfig
-
- 查看证书
- cat lucky.kubeconfig
-
- mkdir /home/lucky/.kube
- cp lucky.kubeconfig /home/lucky/.kube/config
- chown -R lucky:lucky /home/lucky/.kube/
-
- RBAC授权
- vim rbac.yaml
- apiVersion: rbac.authorization.k8s.io/v1
- kind: Role
- metadata:
- namespace: lucky-cloud
- name: pod-reader
- rules:
- - apiGroups: [""]
- resources: ["pods"]
- verbs: ["get", "watch", "list", "create"]
-
- ---
- apiVersion: rbac.authorization.k8s.io/v1
- kind: RoleBinding
- metadata:
- name: read-pods
- namespace: lucky-cloud
- subjects:
- - kind: User
- name: lucky
- apiGroup: rbac.authorization.k8s.io
- roleRef:
- kind: Role
- name: pod-reader
- apiGroup: rbac.authorization.k8s.io
-
- kubectl apply -f rbac.yaml
-
- kubectl get role,rolebinding -n lucky-cloud
- NAME CREATED AT
- role.rbac.authorization.k8s.io/pod-reader 2024-01-25T05:59:37Z
-
- NAME ROLE AGE
- rolebinding.rbac.authorization.k8s.io/read-pods Role/pod-reader 16s
-
- 切换用户,测试操作权限
- su - lucky
-
- vim pod-test.yaml
- apiVersion: v1
- kind: Pod
- metadata:
- name: pod-test
- spec:
- containers:
- - name: nginx
- image: nginx
-
-
- kubectl create -f pod-test.yaml
- kubectl get pods -o wide
- NAME READY STATUS RESTARTS AGE
- pod-test 1/1 Running 0 33s
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。