rbac——安全机制
赋权机制
集群是按照用户名进行登录,按照项目名称进行命名空间的分类。
配电云主站
资源空间
pod数量
k8s的安全机制:
api server ————>集群内部和外部的通信都需要靠api server进行调度,所有的安全机制都是围绕api server展开的。
api server进行通信:
1、认证 Authentication token
2、鉴权 Authorzation 你在集群当中权限的控制
3、准入控制 admission control 能做哪些,在哪里做哪些
认证:
token:http token 是一个很长的特殊编码方式的而且是难以被模仿的特殊字符串,来表达客户端的一种方式。
每一个token都会对应一个用户,存储在api server能够访问的文件中。客户端发起对api server的请求时,在http header当中必须加入token。
http base 认证: 用户名+密码进行认证
https证书认证: 基于ca证书签名的客户端身份认证方式。(最严格的方式)
http token和http base都是服务端对客户端的单向认证,https是双向认证的方式。
认证的资源类型:
kubectl kubelet kube-proxy
kubectl对pod进行管理也需要认证
service Account:是为了方便访问pod中的容器,以及容器访问api server专门创建的。
server Account————>每创建一个pod就会自动创建。
1、token 和api server认证的私钥
2、ca.crt 认证api server的证书
3、namespace server account的命名空间。
[root@master01 opt]# kubectl exec -it nginx1-bd76c7b4-jp445 bash kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead. root@nginx1-bd76c7b4-jp445:/# cd /var/run/secrets/kubernetes.io/serviceaccount/ root@nginx1-bd76c7b4-jp445:/var/run/secrets/kubernetes.io/serviceaccount# ls ca.crt namespace token ##每个pod都有
鉴权:
认证过后,就到了鉴权。
确定请求方有哪些资源的权限
1.20版本,鉴权统一使用RBAC进行。
角色:
Role:指定命名空间的资源控制权限
ClusterRole:指定所有的命名空间的资源控制权限
角色绑定:
Rolebinding:将角色绑定到主体 用户————subject
clusterRolebinding:将集群角色绑定到主体
主体:
user:用户
service account:服务账号(集群的服务账号)
group:用户组
#rules.verbs有:"get", "list", "watch", "create", "update", "patch", "delete", "exec" #rules.resources有:"services", "endpoints", "pods", "secrets", "configmaps", "crontabs", "deployments", "jobs", "nodes", "rolebindings", "clusterroles", "daemonsets", "replicasets", "statefulsets", "horizontalpodautoscalers", "replicationcontrollers", "cronjobs"
[root@master01 opt]# mkdir rbac [root@master01 opt]# cd rbac/ [root@master01 rbac]# ls [root@master01 rbac]# vim rbac.yaml apiVersion: rbac.authorization.k8s.io/v1 kind: Role kind: Role metadata:name: test1 #创建的角色名称namespace: default #这个是必须要有的字段,只能有一个命名空间 rules: #定义规则 - apiGroups: [""] #rbac.authorization.k8s.io/v1,默认就是对apiserver的请求权限resources: ["pods","services"] #给主体也就是用户,可以在指定的命名空间内对哪些资源对象进行>操作。verbs: ["get","watch","list"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata:name: test2 #创建的角色名称namespace: default #这个是必须要有的字段,只能有一个命名空间 subjects: - kind: Username: xy102apiGroup: rbac.authorization.k8s.io roleRef:kind: Rolename: test1apiGroup: rbac.authorization.k8s.io[root@master01 rbac]# useradd xy102
准入机制:
[root@master01 rbac]# useradd lucky [root@master01 rbac]# passwd lucky [root@master01 rbac]# cd /usr/local/bin/ [root@master01 bin]# rz -E rz waiting to receive. [root@master01 bin]# ls cfssl cfssl-certinfo cfssljson helm [root@master01 bin]# chmod 777 cfssl* #apiserver和用户之间连接的认证证书 #客户端的证书签名 cat > lucky-csr.json <<EOF {"CN": "lucky","hosts": [],"key": {"algo": "rsa","size": 2048},"names": [{"C": "CN","ST": "BeiJing","L": "BeiJing","O": "k8s","OU": "System"}] } EOF [root@master01 rbac]# cd /etc/kubernetes/pki/ apiserver.crt etcd apiserver-etcd-client.crt front-proxy-ca.crt apiserver-etcd-client.key front-proxy-ca.key apiserver.key front-proxy-ca.srl apiserver-kubelet-client.crt front-proxy-client.crt apiserver-kubelet-client.key front-proxy-client.key ca.crt sa.key ca.key sa.pub ca.srl #客户端的签名证书 [root@master01 pki]# cfssl gencert -ca=ca.crt -ca-key=ca.key -profile=kubernetes /opt/rbac/lucky-csr.json | cfssljson -bare lucky [root@master01 pki]# ls apiserver.crt front-proxy-ca.crt apiserver-etcd-client.crt front-proxy-ca.key apiserver-etcd-client.key front-proxy-ca.srl apiserver.key front-proxy-client.crt apiserver-kubelet-client.crt front-proxy-client.key apiserver-kubelet-client.key lucky.csr ca.crt lucky-key.pem ca.key lucky.pem ca.srl sa.key etcd sa.pub [root@master01 rbac]# vim rbac-config.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 [root@master01 rbac]# chmod 777 rbac-config.sh [root@master01 rbac]# ./rbac-config.sh 192.168.60.110 [root@master01 rbac]# kubectl config use-context kubernetes --kubeconfig=lucky.kubeconfig [root@master01 rbac]# mkdir /home/lucky/.kube [root@master01 rbac]# cp lucky.kubeconfig /home/lucky/.kube/config [root@master01 rbac]# chown -R lucky:lucky /home/lucky/.kube/ [root@master01 rbac]# vim rbac.yaml apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata:name: test1 #创建的角色名称namespace: lucky-cloud #这个是必须要有的字段,只能有一个命名空间 rules: #定义规则 - apiGroups: [""] #rbac.authorization.k8s.io/v1,默认就是对apiserver的请求权限resources: ["pods","services","deployments","pods/exec","pods/log"] #给主体也就是用户,可以在指定的命名空间内对哪些资源对象进行>操作。verbs: ["get","watch","list","exec","create"] kind: Role --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata:name: test2 #创建的角色名称namespace: lucky-cloud #这个是必须要有的字段,只能有一个命名空间 subjects: - kind: Username: luckyapiGroup: rbac.authorization.k8s.io roleRef:kind: Rolename: test1apiGroup: rbac.authorization.k8s.io [root@master01 rbac]# kubectl create ns lucky-cloud [root@master01 rbac]# kubectl apply -f rbac.yaml [root@master01 rbac]# kubectl get role,rolebinding -n lucky-cloud NAME CREATED AT role.rbac.authorization.k8s.io/test1 2024-09-13T05:38:13Z NAME ROLE AGE rolebinding.rbac.authorization.k8s.io/test2 Role/test1 97s [root@master01 rbac]# kubectl create deployment nginx1 --image=nginx:1.22 --replicas=3 -n lucky-cloud
如何抓取pod的包
1、describe pod 查询容器的container ID
2、到pod部署的节点,根据container ID获取容器在节点上的进程号
3、根据进程号进入容器的网络命名空间
4、tcpdump -i 网卡