k8s的安全机制:
核心:分布式集群管理工具,就是容器编排,安全机制的核心:API server 作为整个集群内部通信的中介,也是外控控制的入口。实验的安全机制都是围绕api server来进行设计:
请求api资源:
1,认证
2,鉴权
3,准入机制
三个条件都通过,才开源在k8s集群当中创建。
认证:Anthentcation
HTTP TOKEN:通过token失败合法用户。token是一个很差,很复杂的一个字符串,字符串是用来表达客户的一种方式。
每一个token对应一个用户名,用户名存储在apiserver能够访问的文件中。
客户端发起请求时,http headr包含token。
客户端发起请求----(请求包含)token----apiserver(用户名存储文件)-----解码------用户名-----访问集群。
http base:用户+密码的验证方式。用户名和密码都是通过base64进行加密,加密完成的字符串,http requset的haeder Atuthorization发送给服务端。服务端收到加密字符串,节目,获取用户名和密码,验证通过,登录成功。
https 证书:最严格的方式,也是最严谨的方式。基于CA根证书的客户端进行验证。
认证的访问类型:
k8s组件对api server组件的访问 kubelet kube-proxy
pod对API server的访问。pod coredns dashborad都是pod。也需要访问api
客户端 kubectl
kubelet kube-proxy:
controller manager sheduler 与 api server在一台服务器,可以直接使用api server的非安全端口访问。 (8080端口)
kubectl kubelet kube-proxy都是通过apiserver的https证书,进行双向验证,都是用6443端口进行验证
签发证书:
1,手动签发,二进制部署就是手动签发证书,ca签发---把证书匹配到每个对应组件。如何访问6443即可。
2,自动签发 kubeadm,kubelet第一次访问api server 使用token,token 通过之后,controller manager 会为kubelet生成一个证书,以后都是通过证书访问。kubeadm修改 了证书的有效期。默认1年。
3,kubeconfig 文件包含了集群的参数,CA证书,API server地址,客户端的参数(客户端的证书和私钥),集群的名称和用户名。
k8s中的组件通过启动时自动访问不同的kube config,可以分为不同的集群-----api server----namespace-----资源对象----pod-----容器
kubeconfig即是集群的描述文件,也是一个集群的保存文件,包含了集群的分为方式和认证信息。
~/.kube/config 保存的是kubectl的访问认证信息。
4,serviceAccount:
serviceAccount:就是为了方便pod中的容器访问API server。pod的动作(增删改查)动态的,每个pod手动生成一个证书就不现实了,于是k8s使用了service Account来进行循环认证,serviceAccount包含了统一的认证信息,直接进行api server访问。
5,secret,保存资源对象,
serviceAccount内部,保存的是 token service-account-token
secret保存的是自定义的报名信息。
6,serviceAccount:
1,token
2,ca.crt
3,namespace
二,鉴权:
之前的认证过程,只是确认了双方都是可信的,可以相互通信,鉴权是为了确定请求方的访问权限。
能做哪些指定的操作。
1,AlwaysDeny:拒绝所有,一般是测试
2,AlwaysAllow:允许所有,一般也是用于测试
3,ABAC attribute-based access control 基于属性的访问控制
4,webhook:外部访问集群内部的鉴权方式
5,RBAC role-base access control 基于角色的访问控制,也是k8s默认的规则机制。
角色
role
绑定角色 rolebinding :将角色绑定到指定的命名空间
集群
clusterrole :可以授权所有密码空间的资源限制
绑定集群 clusterrolebinding:将集群的角色绑定到命名空间。
准入控制:
准入控制是API server的一个准入控制器的插入类别,不同的插件可以实现不同的准入控制机制。
一般情况下建议使用官方默认的准入控制器
limitranger 命名空间的配额管理
serviceAccount
resourceQuota:命名空间的配额限制。
3,实验
------------------- 实践:创建一个用户只能管理指定的命名空间 -------------------
//创建一个用户
useradd cheng
passwd cheng
//使用这个用户进行资源操作,会发现连接 API Server 时被拒绝访问请求
su - cheng
kubectl get pods
The connection to the server localhost:8080 was refused - did you specify the right host or port?
//创建用于用户连接到 API Server 所需的证书和 kubeconfig 文件
//先上传证书生成工具 cfssl、cfssljson、cfssl-certinfo 到 /usr/local/bin 目录中
chmod +x /usr/local/bin/cfssl*
mkdir /opt/cheng
cd /opt/cheng
vim user-cert.sh
#API Server 会把客户端证书的 CN 字段作为 User,把 names.O 字段作为 Group
chmod +x user-cert.sh
./user-cert.sh
#/etc/kubernetes/pki/ 目录中会生成 cheng-key.pem、cheng.pem、cheng.csr
cd /etc/kubernetes/pki/
cfssl gencert -ca=ca.crt -ca-key=ca.key -profile=kubernetes /opt/cheng/cheng-csr.json | cfssljson -bare cheng
###############################
cd /opt/cheng
vim rbac-kubeconfig.sh
kubectl create namespace cheng-cloud
chmod +x rbac-kubeconfig.sh
./rbac-kubeconfig.sh 192.168.176.61
使用上下文参数生成 cheng.kubeconfig 文件
kubectl config use-context kubernetes --kubeconfig=cheng.kubeconfig
//查看证书
cat cheng.kubeconfig
mkdir /home/cheng/.kube
cp cheng.kubeconfig /home/cheng/.kube/config
chown -R cheng:cheng /home/cheng/.kube/
//RBAC授权
vim rbac.yaml
kubectl apply -f rbac.yaml
kubectl get role,rolebinding -n cheng-cloud
//切换用户,测试操作权限
su - cheng
vim pod-test.yaml
cheng这个用户,只有对pod 的"get", "watch", "list", "create" 这些权限。