SuperAPI AI 工具集

hardening-docker-containers-for-production

安全与审计

查看项目

更新于 10-15 12:45

技能介绍

用途

本技能用于在生产环境中加固 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、限制容器间通信、配置日志;
  • 守护进程配置文件:设置 daemon.json 的属主与权限;
  • 容器镜像与构建文件:使用可信基础镜像、扫描漏洞、多阶段构建;
  • 容器运行时:丢弃能力、只读根文件系统、限制系统调用;
  • 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}}'

关键安全控制

  • 非 root 用户:Dockerfile 中的 USER 指令,对应 CIS 4.1;
  • 只读根文件系统:--read-only 参数,对应 CIS 5.12;
  • 丢弃能力:--cap-drop ALL,对应 CIS 5.3;
  • 资源限制:--memory、--cpus、--pids-limit,对应 CIS 5.10;
  • 禁止新权限:--security-opt no-new-privileges,对应 CIS 5.25;
  • 内容信任:DOCKER_CONTENT_TRUST=1,对应 CIS 4.5;
  • 守护进程 TLS:daemon.json TLS 配置,对应 CIS 2.6;
  • 审计日志:auditd 规则,对应 CIS 1.1。

限制

资料未说明本技能的授权许可、维护状态或更新频率,亦未提供具体漏洞扫描工具集成、CI/CD 流水线接入方式或除上述示例外的其他环境适配说明,这些信息暂未提供。