文章总结: 文章从攻击者视角剖析Docker与K8s架构安全,指出容器共享宿主机内核导致Namespace逃逸、CgroupsDoS、UnionFS镜像投毒三大风险,并给出Dockerdaemon、socket、registry及K8sAPIServer、etcd、Kubelet未授权等关键攻击面,附实战命令速查与云原生CI/CD投毒、供应链、监控组件横向移动完整攻防路径,强调动态IP与快速CI/CD让传统边界防护失效。 综合评分: 92 文章分类: 云安全,容器安全,红队,漏洞分析,内网渗透
【云安全专题-7】Docker 与 K8s 架构安全
原创
Ca1m Ca1m
FunnyHacking
2026年1月16日 13:47 上海
🚀 前言
在前面的章节中,我们攻克了 EC2(计算)、S3(存储)和 RDS(数据)。现在,我们要进入一个全新的、更复杂的维度——云原生(Cloud Native)。
随着“微服务”和“DevOps”的普及,传统的虚拟机(VM)因为启动慢、资源重,逐渐被**容器(Container)**取代。而当容器数量达到成千上万时,就需要一个“指挥官”来管理,这就是 Kubernetes (K8s)。
对于安全人员来说,战场变了:
- • 边界模糊:IP 地址是动态变化的,传统的防火墙策略失效。
- • 攻击面下沉:从操作系统层下沉到了容器引擎和编排层。
- • 速度加快:CI/CD 流水线让代码从提交到上线只需几分钟,恶意代码也能随之快速扩散。
本章作为云原生篇的起点,我们将剥开 Docker 和 K8s 的外衣,看清其内部骨架。
一、 容器引擎:Docker 的本质
很多人把 Docker 比作轻量级的虚拟机,这在功能上没错,但在安全原理上是大错特错的。
1. 核心技术:进程级的“障眼法”
虚拟机拥有独立的操作系统内核,而容器是共享宿主机内核的。Docker 利用了 Linux 内核的三大特性,制造了一个“隔离”的幻觉:
-
• Namespaces (命名空间) —— 隔离视野
-
• 作用:让进程“看不见”其他进程。
-
• PID Namespace:容器内的进程以为自己是 PID 1(上帝进程),实际上在宿主机上它只是个普通进程。
-
• Mount Namespace:让容器拥有独立的文件系统视图。
-
• 安全视角:**容器逃逸(Container Escape)**的核心逻辑,往往就是打破了 Namespace 的隔离,让进程“看”到了宿主机。
-
• Cgroups (控制组) —— 限制资源
-
• 作用:限制进程能用多少 CPU、内存。
-
• 安全视角:如果未做限制,恶意容器可以耗尽宿主机资源,造成 DoS(拒绝服务)。
-
• UnionFS (联合文件系统) —— 镜像分层
-
• 作用:Docker 镜像是一层层叠加的(Layer)。
-
• 安全视角:镜像投毒。黑客可以在基础镜像中植入后门,上层应用无论怎么构建,都自带后门。
2. Docker 架构中的攻击面
-
• Docker Daemon (
dockerd):守护进程,通常以 Root 权限运行。 -
• 危险:如果你能控制 Docker Daemon,你就等于拥有了宿主机的 Root 权限。
-
• Docker Socket (
/var/run/docker.sock): -
• 危险:这是 Docker 客户端与 Daemon 通信的管道。如果攻击者挂载了这个 Socket 到容器内部,他就可以在容器里指挥宿主机创建新容器、挂载宿主机根目录,实现秒级逃逸。
-
• Docker Registry:镜像仓库(如 Harbor)。
-
• 危险:仓库未授权访问,导致私有镜像泄露或被篡改。
3. Docker 常用命令速查 (Cheat Sheet)
在云安全实战中,我们经常需要快速搭建靶场、分析恶意镜像或从受损容器中提取证据。以下是精简后的核心命令集。
🛠️ 1. 环境安装与国内源配置
- • 一键安装:
curl -fsSL https://get.docker.com | sh
- • 配置国内加速器 (关键):
由于网络原因,国内直接拉取 Docker Hub 经常超时。建议配置加速器(如阿里云、网易、腾讯云等)。编辑文件:
vi /etc/docker/daemon.json
{
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://hub-mirror.c.163.com"
]
}
配置完成后重启服务: systemctl restart docker
📦 2. 镜像管理 (Images)
- • 搜索与拉取:
docker search centos # 搜索
docker pull centos:7 # 拉取指定版本
- • 查看镜像历史 (安全审计):
docker history <image_id> --no-trunc
-
• 红队技巧:查看每一层构建命令,常用于发现开发者泄露的密码或恶意镜像的后门指令。
-
• 清理虚悬镜像:
docker image prune
🏃 3. 容器生命周期 (Containers)
- • 启动容器 (常用参数):
# -d: 后台运行
# -p: 端口映射 (宿主机端口:容器端口)
# --name: 指定名称
docker run -d --name web_server -p 8080:80 nginx
- • 查看容器:
docker ps # 查看运行中
docker ps -a # 查看所有 (含已退出)
- • 停止与删除:
docker stop <container_id> # 停止
docker rm -f <container_id> # 强制删除
docker rm -f $(docker ps -aq) # 💣 暴力删除所有容器
🕵️ 4. 交互与文件传输 (实战重点)
- • 进入容器 (Get Shell):
docker exec -it <container_id> /bin/bash
# 如果没有 bash,尝试 sh
docker exec -it <container_id> sh
-
• 注意:推荐使用 exec,exit 后容器不会停止。
-
• 文件传输 (
docker cp): 这是红队最常用的命令,用于上传利用工具或下载敏感文件取证。
# 📥 从容器下载文件到本地 (取证)
docker cp <container_id>:/var/www/html/config.php ./evidence/
# 📤 从本地上传文件到容器 (上传 fscan/webshell)
docker cp ./fscan <container_id>:/tmp/fscan
💾 5. 镜像迁移 (Save vs Export)
很多内网环境不通公网,需要手动导入导出镜像。注意两者的区别:
- • Save / Load (针对镜像 Image):
docker save -o image.tar <image_name>
docker load -i image.tar
-
• 特点:保存完整的镜像层级信息,支持回滚,体积稍大。
-
• 场景:完整的环境迁移。
-
• Export / Import (针对容器 Container):
docker export -o container.tar <container_id>
docker import container.tar <new_image_name>
- • 特点:仅保存容器当下的快照,丢失历史层级,体积较小。
- • 场景:制作基础发行版。
🔍 6. 信息收集 (Inspect)
- • 查看容器详情:
docker inspect <container_id>
- • 重点关注:
Mounts(挂载点,是否挂载了宿主机敏感目录)、Env(环境变量,是否泄露 AK/SK)。
二、 容器编排:Kubernetes (K8s) 的帝国
如果说 Docker 是单独的乐手,K8s 就是交响乐团的指挥家。K8s 的架构非常庞大,我们只关注红队眼中的核心组件。
K8s 是典型的 Master-Node(控制节点-工作节点)架构。
1. Control Plane (Master 节点) —— 大脑
这是攻击者梦寐以求的目标,拿下了 Master 就拿下了整个集群。
-
• API Server (
kube-apiserver) —— 唯一的入口 -
• 功能:所有组件(包括用户命令 kubectl)都要通过 HTTP REST API 跟它交互。
-
• 端口:默认 6443。
-
• 安全视角:API Server 未授权访问是 K8s 里的“S3 桶配置错误”。如果配置不当,攻击者可以直接通过 API 创建恶意 Pod。
-
• etcd —— 记忆库
-
• 功能:存储集群所有状态的数据库(Key-Value)。
-
• 端口:默认 2379。
-
• 安全视角:etcd 里存着集群的所有秘密 (Secrets),包括账号密码、证书、Token。拿下 etcd = 拿下集群。
-
• Controller Manager & Scheduler:负责决策和调度,相对攻击面较小。
2. Node (Worker 节点) —— 苦力
这是业务代码运行的地方,也是攻击者渗透的第一站。
-
• Kubelet —— 节点管家
-
• 功能:负责管理该节点上的 Pod,向 API Server 汇报状态。
-
• 端口:默认 10250。
-
• 安全视角:Kubelet 未授权访问。如果 10250 端口暴露,攻击者可以直接命令该节点运行恶意容器。
-
• Kube-proxy:负责网络转发。
-
• Container Runtime:真正运行容器的软件(Docker 或 Containerd)。
3. K8s 里的核心概念 (黑话扫盲)
- • Pod:K8s 的最小调度单元。一个 Pod 里可以有一个或多个容器(Container)。
- • Service:定义一组 Pod 的访问策略(解决 IP 变动问题)。
- • Namespace (K8s 命名空间):不要和 Linux Namespace 搞混。这是 K8s 的逻辑隔离,用来区分“开发环境”、“生产环境”。
- • Secret / ConfigMap:用来存配置和密码。
三、 云原生生态圈:常见的“猪队友”
K8s 很少独立存在,通常伴随着一套庞大的生态系统。这些组件往往也是攻击入口。
1. CI/CD 流水线 (Jenkins / GitLab CI)
- • 地位:DevOps 的心脏。
- • 攻击点:流水线投毒 (Pipeline Poisoning)。攻击者修改
.gitlab-ci.yml或 Jenkinsfile,在构建阶段植入挖矿木马或窃取云凭证。
2. 镜像仓库 (Harbor / Docker Hub)
- • 地位:软件供应链的源头。
- • 攻击点:弱口令、镜像包含漏洞(CVE)、恶意镜像上传。
3. 服务网格 (Istio / Linkerd)
- • 地位:解决微服务间的通信和监控。
- • 攻击点:Istio 的 Sidecar 代理配置错误可能导致鉴权绕过。
4. 监控系统 (Prometheus / Grafana)
- • 地位:集群的眼睛。
- • 攻击点:Grafana 弱口令或未授权访问。通过监控数据可以获取大量内网拓扑和敏感信息。
四、 云原生安全视角:从上帝视角看攻击链
结合 [HackTricks CI/CD 矩阵] 和实战经验,云原生的攻击路径通常如下:
- 1. 初始访问:
- • Web 应用漏洞(RCE/SQLi)拿到 Pod 的 Shell。
- • K8s API Server 或 Kubelet 端口公网暴露。
- • GitLab/Jenkins 弱口令。
- 2. 执行与持久化:
- • 在容器内运行挖矿脚本。
- • 创建恶意的 DaemonSet(让恶意 Pod 在每个节点上都运行)。
- 3. 权限提升与逃逸:
- • Docker 逃逸:利用特权模式(Privileged)、挂载 Docker Socket 或内核漏洞,从容器跳到宿主机 Node。
- 4. 横向移动:
- • 利用 Service Account (SA) 的 Token 访问 API Server。
- • 通过内网网络攻击其他 Pod。
- 5. 目标达成:
- • 窃取 etcd 中的 Secrets。
- • 控制整个集群资源进行挖矿。
五、 结语
Docker 像一个个集装箱,K8s 则是自动化码头。 对于攻击者,这是一个“到处都是 API,到处都是凭证”的乐园;对于防御者,这是一个“动态变化、难以捉摸”的迷宫。
理解了这些基础架构,你才能看懂后续的高阶操作。
👉 下一章预告:打破牢笼——Docker 容器逃逸的 N 种姿势
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:FunnyHacking Ca1m Ca1m《【云安全专题-7】Docker 与 K8s 架构安全》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论