
写在前面“Docker容器会被黑吗”“容器逃逸是什么”“Docker怎么安全配置”随着容器化部署的普及Docker安全成为了云安全的重要分支。容器不是虚拟机它共享宿主机内核一旦容器被攻破攻击者可能通过逃逸获取宿主机权限。从恶意镜像到容器逃逸从权限配置缺陷到K8s集群攻击容器安全的攻击面比很多人想象的要大得多。我第一次关注Docker安全是在一次渗透测试中发现目标使用了Docker通过一个配置不当的容器利用Docker Socket挂载成功逃逸到了宿主机拿到了root权限。那次经历让我意识到容器不等于隔离。今天我把Docker容器安全的完整知识整理出来镜像安全、运行时安全、逃逸漏洞、K8s安全、加固方案。看完这篇你对容器安全会有一个系统化认知。⚠️ 注意本文仅用于安全教育和授权测试严禁用于非法用途。一、Docker安全基础容器 vs 虚拟机特性容器虚拟机隔离方式进程隔离硬件隔离内核共享宿主内核独立内核资源开销轻量较重安全边界较弱较强逃逸难度较低较高Docker安全机制机制说明Namespaces进程/网络/挂载隔离Cgroups资源限制Seccomp系统调用过滤AppArmor强制访问控制SELinux安全增强Capabilities精细化权限User Namespace用户映射二、镜像安全镜像安全风险风险说明影响恶意镜像含后门/挖矿程序直接沦陷漏洞依赖基础镜像含漏洞被利用攻击硬编码凭据镜像中含密码/密钥凭据泄露过时镜像未更新补丁已知漏洞不可信来源非官方/未验证镜像供应链攻击镜像扫描# Trivy - 镜像漏洞扫描# 安装sudoaptinstalltrivy# 扫描镜像trivy image nginx:latest trivy image python:3.9-slim trivy image--severityHIGH,CRITICAL nginx:latest# 扫描文件系统trivy fs--severityHIGH,CRITICAL /path/to/app# 扫描Git仓库trivy repo https://github.com/user/repo# Grype - 另一款镜像扫描工具grype nginx:latest grype-shigh,critical nginx:latestDockerfile安全最佳实践# 不安全写法 FROM ubuntu:latest RUN apt-get update apt-get install -y python3 COPY . /app RUN chmod x /app/start.sh USER root CMD [/app/start.sh] # 安全写法 FROM python:3.9-slim AS builder # 使用非root用户 RUN groupadd -r appuser useradd -r -g appuser appuser # 安装依赖 COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt # 复制应用代码 COPY --chownappuser:appuser . /app WORKDIR /app # 切换用户 USER appuser # 健康检查 HEALTHCHECK --interval30s --timeout3s CMD curl -f http://localhost:8080/ || exit 1 # 指定端口 EXPOSE 8080 # 启动命令 CMD [python, app.py]Dockerfile安全检查清单检查项说明使用官方基础镜像避免不可信来源使用特定版本标签不用latest使用slim/alpine镜像减小攻击面不以root运行创建非root用户不硬编码密码使用环境变量/Secrets多阶段构建减少最终镜像内容添加HEALTHCHECK监控容器健康最小化安装只装必要包三、容器运行时安全Docker Socket风险# 最危险的配置挂载Docker Socketdockerrun-v/var/run/docker.sock:/var/run/docker.sock...# 这等于给了容器root权限# 攻击者可以通过Docker API控制宿主机# 检查是否挂载了Docker Socketdockerinspectcontainer|grepdocker.sock危险挂载挂载风险说明/var/run/docker.sock宿主root可控制Docker/宿主文件系统完全访问/etc配置文件可修改系统配置/proc内核信息可获取宿主信息/sys设备信息可操作硬件–privileged特权模式几乎等于root特权模式逃逸# 特权模式容器逃逸# 如果容器以 --privileged 运行dockerrun--privileged-itubuntu /bin/bash# 逃逸方法1挂载宿主磁盘fdisk-lmkdir/mnt/hostmount/dev/sda1 /mnt/hostchroot/mnt/host# 逃逸方法2利用cgroupmkdir/tmp/cgroupmount-tcgroup-ordma cgroup /tmp/cgroup# 创建cgroup通知echo1/tmp/cgroup/rdma/cgroup/notify_on_release# 利用release_agent执行命令Capabilities管理# 查看默认Capabilitiesdockerrun--rm-it--cap-addALL ubuntu capsh--print# 危险Capabilities# CAP_SYS_ADMIN - 几乎等于root# CAP_SYS_MODULE - 可加载内核模块# CAP_SYS_PTRACE - 可调试进程# CAP_DAC_OVERRIDE - 可绕过文件权限# 安全做法删除所有只添加必要dockerrun --cap-dropALL --cap-addNET_BIND_SERVICE...# 检查容器Capabilitiesdockerinspectcontainer--format{{.HostConfig.CapAdd}}安全运行配置# 安全的Docker运行参数dockerrun\--read-only\# 只读根文件系统--cap-dropALL\# 删除所有权限--cap-addNET_BIND_SERVICE\# 只添加必要权限--security-optno-new-privileges\# 禁止提权--security-optapparmordocker-default\# AppArmor--memory512m\# 内存限制--cpus1\# CPU限制--pids-limit100\# 进程数限制--networkinternal\# 网络隔离--tmpfs/tmp\# 临时文件系统-u1000:1000\# 非root用户--restarton-failure\# 重启策略myimage:latest四、Docker逃逸漏洞常见逃逸漏洞漏洞说明CVErunc逃逸容器逃逸到宿主CVE-2019-5736CVE-2022-0185cgroup逃逸Linux内核CVE-2022-0476内核namespaceLinux内核CVE-2021-22555Netfilter逃逸Linux内核CVE-2020-14386内存损坏逃逸Linux内核CVE-2019-5736 利用# runc逃逸漏洞# 利用条件容器内能执行命令# 利用原理覆盖宿主机runc二进制文件# POC仅用于安全测试#!/bin/bash# 覆盖runcpayload#!/bin/bash cat /etc/shadow /tmp/shadow.txtecho$payload/bin/shchmodx /bin/sh# 当宿主机执行docker exec时触发逃逸检测# 检查是否在容器中cat/proc/1/cgroup|grepdockerls/.dockerenv# 检查挂载mount|grep-Edocker.sock|/dev/sd|/proc|/sys# 检查Capabilitiescat/proc/1/status|grepCap# 检查是否特权模式cat/proc/1/status|grep-icap_eff# 如果是0000003ffffffffff说明是特权模式五、Kubernetes安全K8s安全模型┌─────────────────────────────────────┐ │ API Server │ │ (RBAC 认证授权) │ ├─────────────────────────────────────┤ │ NetworkPolicy │ │ (网络隔离策略) │ ├─────────────────────────────────────┤ │ SecurityContext │ │ (Pod级安全上下文) │ ├─────────────────────────────────────┤ │ PodSecurityPolicy │ │ (Pod安全策略) │ └─────────────────────────────────────┘常见K8s攻击攻击说明防御API Server未授权6443/8080端口暴露RBAC 认证Dashboard未授权30000端口暴露认证 最小权限etcd未授权2379端口暴露TLS 认证容器逃逸利用内核漏洞seccomp AppArmor恶意Pod创建特权PodPodSecurityPolicyRBAC提权过宽的ClusterRole最小权限原则K8s安全配置# 安全的Pod配置apiVersion:v1kind:Podmetadata:name:secure-podspec:securityContext:runAsNonRoot:true# 禁止rootrunAsUser:1000# 指定用户fsGroup:2000# 文件组containers:-name:appimage:app:1.0securityContext:allowPrivilegeEscalation:false# 禁止提权readOnlyRootFilesystem:true# 只读根目录runAsNonRoot:truecapabilities:drop:[ALL]# 删除所有权限add:[NET_BIND_SERVICE]resources:limits:memory:512Micpu:1requests:memory:256Micpu:500mreadinessProbe:httpGet:path:/healthport:8080NetworkPolicy配置# 网络隔离策略apiVersion:networking.k8s.io/v1kind:NetworkPolicymetadata:name:deny-allnamespace:productionspec:podSelector:{}policyTypes:-Ingress-Egressingress:-from:-podSelector:matchLabels:app:frontendports:-protocol:TCPport:8080egress:-to:-namespaceSelector:matchLabels:name:databaseports:-protocol:TCPport:5432六、Docker安全加固Docker Daemon配置// /etc/docker/daemon.json{icc:false,// 禁止容器间通信no-new-privileges:true,// 禁止提权userns-remap:default,// 用户命名空间映射live-restore:true,// 优雅重启max-concurrent-downloads:10,max-concurrent-uploads:10,log-driver:json-file,log-opts:{max-size:10m,max-file:3},storage-driver:overlay2,selinux-enabled:true,// 启用SELinuxuserland-proxy:false}Docker Bench安全审计# Docker Bench for Security - 安全审计工具dockerrun--rm--nethost--pid--usernshost--cap-add SYS_ADMIN\-v/etc:/etc:ro\-v/var/lib:/var/lib:ro\-v/var/run/docker.sock:/var/run/docker.sock:ro\-v/usr/lib/systemd:/usr/lib/systemd:ro\-v/etc:/etc:ro\docker/docker-bench-security# 检查项包括# 1. 宿主机配置# 2. Docker Daemon配置# 3. Docker镜像配置# 4. 容器运行配置# 5. Docker安全操作安全Checklist检查项是否完成使用官方基础镜像☐使用特定版本标签☐镜像漏洞扫描☐不以root运行☐删除不必要的Capabilities☐启用seccomp☐启用AppArmor☐不挂载Docker Socket☐不使用特权模式☐配置资源限制☐配置日志☐定期更新镜像☐使用User Namespace☐网络隔离☐定期安全审计☐七、容器安全工具工具功能类型Trivy镜像漏洞扫描开源Grype镜像漏洞扫描开源Clair镜像漏洞分析开源Falco运行时安全监控开源Sysdig运行时监控开源Docker Bench安全配置审计开源Notary镜像签名验证开源Cosign镜像签名开源Aqua容器安全平台商业Sysdig Secure容器安全平台商业Falco运行时监控# Falco规则示例-rule:Shell Spawned in Containerdesc:A shell was spawned in a containercondition:spawned_process and container and proc.name in (bash, sh, zsh, ash, dash)output:Shell spawned in container (user%user.name container_id%container.id container_name%container.name shell%proc.name)priority:WARNING-rule:Contact Unknown Endpointdesc:Container contacted unknown endpointcondition:outbound and container and not fd.sip in (allowed_ips)output:Container contacted unknown endpoint (container%container.name ip%fd.sip)priority:ERROR学习资源Docker和容器安全是云安全领域的重要分支。随着企业容器化转型的深入容器安全人才需求越来越大。从镜像扫描到运行时监控从逃逸防护到K8s安全容器安全覆盖了从开发到运维的完整链路。掌握容器安全需要对Linux内核、Docker架构、K8s体系有深入理解。建议在实验环境中搭建Docker和K8s集群实际操作各种安全配置和逃逸场景。如果你对容器安全和云安全感兴趣想系统学习更多知识——包括Docker安全、K8s攻防、云原生安全、CTF实战等——可以参考下面整理的完整学习资料包。内容涵盖Docker容器安全实战Kubernetes安全攻防云原生安全技术Linux内核与安全机制红蓝对抗与护网资料CTF比赛专项训练Python安全编程实战渗透测试全流程应急响应实战手册网络安全合规指南从零基础到实战进阶200节视频课程配套工具和靶场环境涵盖攻防对抗全生命周期。这些东西我都可以免费分享给大家需要的可以点这里自取:网安入门到进阶资源总结安全维度核心要点镜像安全官方镜像 漏洞扫描 签名验证运行时安全非root 最小权限 seccomp网络安全NetworkPolicy 网络隔离逃逸防护不用特权 限制挂载 内核更新监控审计Falco Docker Bench 日志 容器安全的核心原则最小权限 纵深防御 持续监控。容器不是安全的默认配置安全需要你主动构建。————————————————