mcpField
D
docker-security-guide

docker-security-guide

github.com/josiahsiegel安全59599 次安装19 周前更新
代码仓库

关于 docker-security-guide

docker-security-guide 是面向 Docker 使用者的安全技能指南,覆盖镜像、构建、运行时、网络和运维。它提供风险缓解建议、命令示例及安全检查清单。

主要功能

  1. 01镜像来源与漏洞扫描建议
  2. 02构建和运行时加固方法
  3. 03网络隔离与端口控制
  4. 04机密管理与合规检查
  5. 05日志、监控和平台安全建议

适用场景

  1. 01审查容器镜像与构建配置
  2. 02为生产容器配置最小权限
  3. 03评估 Docker 环境的安全措施

安装

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

$npx skills add https://github.com/josiahsiegel/claude-plugin-marketplace --skill docker-security-guide

安装后在 Claude Code 中输入/docker-security-guide确认已加载。

附带文件references/build-runtime-security.md

详细介绍

🚨 关键指南

Windows 文件路径要求

必须:在 Windows 上始终使用反斜杠表示文件路径

在 Windows 上使用 Edit 或 Write 工具时,必须在文件路径中使用反斜杠(\),而不是正斜杠(/)。

示例:

  • ❌ 错误:D:/repos/project/file.tsx
  • ✅ 正确:D:\repos\project\file.tsx

适用于:

  • Edit 工具的 file_path 参数
  • Write 工具的 file_path 参数
  • Windows 系统上的所有文件操作
文档指南

除非用户明确要求,否则绝不要创建新的文档文件。

  • 优先事项:更新现有的 README.md 文件,而不是创建新文档
  • 保持仓库整洁:保持仓库根目录整洁——除非用户另有要求,否则只保留 README.md
  • 风格:文档应简洁、直接且专业——避免 AI 生成的语气
  • 用户偏好:只有用户明确要求提供文档时,才创建额外的 .md 文件

Docker 安全指南

本技能提供适用于所有平台的全面 Docker 安全指南,涵盖威胁、缓解措施和合规要求。

安全原则

深度防御

在多个层面实施安全措施:

  1. 镜像安全: 使用精简、经过扫描和签名的镜像
  2. 构建安全: 确保构建流程安全,不在镜像层中包含密钥
  3. 运行时安全: 限制功能并设置资源限制
  4. 网络安全: 隔离并遵循最小权限原则
  5. 主机安全: 加固主机操作系统并更新 Docker 守护进程
  6. 编排安全: 使用安全配置和 RBAC
  7. 监控: 检测、记录日志并发出警报
最小权限

仅授予必要的最低权限:

  • 使用非 root 用户
  • 移除功能
  • 使用只读文件系统
  • 最大限度减少网络暴露
  • 限制系统调用(seccomp)
  • 限制资源

镜像安全

基础镜像选择

威胁: 有漏洞或恶意的基础镜像

缓解措施:

# Use official images only
FROM node:20.11.0-alpine3.19  # Official, specific version

# NOT
FROM randomuser/node  # Unverified source
FROM node:latest      # Unpredictable, can break

验证:

# Verify image source
docker image inspect node:20-alpine | grep -A 5 "Author"

# Enable Docker Content Trust (image signing)
export DOCKER_CONTENT_TRUST=1
docker pull node:20-alpine
精简镜像

威胁: 攻击面更大,漏洞更多

缓解措施:

# Prefer minimal distributions
FROM alpine:3.19           # ~7MB
FROM gcr.io/distroless/static  # ~2MB
FROM scratch               # 0MB (for static binaries)

# vs
FROM ubuntu:22.04          # ~77MB with more packages

优势:

  • 软件包越少 = 漏洞越少
  • 攻击面更小
  • 下载和启动更快
  • 占用更少磁盘空间
面向安全关键型应用的微型发行版(2025)

Wolfi/Chainguard 镜像:

  • 目标是零 CVE,默认包含 SBOM
  • 每晚发布安全补丁,并附带来源证明签名
  • 可用于:Node、Python、Go、Java、.NET 等

用法:

# Development stage (includes build tools)
FROM cgr.dev/chainguard/node:latest-dev AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production

# Production stage (minimal, zero-CVE goal)
FROM cgr.dev/chainguard/node:latest
WORKDIR /app
COPY --from=builder /app/node_modules ./node_modules
COPY . .
USER node
ENTRYPOINT ["node", "server.js"]

适用场景: 安全关键型应用、合规要求(SOC2、HIPAA、PCI-DSS)、零信任环境、重视供应链安全的场景。

完整的镜像对比表请参阅 docker-best-practices 技能。

漏洞扫描

工具:

  • Docker Scout(内置)
  • Trivy
  • Grype
  • Snyk
  • Clair

流程:

# Scan with Docker Scout
docker scout cves IMAGE_NAME
docker scout recommendations IMAGE_NAME

# Scan with Trivy
trivy image IMAGE_NAME
trivy image --severity HIGH,CRITICAL IMAGE_NAME

# Scan Dockerfile
trivy config Dockerfile

# Scan for secrets
trivy fs --scanners secret .

CI/CD 集成:

# GitHub Actions example
- name: Scan image
  run: |
    docker scout cves my-image:${{ github.sha }}
    trivy image --exit-code 1 --severity CRITICAL my-image:${{ github.sha }}
使用多阶段构建提升安全性

威胁: 最终镜像中包含构建工具和密钥

缓解措施:

# Build stage with build tools
FROM golang:1.21 AS builder
WORKDIR /app
COPY . .
RUN go build -o app

# Final stage - minimal, no build tools
FROM gcr.io/distroless/base-debian11
COPY --from=builder /app/app /
USER nonroot:nonroot
ENTRYPOINT ["/app"]

优势:

  • 生产镜像中不包含编译器或构建工具
  • 构建时使用的密钥不会留存
  • 最终镜像更小、更安全

构建时和运行时安全

关于构建密钥(--mount=type=secret、BuildKit)、多阶段加固、移除功能(--cap-drop=ALL)、seccomp / AppArmor 配置文件、只读根文件系统、用户命名空间、资源限制和无 root 运行时的完整配方,请参阅 references/build-runtime-security.md。核心原则:

  • 构建密钥: 使用 --mount=type=secret 和 --mount=type=ssh;切勿使用 ARG/ENV 存储敏感值。
  • 运行时: 移除所有功能,仅添加所需功能;以只读根文件系统运行;使用非 root 用户;设置资源限制;固定镜像摘要。
  • 配置文件: 应用 seccomp、AppArmor 和 SELinux,并结合使用用户命名空间。

所有命令和配方请参阅 references/build-runtime-security.md。

网络安全

网络隔离

威胁: 容器之间发生横向移动

缓解措施:

networks:
  frontend:
    driver: bridge
  backend:
    driver: bridge
    internal: true  # No external access

services:
  web:
    networks:
      - frontend

  api:
    networks:
      - frontend
      - backend

  database:
    networks:
      - backend  # Isolated from frontend
端口暴露

威胁: 不必要的网络暴露

缓解措施:

# Bind to localhost only
docker run -p 127.0.0.1:8080:8080 my-image

# NOT (binds to all interfaces)
docker run -p 8080:8080 my-image

在 Compose 中:

services:
  app:
    ports:
      - "127.0.0.1:8080:8080"  # Localhost only
容器间通信
# Disable default inter-container communication
# /etc/docker/daemon.json
{
  "icc": false
}

然后通过网络明确允许:

services:
  app1:
    networks:
      - app-network
  app2:
    networks:
      - app-network  # Can communicate with app1

networks:
  app-network:
    driver: bridge

密钥管理

Docker Secrets(Swarm 模式)
# Create secret
echo "mypassword" | docker secret create db_password -

# Use in service
docker service create \
  --name my-service \
  --secret db_password \
  my-image

# Access in container at /run/secrets/db_password

在堆栈文件中:

version: '3.8'

services:
  app:
    image: my-image
    secrets:
      - db_password

secrets:
  db_password:
    external: true
密钥最佳实践
  1. 绝不放在环境变量中(可通过 docker inspect 查看)
  2. 绝不放入镜像中(会保留在层历史记录中)
  3. 绝不纳入版本控制(Git 历史记录)
  4. 作为文件挂载,并限制权限
  5. 使用密钥管理系统(Vault、AWS Secrets Manager 等)
  6. 定期轮换

替代方案:挂载的密钥:

docker run -v /secure/secrets:/run/secrets:ro my-image

合规与基准测试

CIS Docker 基准

自动检查:

# Clone docker-bench-security
git clone https://github.com/docker/docker-bench-security.git
cd docker-bench-security
sudo sh docker-bench-security.sh

# Or run as container
docker run --rm --net host --pid host --userns host \
  --cap-add audit_control \
  -v /var/lib:/var/lib:ro \
  -v /var/run/docker.sock:/var/run/docker.sock:ro \
  -v /usr/lib/systemd:/usr/lib/systemd:ro \
  -v /etc:/etc:ro \
  docker/docker-bench-security
CIS 主要建议
  1. 主机配置

    • 保持 Docker 为最新版本
    • 限制容器之间的网络流量
    • 将日志级别设为 'info'
    • 启用 Docker Content Trust
  2. Docker 守护进程

    • 对 Docker 守护进程套接字使用 TLS
    • 不要在未使用 TLS 的情况下通过 TCP 暴露守护进程
    • 启用用户命名空间支持
  3. Docker 文件

    • 验证 Docker 文件的所有权和权限
    • 审计 Docker 文件和目录
  4. 容器镜像

    • 为容器创建用户
    • 使用可信的基础镜像
    • 不要安装不必要的软件包
  5. 容器运行时

    • 以有限权限运行容器
    • 设置资源限制
    • 不要共享主机网络命名空间

监控与检测

日志记录
services:
  app:
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"
        labels: "service,env"
        env: "ENV,VERSION"

集中式日志记录:

services:
  app:
    logging:
      driver: "syslog"
      options:
        syslog-address: "tcp://log-server:514"
        tag: "{{.Name}}/{{.ID}}"
运行时监控

工具:

  • Falco:运行时安全监控
  • Sysdig:容器可见性
  • Prometheus + cAdvisor:指标
  • Docker events:实时事件

监控内容:

  • 意外进程
  • 文件修改
  • 网络连接
  • 资源激增
  • 认证失败
  • 权限提升尝试
# Monitor Docker events
docker events --filter 'type=container' --filter 'event=start'

# Watch specific container
docker events --filter "container=my-container"

# Runtime security with Falco
docker run --rm -it \
  --privileged \
  -v /var/run/docker.sock:/host/var/run/docker.sock \
  -v /dev:/host/dev \
  -v /proc:/host/proc:ro \
  falcosecurity/falco

特定平台的安全性

Linux

用户命名空间重映射:

// /etc/docker/daemon.json
{
  "userns-remap": "default"
}

优点:容器中的 root 用户 → 在主机上为非特权用户

SELinux:

# Enable SELinux for Docker
setenforce 1

# Run with SELinux labels
docker run --security-opt label=type:svirt_sandbox_file_t my-image

# Volumes with SELinux
docker run -v /host/path:/container/path:z my-image

AppArmor:

# Check AppArmor status
aa-status

# Run with AppArmor profile
docker run --security-opt apparmor=docker-default my-image
Windows

Hyper-V 隔离:

# More isolated than process isolation
docker run --isolation=hyperv my-image

Windows Defender:

  • 确保已启用实时保护
  • 谨慎配置排除项
  • 定期扫描镜像
macOS

Docker Desktop 安全性:

  • 保持 Docker Desktop 为最新版本
  • 启用“Use gRPC FUSE for file sharing”
  • 将文件共享限制在必要路径内
  • 检查资源分配

安全检查清单

镜像:

  • 基于官方的精简镜像
  • 使用特定版本标签(而非 latest)
  • 已扫描漏洞
  • 层中不含密钥
  • 以非 root 用户身份运行
  • 已签名(Content Trust)

构建:

  • 已配置 .dockerignore
  • 使用多阶段构建(如适用)
  • 妥善处理构建密钥
  • 仅从可信来源构建

运行时:

  • 使用非 root 用户
  • 已移除功能
  • 使用只读文件系统(如可行)
  • 已设置安全选项
  • 已配置资源限制
  • 使用隔离网络
  • 尽量减少端口暴露
  • 安全挂载密钥

运维:

  • 符合 CIS 基准
  • 已配置日志记录
  • 已部署监控
  • 定期扫描漏洞
  • 制定事件响应计划
  • 定期更新
  • 已启用审计日志

常见安全错误

❌ 绝不要:

  • 以 root 身份运行
  • 使用 --privileged
  • 挂载 Docker 套接字(/var/run/docker.sock)
  • 将密钥硬编码
  • 使用 latest 标签
  • 跳过漏洞扫描
  • 暴露不必要的端口
  • 禁用安全功能
  • 忽略安全更新
  • 信任未经验证的镜像

✅ 务必:

  • 以非 root 身份运行
  • 移除功能
  • 扫描漏洞
  • 使用密钥管理
  • 标记具体版本
  • 启用安全选项
  • 遵循最小权限原则
  • 保持系统更新
  • 监控运行时行为
  • 使用官方镜像

本安全指南反映了当前的最佳实践。安全威胁不断演变——务必查阅最新的 Docker 安全文档和 CVE 数据库。

评论

支持 Markdown