下面分镜像、宿主机、容器运行时、网络、权限、日志审计、编排(Docker Compose / K8s)、应急几个维度整理,偏向生产可落地,很多是日常容易踩坑的点。
核心原则:最小权限、最小攻击面、不信任镜像、容器≠沙箱,容器共享内核,逃逸风险一直存在。
一、镜像安全(最重要一环)
不要用 latest 标签 latest 是浮动标签,每次拉取版本不可控,漏洞修复后行为会变;固定具体版本号,例如
nginx:1.27.3。使用轻量基础镜像 优先
alpine、distroless、scratch,减少包、shell、工具;越大的镜像漏洞越多。distroless 镜像里面甚至没有 shell,就算 Web 被拿下,攻击者很难在里面执行命令。
镜像扫描 CI/CD 流水线集成漏洞扫描:Trivy、Grype、Clair;推送到私有仓库前先扫,高危漏洞禁止上线。
trivy image nginx:1.27.3使用私有镜像仓库,不要直接拉公共镜像 自建 Harbor/Registry,镜像经过审核、缓存;配置仓库 HTTPS + 认证,禁止匿名拉取。
镜像内不要内置密钥、密码、token 禁止
Dockerfile里写密码、COPY .env;密钥用运行时注入(secret/volume/ 环境变量管理工具)。镜像构建不要在容器里编译后保留编译工具 多阶段构建(multi-stage build):编译阶段放编译器、git,最终镜像只放运行产物。
验证镜像签名 使用
cosign对镜像签名,部署时校验签名,防止镜像被篡改投毒。
二、容器运行时配置(run /compose 参数)
✅ 必加的安全参数
不以 root 用户运行容器(最高优先级) Dockerfile 内创建普通用户,
USER appuser;启动时避免默认 root。 如果必须 root,要做额外限制,尽量避免。禁用特权模式 --privileged
--privileged几乎给了容器宿主机全部设备权限,极易逃逸,生产禁止随便加。去掉不必要的 Linux Capabilities 默认容器已经裁剪了一部分能力,再显式删除:
--cap-drop=ALL --cap-add=NET_BIND_SERVICE只按需添加能力,默认全部丢弃。
只读文件系统(如果业务允许)
--read-only配合
--tmpfs /tmp挂载临时目录;攻击者拿到 shell 也无法写文件持久化木马。设置文件系统掩码(umask)、限制新文件权限
限制资源:CPU、内存、PIDS 防 DoS、fork 炸弹:
--memory=512m --cpus=0.5 --pids-limit=100禁止挂载宿主机敏感目录 严禁
-v /:/host、-v /etc:/etc、-v /var/run/docker.sock!挂载
docker.sock= 容器内拥有宿主机 docker 权限,等价接管机器,是高频入侵入口。 如果一定要用 Dind,单独 Dind 节点,严格隔离。设置安全选项:no-new-privileges
--security-opt=no-new-privileges:true阻止容器内通过 suid 程序提权。
Seccomp 配置 使用 seccomp 过滤系统调用,禁用危险 syscall(比如内核模块加载);docker 默认 seccomp 配置已经不错,不要
--security-opt seccomp=unconfined。AppArmor / SELinux 开启宿主机的 AppArmor(Debian/Ubuntu)或 SELinux(RHEL/CentOS/openEuler),不要随意关闭;给容器绑定安全配置文件。
❌ 尽量不要用
--privileged--security-opt seccomp=unconfined--security-opt apparmor=unconfined--userns=host(用户命名空间直通)
三、用户命名空间 User Namespace(重点防御逃逸)
开启 Docker userns-remap:宿主机把容器内 root 映射成宿主机一个普通 uid。 即使容器逃逸出来,这个 root 只是宿主机普通用户,破坏力大幅下降。
缺点:会影响文件权限,需要提前评估业务。
四、网络安全
默认不暴露端口,按需映射 不要
-p 0.0.0.0:8080:8080对外全网监听,能绑定127.0.0.1就绑定本地。使用独立自定义网桥,不要默认 bridge 默认 bridge 网络隔离弱;compose 默认会创建独立网络,这点比较好。
容器之间最小访问策略 不要让所有容器互通;高级场景可以用网络策略(K8s NetworkPolicy / 第三方插件如 Calico)。
容器内服务强制 TLS Web、API、数据库都上 TLS;禁止明文传输敏感数据。
不要在容器里跑端口扫描、抓包(需要 CAP_NET_RAW,按需严格评估)
五、宿主机层面安全
Docker daemon 不要监听外网 TCP(2375 明文端口) 2375 无认证,非常危险;如果需要远程管理,走 2376 TLS 或者 ssh 转发,不要裸开 2375。
很多被挖矿的机器就是暴露了 2375。
保护 docker.sock 文件权限 只有必要用户加入
docker用户组;加入 docker 组等价于 root 权限,不要随便给开发账号加 docker 组。宿主机内核保持更新 容器共享宿主机内核,内核漏洞(如容器逃逸 CVE)会直接影响所有容器。
宿主机最小化,关闭不必要服务
监控宿主机上容器进程、文件改动 可以用 Falco 做运行时行为检测(容器安全运行时引擎)
六、环境变量、Secret、配置
敏感信息不要用环境变量传递(
docker inspect可以看到环境变量) ✅ 推荐:Docker Secrets(Swarm)、外部密钥管理(Vault、KMS)、临时文件挂载(权限严格 0400)不要把
--env PASSWORD=xxx写在命令行(ps 能抓到)
七、日志与审计
容器日志不要存在本地磁盘,转发到 Loki/ELK/Syslog
开启 Docker daemon 审计日志,记录容器创建、删除、挂载、exec 进入容器等操作
禁止
docker run --log-driver=none关闭日志(生产禁止)监控异常行为:比如容器内突然执行
curl、wget、chmod +x、加载内核模块、访问 docker.sock
八、Docker Compose 专属安全建议
compose 文件不要硬编码密码
用
user:指定运行用户显式配置
cap_drop、security_opt、read_only、tmpfs、资源限制版本锁定,不要用
latest不要在 compose 里挂载
/var/run/docker.sock除非明确知晓风险
示例一份偏安全的 compose 片段:
services:
app:
image: myapp:1.0.0
user: "1001:1001"
read_only: true
tmpfs:
- /tmp:size=50M
cap_drop:
- ALL
cap_add:
- NET_BIND_SERVICE
security_opt:
- no-new-privileges:true
deploy:
resources:
limits:
cpus: '0.5'
memory: 512M
ports:
- "127.0.0.1:8080:8080"
九、运行时防护与检测
Falco:实时检测容器异常行为(反向 shell、逃逸、敏感文件访问)
Tracee:系统调用审计
定期巡检:清理停止的容器、无用镜像、匿名卷
不要长期运行同一个容器,变更走重建(容器是不可变基础设施,尽量无状态)
十、日常运维规范
禁止
docker exec -it进容器改配置,改配置要重建镜像 / 启动新容器容器退出策略:生产一般
restart: unless-stopped,避免故障自动拉起恶意容器定期更新基础镜像、重新构建、重新部署,不要长年不更新镜像
权限分离:镜像构建、仓库推送、宿主机 docker 操作、编排权限分开
简短风险速查表(高频坑)
本文原创作者:易君召,详见:https://www.yijunzhao.cn/authors/yijunzhao,转载请注明出处。
原文链接
欢迎访问 小易撩挨踢