mcpField
H
hardening-docker-daemon-configuration

hardening-docker-daemon-configuration

github.com/mukul975安全35.2k156 次安装8 周前更新
代码仓库

关于 hardening-docker-daemon-configuration

该技能汇总 Docker 守护进程的加固配置方法,面向负责 Docker 主机安全的运维和安全团队。内容包括 daemon.json、远程 API 的 TLS、套接字保护及容器隔离措施。

主要功能

  1. 01配置用户命名空间映射
  2. 02禁用默认容器间通信
  3. 03通过 TLS 保护远程 API
  4. 04限制 Docker 套接字访问
  5. 05配置 seccomp 与 AppArmor

适用场景

  1. 01加固运行容器的 Docker 主机
  2. 02安全地启用远程 Docker 管理
  3. 03检查守护进程与容器安全设置

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/mukul975/anthropic-cybersecurity-skills --skill hardening-docker-daemon-configuration

安装后在 Claude Code 中输入/hardening-docker-daemon-configuration确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

LICENSE
assets/
template.md
references/
api-reference.md
standards.md
workflows.md
scripts/
agent.py
process.py

详细介绍

强化 Docker Daemon 配置

概述

Docker daemon(dockerd)以 root 权限运行,并控制所有容器操作。通过 /etc/docker/daemon.json、TLS 证书、用户命名空间重映射和网络限制来强化其配置,对于防止权限提升、横向移动和容器逃逸攻击至关重要。

何时使用

  • 在你的环境中部署或配置强化 Docker daemon 配置能力时
  • 建立与合规要求一致的安全控制时
  • 为该领域构建或改进安全架构时
  • 开展需要此实施的安全评估时

前提条件

  • 已安装 Docker Engine 24.0+
  • 对 Docker 主机的 root 或 sudo 访问权限
  • 用于生成 TLS 证书的 OpenSSL
  • 了解 Linux 命名空间和 cgroups

核心强化 daemon.json

{
  "icc": false,
  "userns-remap": "default",
  "no-new-privileges": true,
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "5"
  },
  "storage-driver": "overlay2",
  "live-restore": true,
  "userland-proxy": false,
  "default-ulimits": {
    "nofile": {
      "Name": "nofile",
      "Hard": 65536,
      "Soft": 32768
    },
    "nproc": {
      "Name": "nproc",
      "Hard": 4096,
      "Soft": 2048
    }
  },
  "seccomp-profile": "/etc/docker/seccomp/default.json",
  "default-address-pools": [
    {
      "base": "172.17.0.0/16",
      "size": 24
    }
  ],
  "iptables": true,
  "ip-forward": true,
  "ip-masq": true,
  "experimental": false,
  "metrics-addr": "127.0.0.1:9323",
  "max-concurrent-downloads": 3,
  "max-concurrent-uploads": 5,
  "default-runtime": "runc",
  "runtimes": {
    "runsc": {
      "path": "/usr/local/bin/runsc",
      "runtimeArgs": ["--platform=ptrace"]
    }
  }
}

逐项设置说明

禁用容器间通信(ICC)
{
  "icc": false
}

阻止默认 bridge 网络上的容器相互通信。每个容器必须使用显式的 --link 或带已发布端口的用户自定义网络。

启用用户命名空间重映射
{
  "userns-remap": "default"
}

将容器 root(UID 0)映射到主机上的高权限非特权 UID。这可防止容器逃逸后在主机上获得 root。

# Verify userns-remap is active
cat /etc/subuid
# Output: dockremap:100000:65536

cat /etc/subgid
# Output: dockremap:100000:65536

# Verify container UID mapping
docker run --rm alpine id
# uid=0(root) gid=0(root) -- but host UID is 100000+
禁用新的权限提升
{
  "no-new-privileges": true
}

阻止容器进程通过 setuid/setgid 二进制文件或能力提升获得额外权限。

启用 Live Restore
{
  "live-restore": true
}

在 daemon 停机期间保持容器运行,从而无需重启容器即可升级 daemon。

禁用用户态代理
{
  "userland-proxy": false
}

使用 iptables 规则而非 docker-proxy 进行端口转发,从而减少攻击面并提升性能。

远程 Docker API 的 TLS 配置

生成 CA 和服务器证书
# Create CA
openssl genrsa -aes256 -out ca-key.pem 4096
openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem \
  -subj "/CN=Docker CA"

# Create server key and CSR
openssl genrsa -out server-key.pem 4096
openssl req -subj "/CN=docker-host" -sha256 -new -key server-key.pem -out server.csr

# Create extfile with SANs
echo "subjectAltName = DNS:docker-host,IP:10.0.0.5,IP:127.0.0.1" > extfile.cnf
echo "extendedKeyUsage = serverAuth" >> extfile.cnf

# Sign server certificate
openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem \
  -CAcreateserial -out server-cert.pem -extfile extfile.cnf

# Create client key and certificate
openssl genrsa -out key.pem 4096
openssl req -subj "/CN=client" -new -key key.pem -out client.csr
echo "extendedKeyUsage = clientAuth" > extfile-client.cnf
openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem \
  -CAcreateserial -out cert.pem -extfile extfile-client.cnf

# Set permissions
chmod 0400 ca-key.pem key.pem server-key.pem
chmod 0444 ca.pem server-cert.pem cert.pem

# Move to Docker TLS directory
sudo mkdir -p /etc/docker/tls
sudo cp ca.pem server-cert.pem server-key.pem /etc/docker/tls/
为 TLS 配置 daemon.json
{
  "tls": true,
  "tlsverify": true,
  "tlscacert": "/etc/docker/tls/ca.pem",
  "tlscert": "/etc/docker/tls/server-cert.pem",
  "tlskey": "/etc/docker/tls/server-key.pem",
  "hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2376"]
}
客户端连接
docker --tlsverify \
  --tlscacert=ca.pem \
  --tlscert=cert.pem \
  --tlskey=key.pem \
  -H=tcp://docker-host:2376 version

Docker Socket 保护

# Restrict socket ownership
sudo chown root:docker /var/run/docker.sock
sudo chmod 660 /var/run/docker.sock

# Audit Docker socket access
sudo auditctl -w /var/run/docker.sock -k docker-socket

# Never mount Docker socket into containers
# BAD: docker run -v /var/run/docker.sock:/var/run/docker.sock ...

Rootless Docker

# Install rootless Docker
curl -fsSL https://get.docker.com/rootless | sh

# Configure environment
export PATH=$HOME/bin:$PATH
export DOCKER_HOST=unix://$XDG_RUNTIME_DIR/docker.sock

# Start rootless daemon
systemctl --user start docker
systemctl --user enable docker

# Verify rootless mode
docker info | grep -i rootless
# Rootless: true

内容信任(镜像签名)

# Enable Docker Content Trust
export DOCKER_CONTENT_TRUST=1

# Pull only signed images
docker pull library/alpine:3.18
# Will fail if image is not signed

# Sign and push image
docker trust sign myregistry/myapp:1.0

Seccomp 配置文件

# View default seccomp profile
docker info --format '{{.SecurityOptions}}'

# Use custom seccomp profile
docker run --security-opt seccomp=/etc/docker/seccomp/custom.json alpine

# Verify seccomp is enabled
docker inspect --format='{{.HostConfig.SecurityOpt}}' container_name

AppArmor 配置文件

# Check AppArmor status
sudo aa-status

# Use custom AppArmor profile
docker run --security-opt apparmor=docker-custom alpine

# Load custom profile
sudo apparmor_parser -r /etc/apparmor.d/docker-custom

验证命令

# Check daemon configuration
docker info

# Verify userns-remap
docker info --format '{{.SecurityOptions}}'

# Check ICC setting
docker network inspect bridge --format '{{.Options}}'

# Audit with Docker Bench
docker run --rm --net host --pid host \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v /etc:/etc:ro \
  docker/docker-bench-security

最佳实践

  1. 切勿在没有 TLS 的情况下暴露 Docker daemon - 远程访问时始终使用 --tlsverify
  2. 启用用户命名空间重映射 - 将容器 root 映射到非特权主机 UID
  3. 禁用 ICC - 阻止默认 bridge 网络的容器间通信
  4. 使用 rootless 模式 - 尽可能以非 root 身份运行 Docker daemon
  5. 启用内容信任 - 仅拉取已签名的镜像
  6. 配置日志轮转 - 防止日志文件填满磁盘
  7. 使用 seccomp 配置文件 - 限制容器可用的系统调用
  8. 审计 Docker socket - 监控对 /var/run/docker.sock 的访问
  9. 定期运行 Docker Bench - 自动化 CIS 基准检查
  10. 保持 Docker 更新 - 及时应用安全补丁

评论

支持 Markdown