关于 docker-security-guide
docker-security-guide 是面向 Docker 使用者的安全技能指南,覆盖镜像、构建、运行时、网络和运维。它提供风险缓解建议、命令示例及安全检查清单。
主要功能
- 01镜像来源与漏洞扫描建议
- 02构建和运行时加固方法
- 03网络隔离与端口控制
- 04机密管理与合规检查
- 05日志、监控和平台安全建议
适用场景
- 01审查容器镜像与构建配置
- 02为生产容器配置最小权限
- 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 安全指南,涵盖威胁、缓解措施和合规要求。
安全原则
深度防御
在多个层面实施安全措施:
- 镜像安全: 使用精简、经过扫描和签名的镜像
- 构建安全: 确保构建流程安全,不在镜像层中包含密钥
- 运行时安全: 限制功能并设置资源限制
- 网络安全: 隔离并遵循最小权限原则
- 主机安全: 加固主机操作系统并更新 Docker 守护进程
- 编排安全: 使用安全配置和 RBAC
- 监控: 检测、记录日志并发出警报
最小权限
仅授予必要的最低权限:
- 使用非 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
密钥最佳实践
- 绝不放在环境变量中(可通过
docker inspect查看) - 绝不放入镜像中(会保留在层历史记录中)
- 绝不纳入版本控制(Git 历史记录)
- 作为文件挂载,并限制权限
- 使用密钥管理系统(Vault、AWS Secrets Manager 等)
- 定期轮换
替代方案:挂载的密钥:
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 主要建议
-
主机配置
- 保持 Docker 为最新版本
- 限制容器之间的网络流量
- 将日志级别设为 'info'
- 启用 Docker Content Trust
-
Docker 守护进程
- 对 Docker 守护进程套接字使用 TLS
- 不要在未使用 TLS 的情况下通过 TCP 暴露守护进程
- 启用用户命名空间支持
-
Docker 文件
- 验证 Docker 文件的所有权和权限
- 审计 Docker 文件和目录
-
容器镜像
- 为容器创建用户
- 使用可信的基础镜像
- 不要安装不必要的软件包
-
容器运行时
- 以有限权限运行容器
- 设置资源限制
- 不要共享主机网络命名空间
监控与检测
日志记录
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 数据库。