Docker 与 Kubernetes 云安全实战

容器与 K8s 安全:docker.sock 未授权、特权容器逃逸、runC 漏洞、Kubelet API 未授权、etcd 泄露、RBAC 与镜像安全。

写在前面:合法学习边界

云安全测试只用于授权环境。对非授权集群做逃逸/提权可能触犯法律并造成业务中断。

一、原理:容器不等于隔离

容器共享宿主机内核,隔离比虚拟机弱。“容器内 = 安全”是错误认知。

1
2
3
4
5
6
主要风险面:
1. 镜像漏洞(依赖过旧)
2. 配置错误(特权容器、宿主机目录挂载)
3. 容器逃逸(漏洞突破隔离拿宿主)
4. K8s 组件未授权(API Server / etcd / kubelet)
5. 权限过大(RBAC 配置不当)

二、影响与危害

1
2
3
4
拿到容器 → 逃逸到宿主机
宿主机 → 横向到整个集群
etcd/API 泄露 → 集群被接管
云凭证/命名空间数据泄露

风险等级:高到严重。

三、常见利用与验证

1. docker.sock 未授权

1
2
3
容器内挂载了 /var/run/docker.sock → 可操控宿主机 Docker
验证:ls /var/run/docker.sock
利用:创建特权容器挂载宿主机根目录 → chroot 提权

2. 特权容器逃逸

1
2
3
特权容器可访问宿主机设备与资源
验证:cat /proc/self/status | grep CapEff(看 CAP_SYS_ADMIN)
利用:mount 宿主机盘、nsenter 逃逸

3. runC / 内核漏洞逃逸

1
2
runC 历史漏洞(CVE-2019-5736 等)可逃逸到宿主机
内核漏洞(如 Dirty Pipe)在容器内也能利用

4. Kubelet API 未授权

1
2
3
curl -k https://<节点IP>:10250/pods
curl -k https://<节点IP>:10250/run/命名空间/容器/命令
# 解释:10250 未鉴权时可直接执行容器命令

5. etcd 泄露

1
2
etcd 存集群全部密钥与配置
2379 端口未鉴权 → 直接 dump

6. kubeconfig / 云凭证泄露

1
2
泄露的 kubeconfig 可管理集群
云凭证(AK/SK)可接管云资源

四、检测与审计步骤

1
2
3
4
5
第 1 步:端口扫描 2379/10250/6443/10255
第 2 步:探测 Kubelet/API 是否未鉴权
第 3 步:检查容器是否特权/挂载宿主机目录
第 4 步:镜像漏洞扫描(Trivy/Clair)
第 5 步:审查 RBAC 与命名空间权限

五、防御与修复

1
2
3
4
5
6
禁止挂载 docker.sock;不用特权容器
镜像扫描 + 及时更新依赖
API Server/Kubelet/etcd 开启鉴权与 TLS
RBAC 最小权限,禁止 cluster-admin 滥用
网络策略隔离命名空间
运行时安全(gVisor/Falco 行为监控)

六、小结

云安全的核心是“容器不是隔离边界,配置决定安全”。渗透时先试 docker.sock 与 K8s 未授权端点(10250/2379);防守时禁用特权、收紧 RBAC、加镜像扫描和运行时监控。容器逃逸 + K8s 未授权,是云上渗透的两条主线。