自己做的网站图片打开慢,如何建立属于个人网站,深圳博大建设,空间商指定的网站目录k8s的安全机制。分布式集群管理工具#xff0c;就是容器编排
安全机制的核心#xff1a;APIserver作为整个内部通信的中介#xff0c;也是外部控制的入口#xff0c;所有的安全机制都是围绕API server来进行设计
请求API资源#xff1a;
1、认证 2、鉴权 3、准入机制
…k8s的安全机制。分布式集群管理工具就是容器编排
安全机制的核心APIserver作为整个内部通信的中介也是外部控制的入口所有的安全机制都是围绕API server来进行设计
请求API资源
1、认证 2、鉴权 3、准入机制
只有三个条件都通过才可以在k8s集群当中创建
认证
认证Anthentcation 1、HTTP Token通过token识别合法用户token是一个很长很复杂的一个字符串字符串是用来表达客户的一种方式每个token对应一个用户名用户名存储在APIserver能够访问的文件中
客户端发起请求时HTTP headr包含token 客户端发起请求----token----APIserver用户名存储文件----解码-----用户名-----访问集群
2、http base用户密码的验证方式用户名和密码都是通过base64进行加密加密完成的字符串http Request的header
Atuthorization发送给服务端服务端收到加密字符串解码获取用户名和密码验证通过登录成功
3、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端口)
kebelet、kubectl、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当中的组件通过启动时指定访问不同的kubeconfig。可以访问不同的集群---api server---namespace---资源对象---pod---容器
kubeconfig既是集群的描述文件也是一个集群信息的保存文件包含了集群的访问方式和认证信息。
~/.kube/config保存的是kubectl的访问认证信息。
4、 serviceAccount就是为了方便pod中的容器来访问api server。
由于pod的动作(动态的增删改查)为每个pod手动生一个证书不现实。于是k8s就使用了serviceAccount来做循环认证。serviceAccount里面包含了统一的认证信息直接进行api server访问。
5、 secret用来保存资源对象。
serviceAccount内部保存的是token、service-auuount-token
secret保存的是自定义的保存信息。
serviceAccount的组成部分 token ca.crt namespace
这三个部分都会被自动挂载到pod当中 认证 鉴权之前的认证过程只是确认了双方都是可信的。可以互相通信。健全是为了确定请求方的访问权限。
能做哪些指定的操作。这些操作都是由鉴权来决定的。
鉴权的策略
1、 AlwayDeny拒绝所有。一般用于测试
2、 AlwaysAllow允许所有。也是用于测试
3、 ABACattribute-based access control 基于属性的访问控制
4、 webhook外部访问集群内部的鉴权方式
5、 RBACrole-base access control 基于角色的访问控制也是k8s默认的规则机制。
角色
role指定命名空间的资源控制权限
rolebinding将角色绑定到指定的命名空间
集群
clusterrole可以授权所有命名空间的资源控制权限
clusterrolebinding将集群的角色绑定到命名空间
准入控制
准入控制式api server的准入控制器的插件列表通过添加不同的插件可以实现不同的准入控制机制。
一般情况下建议使用官方默认的准入控制器
常用的准入控制器 limitranger命名空间的配置管理 servicAccount resourcequota对命名空间进行整体高级控制。也是对命名空间的配置管理
实验举例
实验目的实现不同用户管理自己的命名空间
认证------鉴权------准入机制
命名空间 lucky-cloud
上传证书文件并赋权 useradd lucky
passwd lucky
#创建一个用户mkdir lucky
cd /usr/local/bin/
chmod x cfssl*vim user-cert.sh
cat lucky-csr.json EOF
{CN: lucky,hosts: [],key: {algo: rsa,size: 2048
},names: [{C: CN,ST: Nanjing,O: k8s,OU: system}]
}EOFchmod x user-cert.sh
./user-cert.shcd /etc/kubernetes/pki/
cfssl gencert -caca.crt -ca-keyca.key -profilekubernetes /opt/lucky/lucky-csr.json | cfssljson -bare lucky
#基于设定的信息创建一个认证证书 cd /opt/luckyvim rbac-kubeconfig.sh
APISERVER$1
# 设置集群参数
export KUBE_APISERVERhttps://$APISERVER:6443
kubectl config set-cluster kubernetes \--certificate-authority/etc/kubernetes/pki/ca.crt \--embed-certstrue \--server${KUBE_APISERVER} \--kubeconfiglucky.kubeconfig# 设置客户端认证参数
kubectl config set-credentials lucky \--client-key/etc/kubernetes/pki/lucky-key.pem \--client-certificate/etc/kubernetes/pki/lucky.pem \--embed-certstrue \--kubeconfiglucky.kubeconfig# 设置上下文参数
kubectl config set-context kubernetes \--clusterkubernetes \--userlucky \--namespacelucky-cloud \--kubeconfiglucky.kubeconfigkubectl create namespace lucky-cloud
chmod x rbac-kubeconfig.sh
./rbac-kubeconfig.sh 192.168.233.91# 使用上下文参数生成 lucky.kubeconfig 文件
kubectl config use-context kubernetes --kubeconfiglucky.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-cloudname: pod-reader
rules:
- apiGroups: []resources: [pods]verbs: [get, watch, list, create]---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:name: read-podsnamespace: lucky-cloud
subjects:
- kind: Username: luckyapiGroup: rbac.authorization.k8s.io
roleRef:kind: Rolename: pod-readerapiGroup: rbac.authorization.k8s.iokubectl apply -f rbac.yamlkubectl get role,rolebinding -n lucky-cloud //切换用户测试操作权限
su - luckyvim pod-test.yaml
apiVersion: v1
kind: Pod
metadata:name: pod-test
spec:containers:- name: nginximage: nginxkubectl create -f pod-test.yamlkubectl get pods -o wide //访问 svc 资源就会被拒绝
kubectl get svc//也无法访问 default 命名空间
kubectl get pods -n default//使用 root 用户查看
kubectl get pods -n lucky-cloud -o wide//也可以通过绑定 admin 角色来获得管理员权限
kubectl create rolebinding lucky-admin-binding --clusterroleadmin --userlucky --namespacelucky