您的位置:首页 > 文旅 > 美景 > rbac——安全机制

rbac——安全机制

2024/10/5 22:21:34 来源:https://blog.csdn.net/m0_71178834/article/details/142210072  浏览:    关键词:rbac——安全机制

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 网卡

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com