安全最佳实践
安全是生产环境中最重要的考虑因素之一。本文介绍 Docker 安全最佳实践。
基本原则
1. 不使用 root 用户运行
# 创建非 root 用户FROM node:18-alpine
RUN addgroup -g 1001 nodejs && \ adduser -D -u 1001 -G nodejs nodejs
USER nodejs
WORKDIR /appCOPY --chown=nodejs:nodejs . .
CMD ["node", "server.js"]2. 使用官方镜像
# ✅ 好:使用官方镜像FROM node:18-alpine
# ❌ 不好:使用未知来源FROM random-user/node3. 固定镜像版本
# ✅ 好:指定具体版本FROM node:18.17-alpine3.18
# ❌ 不好:使用 latestFROM node:latestDockerfile 安全
最小权限原则
FROM alpine:3.18
# 只安装必要软件RUN apk add --no-cache python3
# 使用非 root 用户RUN adduser -D appuserUSER appuser
# 只读文件系统COPY --chown=appuser:appuser app.py .
CMD ["python3", "app.py"]敏感信息管理
# ❌ 不好:硬编码密码ENV DB_PASSWORD=secret123
# ✅ 好:使用 secrets# docker run --env-file .env myapp使用 .env 文件:
DB_PASSWORD=secret123API_KEY=xyz789docker run --env-file .env myapp多阶段构建
# 构建阶段FROM golang:1.21 AS builderWORKDIR /buildCOPY . .RUN go build -o app
# 运行阶段(最小化攻击面)FROM alpine:latestRUN apk --no-cache add ca-certificatesCOPY --from=builder /build/app .USER nobodyCMD ["./app"]运行时安全
只读根文件系统
docker run --read-only nginx限制容器权限
# 移除所有权限docker run --cap-drop ALL nginx
# 只添加必要权限docker run --cap-drop ALL --cap-add NET_BIND_SERVICE nginx使用 AppArmor/SELinux
# 使用安全配置docker run --security-opt apparmor=docker-default nginxDocker Compose 安全
services: web: image: myapp:1.0 user: "1000:1000" read_only: true cap_drop: - ALL security_opt: - no-new-privileges:true environment: - DB_PASSWORD=${DB_PASSWORD}网络安全
隔离敏感服务
services: frontend: networks: - public
backend: networks: - public - private
database: networks: - private # 数据库只在内部网络
networks: public: private: internal: true限制端口暴露
# ❌ 不好:暴露到所有接口docker run -p 5432:5432 postgres
# ✅ 好:只绑定到 localhostdocker run -p 127.0.0.1:5432:5432 postgres镜像扫描
使用 Docker Scout
# 扫描镜像漏洞docker scout cves myapp:latest
# 查看推荐修复docker scout recommendations myapp:latest使用 Trivy
# 安装 Trivybrew install aquasecurity/trivy/trivy
# 扫描镜像trivy image myapp:latest
# 只显示高危和严重漏洞trivy image --severity HIGH,CRITICAL myapp:latestSecrets 管理
Docker Secrets(Swarm)
# 创建 secretecho "my-secret-password" | docker secret create db_password -
# 使用 secretdocker service create \ --name db \ --secret db_password \ postgres环境变量文件
services: web: env_file: - .env.production使用外部工具
- HashiCorp Vault
- AWS Secrets Manager
- Azure Key Vault
安全检查清单
- 使用官方基础镜像
- 固定镜像版本标签
- 不使用 root 用户运行
- 扫描镜像漏洞
- 使用多阶段构建
- 不在镜像中存储敏感信息
- 限制容器权限
- 配置资源限制
- 使用健康检查
- 启用日志审计
- 定期更新镜像
- 使用私有镜像仓库
合规性
CIS Docker Benchmark
使用 Docker Bench 检查安全配置:
docker run --rm -it \ --net host \ --pid host \ --cap-add audit_control \ -v /var/lib:/var/lib \ -v /var/run/docker.sock:/var/run/docker.sock \ docker/docker-bench-security