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" 这些权限。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐