docker-security

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Docker Security — 安全加固与防护

Docker Security — 安全加固与防护

Comprehensive guidance for securing Docker across the full lifecycle.
Docker全生命周期安全防护综合指南。

When to Use

使用场景

ALWAYS use this skill when the user mentions:
  • "docker 安全", "镜像安全", "container security"
  • "非root运行", "rootless", "least privilege"
  • "seccomp", "AppArmor", "SELinux"
  • "Docker Bench", "CIS"
  • "secrets management", "密钥管理"
  • "image signing", "content trust"
当用户提及以下内容时,务必使用本技能:
  • "docker 安全"、"镜像安全"、"container security"
  • "非root运行"、"rootless"、"最小权限"
  • "seccomp"、"AppArmor"、"SELinux"
  • "Docker Bench"、"CIS"
  • "secrets management"、"密钥管理"
  • "image signing"、"内容信任"

Security Model — Layered Defense

安全模型 — 分层防御

Layer 1: Image Security    — minimal base, non-root, pinned versions
Layer 2: Build Security    — secret injection, noCOPY secrets
Layer 3: Runtime Security  — capabilities, seccomp, AppArmor, read-only
Layer 4: Registry Security — content trust, signing, vulnerability scan
Layer 5: Host Security     — Docker Bench, CIS, user namespace
Layer 1: Image Security    — 最小化基础镜像、非root用户、固定版本
Layer 2: Build Security    — 密钥注入、禁止COPY密钥
Layer 3: Runtime Security  — 权限能力、seccomp、AppArmor、只读模式
Layer 4: Registry Security — 内容信任、签名、漏洞扫描
Layer 5: Host Security     — Docker Bench、CIS、用户命名空间

Image Security Checklist

镜像安全检查清单

#PracticeHow
1Minimal base imageUse
alpine
or
distroless
(Go →
scratch
)
2Non-root user
USER 1000:1000
at end of Dockerfile
3Pin versions
FROM alpine:3.20@sha256:...
not
alpine:latest
4COPY over ADDADD auto-extracts tar — unexpected behavior
5No secrets in imageUse
--secret
or runtime injection
6
.dockerignore
Exclude
.env
,
.git
, credentials
#实践要点操作方式
1最小化基础镜像使用
alpine
distroless
(Go语言可使用
scratch
2非root用户运行在Dockerfile末尾添加
USER 1000:1000
3固定版本使用
FROM alpine:3.20@sha256:...
而非
alpine:latest
4优先使用COPY而非ADDADD会自动解压tar包,可能导致意外行为
5禁止在镜像中存储密钥使用
--secret
或运行时注入方式
6配置
.dockerignore
排除
.env
.git
、凭证文件等

Secure Dockerfile

安全的Dockerfile示例

dockerfile
FROM alpine:3.20
RUN apk add --no-cache ca-certificates
RUN addgroup -S app && adduser -S -G app app
COPY --chown=app:app ./app /app
WORKDIR /app
USER app
CMD ["./server"]
dockerfile
FROM alpine:3.20
RUN apk add --no-cache ca-certificates
RUN addgroup -S app && adduser -S -G app app
COPY --chown=app:app ./app /app
WORKDIR /app
USER app
CMD ["./server"]

Runtime Security

运行时安全

Capabilities (Least Privilege)

权限能力(最小权限原则)

bash
undefined
bash
undefined

Drop ALL capabilities, add only what's needed

移除所有权限,仅添加所需权限

docker run --cap-drop=ALL --cap-add=NET_BIND_SERVICE nginx
docker run --cap-drop=ALL --cap-add=NET_BIND_SERVICE nginx

Common needed caps: NET_BIND_SERVICE, CHOWN, DAC_OVERRIDE

常见所需权限:NET_BIND_SERVICE、CHOWN、DAC_OVERRIDE

NEVER: --privileged (gives full host access)

绝对禁止:--privileged(获取主机完整权限)

undefined
undefined

Read-Only Root Filesystem

只读根文件系统

bash
undefined
bash
undefined

Prevents container from writing anywhere (except volumes/tmpfs)

阻止容器写入任何位置(卷/tmpfs除外)

docker run --read-only --tmpfs /tmp --tmpfs /run nginx
undefined
docker run --read-only --tmpfs /tmp --tmpfs /run nginx
undefined

Seccomp Profile

Seccomp配置文件

bash
undefined
bash
undefined

Custom seccomp profile (block syscalls)

自定义seccomp配置文件(阻止特定系统调用)

docker run --security-opt seccomp=profile.json app
docker run --security-opt seccomp=profile.json app

Unconfined (NEVER in production)

无限制模式(生产环境绝对禁止)

docker run --security-opt seccomp=unconfined app
undefined
docker run --security-opt seccomp=unconfined app
undefined

No New Privileges

禁止提升新权限

bash
undefined
bash
undefined

Prevent privilege escalation via setuid binaries

防止通过setuid二进制文件提升权限

docker run --security-opt no-new-privileges app
undefined
docker run --security-opt no-new-privileges app
undefined

Secrets Management

密钥管理

BuildKit Secrets (build-time)

BuildKit密钥(构建阶段)

dockerfile
undefined
dockerfile
undefined

syntax=docker/dockerfile:1

syntax=docker/dockerfile:1

FROM alpine RUN --mount=type=secret,id=aws_creds
AWS_ACCESS_KEY_ID=$(cat /run/secrets/aws_creds)
aws s3 cp s3://bucket/file .

```bash
docker build --secret id=aws_creds,src=$HOME/.aws/credentials -t app .
FROM alpine RUN --mount=type=secret,id=aws_creds
AWS_ACCESS_KEY_ID=$(cat /run/secrets/aws_creds)
aws s3 cp s3://bucket/file .

```bash
docker build --secret id=aws_creds,src=$HOME/.aws/credentials -t app .

Docker Secrets (Swarm runtime)

Docker密钥(Swarm运行阶段)

bash
echo "mysecretpassword" | docker secret create db_password -
docker service create --secret db_password postgres
bash
echo "mysecretpassword" | docker secret create db_password -
docker service create --secret db_password postgres

Docker Bench Security Audit

Docker Bench Security审计

bash
docker run --rm \
  --pid host --network host \
  -v /var/run/docker.sock:/var/run/docker.sock \
  docker/docker-bench-security
bash
docker run --rm \
  --pid host --network host \
  -v /var/run/docker.sock:/var/run/docker.sock \
  docker/docker-bench-security

Workflow — 安全加固流程

工作流程 — 安全加固流程

Step 1: 镜像安全:
docker scout cves <image>
扫描漏洞 → 更新基础镜像/依赖 Step 2: Dockerfile 加固: USER 非 root、COPY 优于 ADD、固定 digest Step 3: 运行时安全: --read-only、--cap-drop=ALL、--security-opt no-new-privileges Step 4: 审计检查:
docker run --rm docker/docker-bench-security
逐条修复 Step 5: CI 门禁: Scout 策略阻断 critical/high CVE 合并
Step 1: 镜像安全: 使用
docker scout cves <image>
扫描漏洞 → 更新基础镜像/依赖 Step 2: Dockerfile加固: 设置USER为非root用户、优先使用COPY、固定digest Step 3: 运行时安全: 启用--read-only、--cap-drop=ALL、--security-opt no-new-privileges Step 4: 审计检查: 运行
docker run --rm docker/docker-bench-security
并逐条修复问题 Step 5: CI门禁: 通过Scout策略阻断critical/high级别的CVE合并

Gotchas — Common Pitfalls

常见陷阱

  • --privileged
    flag
    : Gives full host access. Never use in production. → Recovery: Use specific
    --cap-add=NET_BIND_SERVICE
    instead; audit with
    docker inspect --format='{{.HostConfig.Privileged}}'
    .
  • API keys in Dockerfile:
    ENV API_KEY=xxx
    is baked into image layers forever. → Recovery: Use runtime injection:
    docker run -e API_KEY=$KEY
    or BuildKit
    --mount=type=secret
    .
  • Root container: Default user is root. Escaping the container means root on the host. → Recovery: Always
    USER 1000:1000
    in Dockerfile; verify with
    docker exec myapp whoami
    .
  • Docker socket mount:
    -v /var/run/docker.sock
    gives container control over ALL containers. → Recovery: Use Docker API with TLS auth instead of socket mount; never mount socket in production.
  • Ignoring CVE remediation: Running
    docker scout
    but never fixing findings. → Recovery: Set CI policy to block critical/high CVEs; update base images regularly.
  • --privileged
    参数
    : 获取主机完整权限,生产环境绝对禁止使用。→ 修复方案: 使用特定权限如
    --cap-add=NET_BIND_SERVICE
    替代;通过
    docker inspect --format='{{.HostConfig.Privileged}}'
    进行审计。
  • Dockerfile中存储API密钥:
    ENV API_KEY=xxx
    会永久嵌入镜像层。→ 修复方案: 使用运行时注入:
    docker run -e API_KEY=$KEY
    或BuildKit的
    --mount=type=secret
  • Root容器: 默认用户为root,容器逃逸后将获得主机root权限。→ 修复方案: 始终在Dockerfile中添加
    USER 1000:1000
    ;通过
    docker exec myapp whoami
    验证。
  • 挂载Docker套接字:
    -v /var/run/docker.sock
    会让容器获得所有容器的控制权。→ 修复方案: 使用带TLS认证的Docker API替代套接字挂载;生产环境绝不挂载套接字。
  • 忽略CVE修复: 运行
    docker scout
    但不修复问题。→ 修复方案: 设置CI策略阻断critical/high级别的CVE;定期更新基础镜像。

Boundary — 能力边界(适用与不适用场景)

能力边界(适用与不适用场景)

分类场景说明
✅ 能做Dockerfile 安全加固USER 非 root、COPY 优先 ADD、digest 固定
✅ 能做运行时安全配置seccomp/AppArmor/capabilities/read-only
✅ 能做Secrets 管理Docker secrets + BuildKit --secret + Vault
✅ 能做安全审计(Docker Bench Security)CIS 检查清单 + 逐条修复
⚠️ 需条件镜像签名(Notary)
DOCKER_CONTENT_TRUST=1
环境变量
⚠️ 需条件完整合规检查需结合 Scout 扫描 + 组织安全策略
❌ 超范围CVE 漏洞扫描使用
docker-scout
❌ 超范围主机系统安全操作系统层级
❌ 超范围网络安全/防火墙网络管理员范畴
分类场景说明
✅ 能做Dockerfile安全加固设置USER为非root、优先使用COPY、固定digest
✅ 能做运行时安全配置seccomp/AppArmor/权限能力/只读模式
✅ 能做密钥管理Docker密钥 + BuildKit --secret + Vault
✅ 能做安全审计(Docker Bench Security)CIS检查清单 + 逐条修复
⚠️ 需条件镜像签名(Notary)需要设置
DOCKER_CONTENT_TRUST=1
环境变量
⚠️ 需条件完整合规检查需要结合Scout扫描 + 组织安全策略
❌ 超范围CVE漏洞扫描使用
docker-scout
❌ 超范围主机系统安全属于操作系统层级范畴
❌ 超范围网络安全/防火墙属于网络管理员范畴

When NOT to Use This Skill

不适用本技能的场景

❌ Skip✅ Use Instead
Vulnerability scanning
docker-scout
Docker basics
docker-basics
Production deployment
docker-production
Registry management
docker-hub
❌ 跳过✅ 改用以下技能
漏洞扫描
docker-scout
Docker基础操作
docker-basics
生产环境部署
docker-production
镜像仓库管理
docker-hub

Security & Stability

安全性与稳定性

  • All security practices are based on CIS Docker Benchmark and Docker official security guidance.
  • Run Docker Bench Security regularly in CI/CD to detect configuration drift.
  • Subscribe to Docker security advisories for CVE notifications.
  • No executable scripts bundled. Guidance only.
  • 所有安全实践均基于CIS Docker基准和Docker官方安全指南。
  • 在CI/CD中定期运行Docker Bench Security以检测配置漂移。
  • 订阅Docker安全公告以获取CVE通知。
  • 未捆绑可执行脚本,仅提供指导内容。

📚 官方文档参考

📚 官方文档参考

🧭 Docker Skills Journey

🧭 Docker技能路线

📍 You are here:
docker-security
— 安全加固
← Previous:
docker-build
| → Next:
docker-scout
/
docker-cicd
📍 当前位置:
docker-security
— 安全加固
← 上一步:
docker-build
| → 下一步:
docker-scout
/
docker-cicd