# Hardening Docker Containers For Production

> 对生产环境 Docker 容器进行安全加固，涵盖符合 CIS Docker Benchmark v1.8.0 的安全最佳实践，旨在最小化攻击面、防止权限提升，并在 Docker daemon、镜像、容器和运行时配置中强制执行最小权限原则

- Skill: `killvxk/hardening-docker-containers-for-production` (Agent Skill, multi-file: 8 files)
- Install (CLI): `npx skillmds@latest add killvxk/hardening-docker-containers-for-production`
- Raw SKILL.md: https://api.skillmd.com/api/skills/killvxk/hardening-docker-containers-for-production/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: DevOps & Infra
- License: Apache-2.0
- Author: killvxk (https://skillmd.com/u/killvxk)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/killvxk/hardening-docker-containers-for-production

---

# 生产环境 Docker 容器安全加固

## 概述

对生产环境 Docker 容器进行安全加固，涵盖符合 CIS Docker Benchmark v1.8.0 的安全最佳实践，旨在最小化攻击面、防止权限提升，并在 Docker daemon、镜像、容器和运行时配置中强制执行最小权限原则。

## 前置条件

- 已安装 Docker Engine 24.0+
- Docker Compose v2
- 内核版本 5.10+ 的 Linux 主机
- Docker 宿主机上的 root 或 sudo 权限
- docker-bench-security 工具
- Hadolint，用于 Dockerfile 代码检查
- Dockle，用于镜像代码检查

## 核心概念

### CIS Docker Benchmark 章节

1. **宿主机配置** —— 审计 Docker daemon 文件，限制对 /var/run/docker.sock 的访问
2. **Docker Daemon 配置** —— 启用 TLS，限制容器间通信，配置日志
3. **Docker Daemon 配置文件** —— 设置 daemon.json 的所有权和权限
4. **容器镜像与构建文件** —— 使用可信基础镜像，扫描漏洞，多阶段构建
5. **容器运行时** —— 删除能力（Capability），只读根文件系统，限制系统调用
6. **Docker 安全运营** —— 监控、审计和轮换凭据

### 核心加固原则

- **最小权限**：以非 root 用户运行容器，删除所有非必要能力
- **不可变性**：使用只读根文件系统，对可写目录使用 tmpfs
- **最小化**：使用 distroless 或 Alpine 基础镜像，多阶段构建
- **隔离**：应用 seccomp 配置文件、AppArmor/SELinux 及命名空间限制
- **可审计性**：启用内容信任，记录所有容器活动

## 实施步骤

### 步骤 1：加固 Dockerfile

```dockerfile
# 使用特定摘要以确保可重现性
FROM python:3.12-slim@sha256:abc123... AS builder

WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir --user -r requirements.txt

# 生产阶段——最小镜像
FROM gcr.io/distroless/python3-debian12

# 仅复制必要的工件
COPY --from=builder /root/.local /root/.local
COPY --from=builder /app /app

WORKDIR /app

# 创建非 root 用户
USER 65534:65534

# 设置只读文件系统预期
LABEL org.opencontainers.image.source="https://github.com/org/app"

ENTRYPOINT ["python", "app.py"]
```

### 步骤 2：加固 Docker Daemon 配置

```json
{
  "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：加固容器运行时

```bash
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 Content Trust

```bash
export DOCKER_CONTENT_TRUST=1
export DOCKER_CONTENT_TRUST_SERVER=https://notary.example.com

# 签名并推送镜像
docker trust sign myregistry.com/myapp:v1.0.0

# 拉取前验证镜像签名
docker trust inspect --pretty myregistry.com/myapp:v1.0.0
```

### 步骤 5：配置宿主机级别审计

```bash
# 为 Docker 文件和目录添加审计规则
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
```

## 验证命令

```bash
# 运行 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

# 检查 Dockerfile
hadolint Dockerfile

# 检查构建的镜像
dockle myapp:latest

# 验证没有以 root 运行的容器
docker ps -q | xargs docker inspect --format '{{.Id}}: User={{.Config.User}}'
```

## 关键安全控制

| 控制 | 实现方式 | CIS 章节 |
|------|---------|---------|
| 非 root 用户 | Dockerfile 中的 USER 指令 | 4.1 |
| 只读根文件系统 | --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 |
| Daemon TLS | daemon.json TLS 配置 | 2.6 |
| 审计日志 | auditd 规则 | 1.1 |

## 参考资料

- [CIS Docker Benchmark](https://www.cisecurity.org/benchmark/docker)
- [Docker Security Best Practices](https://docs.docker.com/engine/security/)
- [Docker Bench Security Tool](https://github.com/docker/docker-bench-security)
- [Hadolint - Dockerfile Linter](https://github.com/hadolint/hadolint)

