The interface is localized. Skill descriptions and documents are machine-translated by AI into your language; code, commands, paths and technical terms stay in the original, and the author's document governs.
Explore skills
DevOps · SKILL.md

hardening-docker-containers-for-production

hardening-docker-containers-for-production

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

Independent GitHub snapshot · Automated classification · Original documentation governs

Skill documentation

GitHub

name: hardening-docker-containers-for-production description: 对生产环境 Docker 容器进行安全加固,涵盖符合 CIS Docker Benchmark v1.8.0 的安全最佳实践,旨在最小化攻击面、防止权限提升,并在 Docker daemon、镜像、容器和运行时配置中强制执行最小权限原则 domain: cybersecurity subdomain: container-security tags: [containers, docker, security, hardening, CIS-benchmark] version: "1.0" author: mahipal license: Apache-2.0

生产环境 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

# 使用特定摘要以确保可重现性
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 配置

{
  "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 Content Trust

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:配置宿主机级别审计

# 为 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

验证命令

# 运行 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 ALL5.3
资源限制--memory、--cpus、--pids-limit5.10
禁止获取新权限--security-opt no-new-privileges5.25
内容信任DOCKER_CONTENT_TRUST=14.5
Daemon TLSdaemon.json TLS 配置2.6
审计日志auditd 规则1.1

参考资料

Saved skills