答案是围绕“谁在跑、跑什么、怎么跑、从哪来、到哪去”五点展开,核心包括镜像可信(digest/签名验证、DOCKER_CONTENT_TRUST=1)、运行受限(非root用户、--cap-drop=ALL)、通信加密(Docker TLS配置)、日志可溯(syslog驱动+auditd)、残留清零(--rm+prune策略)。

直接上手做 Docker 容器安全合规检查,核心是围绕“谁在跑、跑什么、怎么跑、从哪来、到哪去”这五个关键点展开。不靠堆工具,而是抓住配置主线——镜像可信、运行受限、通信加密、日志可溯、残留清零。
镜像来源与完整性验证
合规第一步是确认镜像没被篡改、来源可信。不能只看 tag(比如 latest),得认 digest 和签名。
- 用 docker inspect --format='{{.RepoDigests}}' 镜像名 提取镜像摘要,比对私有仓库或官方发布的 SHA256 值
- 启用内容信任:启动 DOCKER_CONTENT_TRUST=1 环境变量,强制拉取带 Notary 签名的镜像
- 私有仓库(如 Harbor)必须开启 Notary 或 cosign 签名功能,并在 CI/CD 流水线中自动签名: cosign sign --key private.key registry.example.com/app:v1.2
- 禁止使用无标签镜像或未扫描镜像;所有镜像上线前须通过 Trivy 扫描,且 --severity CRITICAL,HIGH 漏洞数为 0
容器运行时最小权限配置
让容器“能干活、但干不了坏事”,重点是降权、限能、只读。
- 镜像构建时必须指定非 root 用户:RUN adduser -D appuser && chown -R appuser /app + USER appuser
- 运行容器时禁用特权:--privileged=false(默认已禁,但需显式确认)
- 丢弃全部 Linux 能力,按需添加:--cap-drop=ALL --cap-add=NET_BIND_SERVICE
- 挂载关键路径为只读:--read-only --tmpfs /run --tmpfs /tmp,敏感目录如 /etc/passwd 用 --volume /host/etc/passwd:/etc/passwd:ro
Docker 守护进程与 API 安全加固
守护进程是攻击入口,API 是管理命脉,必须加密+鉴权+限权。
- 禁用未加密 socket:systemctl stop docker,然后在 /etc/docker/daemon.json 中启用 TLS:
- {"tls": true, "tlscacert": "/etc/docker/certs/ca.pem", "tlscert": "/etc/docker/certs/server-cert.pem", "tlskey": "/etc/docker/certs/server-key.pem"}
- 对接企业身份系统:配置 authorization-plugins(如 docker-authz-plugin),限制 docker exec、docker cp 等高危操作权限
- 设置默认资源限制:"default-ulimits": {"nproc": {"Hard": 65535, "Soft": 65535}, "nofile": {"Hard": 65535, "Soft": 65535}}
日志审计与残留清理机制
等保要求“行为可查、数据不留”,日志要全、删要干净。
- 统一日志驱动:"log-driver": "syslog" 或 "json-file" 配合 "log-opts": {"max-size": "10m", "max-file": "3"}
- 记录关键操作:启用 auditd 或 dockerd --debug 模式采集 daemon 日志,重点关注 create、exec、pull 事件
- 容器退出后自动清理:docker run --rm;生产环境建议配置 overlay2 存储驱动并启用 prune 策略,定时执行 docker system prune -f --filter until=24h
- 删除容器时同步清理绑定卷:docker rm -v 容器名,避免敏感配置文件残留


















