Docker 安全加固指南
# Docker 安全加固指南容器不是保险箱不加固照样被黑。## 1. 使用非root用户dockerfileRUN addgroup -S appgroup adduser -S appuser -G appgroupUSER appuserbashdocker run -d -u 1000:1000 myapp容器内root如果逃逸就是宿主机root最危险的安全问题。## 2. 只读文件系统bashdocker run -d --read-only myapp# 需要写临时文件docker run -d --read-only --tmpfs /tmp myappdocker run -d --read-only --tmpfs /run myapp## 3. 删掉不必要的权限bash# 丢弃所有Linux能力只加需要的docker run -d \--cap-drop ALL \--cap-add NET_BIND_SERVICE \myapp默认Docker给容器一堆能力大部分用不到。常用能力- NET_BIND_SERVICE绑定1024以下端口- CHOWN改文件属主- SETUID/SETGID切换用户- SYS_PTRACE调试开发用## 4. 禁止特权模式bash# ❌ 千万别这么干docker run --privileged myapp# ✅ 按需添加能力docker run --cap-drop ALL --cap-add NET_BIND_SERVICE myappprivileged等于把宿主机所有设备都给了容器。## 5. 资源限制bashdocker run -d \-m 512m \--memory-swap512m \--cpus1.0 \--pids-limit 100 \myapp防止一个容器吃光资源影响其他容器。## 6. 网络隔离yamlservices:frontend:networks:- publicbackend:networks:- public- privatedb:networks:- privatenetworks:public:private:internal: true # 不能访问外网数据库不暴露到公共网络。## 7. 镜像安全扫描bash# docker scoutDocker官方docker scout cves myapp:1.0docker scout recommendations myapp:1.0# Trivy开源trivy image myapp:1.0# 在CI里扫描trivy image --exit-code 1 --severity CRITICAL myapp:1.0## 8. 镜像签名bash# Docker Content Trustexport DOCKER_CONTENT_TRUST1docker push myapp:1.0 # 自动签名docker pull myapp:1.0 # 验证签名## 9. 用户命名空间json// /etc/docker/daemon.json{userns-remap: default}容器内root映射到宿主机一个普通用户即使逃逸也没root权限。## 10. 安全相关Dockerfile实践dockerfile# 固定版本FROM node:18.19.0-alpine3.19# 不装多余包RUN apk add --no-cache curl# 不存敏感信息# ❌ ENV DB_PASSWORDxxx# ✅ 运行时通过Secret或环境变量注入# COPY时指定ownerCOPY --chownappuser:appgroup . /app# 健康检查HEALTHCHECK CMD curl -f http://localhost:3000/health || exit 1## 11. 审计日志json// /etc/docker/daemon.json{log-driver: local,log-opts: {max-size: 10m,max-file: 5}}保留日志用于审计追溯。## 12. 宿主机安全bash# 关掉不必要的Docker API# 不要把Docker socket暴露给容器# ❌ docker run -v /var/run/docker.sock:/var/run/docker.sock ...# 限制Docker API访问# /etc/docker/daemon.json{hosts: [unix:///var/run/docker.sock] # 只监听本地socket}## 安全检查清单- [ ] 容器不以root运行- [ ] 只读文件系统或最小写入- [ ] 丢弃不必要的Linux能力- [ ] 设置资源限制- [ ] 网络隔离数据库不暴露- [ ] 镜像定期扫描漏洞- [ ] 不挂载Docker socket- [ ] 镜像固定版本号- [ ] 敏感信息用Secret不用环境变量- [ ] 启用日志审计---Docker安全没有银弹就是一层一层加防护。最关键的两条别用root、别用privileged。