关于 hardening-docker-containers-for-production
面向生产环境 Docker 部署团队的容器安全加固指南,依据 CIS Docker Benchmark v1.8.0。涵盖主机、守护进程、镜像和运行时控制,并提供配置示例与验证步骤。
主要功能
- 01加固 Dockerfile 和镜像
- 02配置 Docker 守护进程安全
- 03限制容器运行时权限
- 04启用镜像内容信任
- 05设置主机级审计
- 06按安全检查验证配置
适用场景
- 01为生产环境部署准备 Docker
- 02实施符合 CIS 的安全控制
- 03审查容器及主机配置
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill hardening-docker-containers-for-production安装后在 Claude Code 中输入/hardening-docker-containers-for-production确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
LICENSEassets/template.mdreferences/api-reference.mdstandards.mdworkflows.mdscripts/agent.pyprocess.py详细介绍
强化生产环境 Docker 容器
概述
强化生产环境 Docker 容器需要应用与 CIS Docker Benchmark v1.8.0 对齐的安全最佳实践,以在 Docker 守护进程、镜像、容器和运行时配置中最小化攻击面、防止权限提升并强制执行最小权限原则。
何时使用
- 在环境中部署或配置用于生产环境能力的强化 Docker 容器时
- 建立与合规要求对齐的安全控制时
- 为该领域构建或改进安全架构时
- 执行需要此实现的安全评估时
前提条件
- 已安装 Docker Engine 24.0+
- Docker Compose v2
- 内核为 5.10+ 的 Linux 主机
- Docker 主机上的 root 或 sudo 访问权限
- docker-bench-security 工具
- 用于 Dockerfile 检查的 Hadolint
- 用于镜像检查的 Dockle
核心概念
CIS Docker Benchmark 章节
- 主机配置 - 审计 Docker 守护进程文件,限制对 /var/run/docker.sock 的访问
- Docker 守护进程配置 - 启用 TLS,限制容器间通信,配置日志记录
- Docker 守护进程配置文件 - 设置 daemon.json 的所有权和权限
- 容器镜像和构建文件 - 使用可信基础镜像,扫描漏洞,多阶段构建
- 容器运行时 - 移除能力,只读 rootfs,限制系统调用
- Docker 安全运维 - 监控、审计和轮换凭证
关键强化原则
- 最小权限:以非 root 用户运行容器,除所需能力外移除所有能力
- 不可变性:使用只读根文件系统,可写目录使用 tmpfs
- 最小化:使用 distroless 或 Alpine 基础镜像,多阶段构建
- 隔离:应用 seccomp 配置文件、AppArmor/SELinux、命名空间限制
- 可审计性:启用内容信任,记录所有容器活动
工作流
步骤 1:强化 Dockerfile
# Use specific digest for reproducibility
FROM python:3.12-slim@sha256:abc123... AS builder
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir --user -r requirements.txt
# Production stage - minimal image
FROM gcr.io/distroless/python3-debian12
# Copy only necessary artifacts
COPY --from=builder /root/.local /root/.local
COPY --from=builder /app /app
WORKDIR /app
# Create non-root user
USER 65534:65534
# Set read-only filesystem expectation
LABEL org.opencontainers.image.source="https://github.com/org/app"
ENTRYPOINT ["python", "app.py"]
步骤 2:强化 Docker 守护进程配置
{
"icc": false,
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
},
"live-restore": true,
"userland-proxy": false,
"no-new-privileges": true,
"default-ulimits": {
"nofile": {
"Name": "nofile",
"Hard": 64000,
"Soft": 64000
},
"nproc": {
"Name": "nproc",
"Hard": 1024,
"Soft": 1024
}
},
"seccomp-profile": "/etc/docker/seccomp-default.json",
"tls": true,
"tlscacert": "/etc/docker/tls/ca.pem",
"tlscert": "/etc/docker/tls/server-cert.pem",
"tlskey": "/etc/docker/tls/server-key.pem",
"tlsverify": true
}
步骤 3:强化容器运行时
docker run -d \
--name production-app \
--read-only \
--tmpfs /tmp:rw,noexec,nosuid,size=100m \
--tmpfs /var/run:rw,noexec,nosuid,size=10m \
--cap-drop ALL \
--cap-add NET_BIND_SERVICE \
--security-opt no-new-privileges:true \
--security-opt seccomp=/etc/docker/seccomp-default.json \
--security-opt apparmor=docker-default \
--pids-limit 100 \
--memory 512m \
--memory-swap 512m \
--cpus 1.0 \
--user 65534:65534 \
--network custom-bridge \
--restart on-failure:3 \
--health-cmd "curl -f http://localhost:8080/health || exit 1" \
--health-interval 30s \
--health-timeout 10s \
--health-retries 3 \
myapp:latest
步骤 4:启用 Docker 内容信任
export DOCKER_CONTENT_TRUST=1
export DOCKER_CONTENT_TRUST_SERVER=https://notary.example.com
# Sign and push image
docker trust sign myregistry.com/myapp:v1.0.0
# Verify image signature before pull
docker trust inspect --pretty myregistry.com/myapp:v1.0.0
步骤 5:配置主机级审计
# Add audit rules for Docker files and directories
cat >> /etc/audit/rules.d/docker.rules << 'EOF'
-w /usr/bin/docker -k docker
-w /var/lib/docker -k docker
-w /etc/docker -k docker
-w /lib/systemd/system/docker.service -k docker
-w /lib/systemd/system/docker.socket -k docker
-w /etc/default/docker -k docker
-w /etc/docker/daemon.json -k docker
-w /usr/bin/containerd -k docker
-w /usr/bin/runc -k docker
EOF
systemctl restart auditd
验证命令
# Run Docker Bench Security
docker run --rm --net host --pid host \
--userns host --cap-add audit_control \
-e DOCKER_CONTENT_TRUST=$DOCKER_CONTENT_TRUST \
-v /etc:/etc:ro \
-v /usr/bin/containerd:/usr/bin/containerd:ro \
-v /usr/bin/runc:/usr/bin/runc:ro \
-v /usr/lib/systemd:/usr/lib/systemd:ro \
-v /var/lib:/var/lib:ro \
-v /var/run/docker.sock:/var/run/docker.sock:ro \
docker/docker-bench-security
# Lint Dockerfile
hadolint Dockerfile
# Lint built image
dockle myapp:latest
# Verify no containers running as root
docker ps -q | xargs docker inspect --format '{{.Id}}: User={{.Config.User}}'
关键安全控制
| 控制 | 实现 | CIS 章节 |
|---|---|---|
| 非 root 用户 | Dockerfile 中的 USER 指令 | 4.1 |
| 只读 rootfs | --read-only 标志 | 5.12 |
| 移除能力 | --cap-drop ALL | 5.3 |
| 资源限制 | --memory, --cpus, --pids-limit | 5.10 |
| 无新权限 | --security-opt no-new-privileges | 5.25 |
| 内容信任 | DOCKER_CONTENT_TRUST=1 | 4.5 |
| 守护进程 TLS | daemon.json TLS 配置 | 2.6 |
| 审计日志 | auditd 规则 | 1.1 |
参考
评论
支持 Markdown