关于 security-docker
面向 Docker 和容器部署的安全审计技能,供检查 Dockerfile 与 Compose 配置的开发者使用。内容覆盖镜像机密、端口暴露、容器权限、挂载、网络和镜像漏洞扫描,并附有审计命令与加固清单。
主要功能
- 01检查镜像构建中的机密泄露
- 02审查端口暴露和默认凭据
- 03检查非 root 用户与特权配置
- 04评估挂载和网络隔离风险
- 05提供镜像漏洞扫描命令
- 06附带安全加固检查清单
适用场景
- 01发布前审查 Docker 镜像构建配置
- 02检查 Compose 服务是否暴露数据库端口
- 03排查容器特权或敏感挂载风险
- 04扫描镜像并核对加固项
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ igorwarzocha/ opencode-workflows --skill security-docker安装后在 Claude Code 中输入/security-docker确认已加载。
附带文件scripts/scan.sh
详细介绍
针对 Docker 和容器部署的安全审计模式,涵盖镜像中的密钥、端口暴露、用户权限和 Compose 安全性。
镜像中的密钥(严重)
构建参数/ENV 中的密钥
# ❌ CRITICAL: Secret in ENV (visible in image history)
ENV API_KEY=sk_live_abc123
ENV DATABASE_URL=postgres://user:password@host/db
# ❌ CRITICAL: Secret in ARG (visible in image history)
ARG AWS_SECRET_ACCESS_KEY
RUN aws configure set aws_secret_access_key $AWS_SECRET_ACCESS_KEY
# ✓ Use runtime secrets
# Pass via docker run -e or docker-compose environment/env_file
# ✓ Docker secrets (Swarm) or orchestrator-specific secrets
# Use /run/secrets/* instead of ENV/ARG when available
烘焙到层中的密钥
# ❌ CRITICAL: Even if deleted, secret is in layer history
COPY .env /app/.env
RUN source /app/.env && do_something
RUN rm /app/.env # Still in previous layer!
# ❌ CRITICAL: Copying all files includes secrets
COPY . /app/ # Copies .env, .git, etc.
# ✓ Use .dockerignore
# In .dockerignore:
# .env*
# .git
# *.pem
# *.key
# ✓ Or explicit COPY
COPY package*.json /app/
COPY src/ /app/src/
检查镜像历史记录
# Audit existing images for secrets
docker history --no-trunc <image>
docker inspect <image> | jq '.[0].Config.Env'
端口暴露
docker-compose.yml
# ❌ CRITICAL: Database exposed to host network
services:
db:
image: postgres
ports:
- "5432:5432" # Accessible from outside!
# ❌ CRITICAL: Redis without password
redis:
image: redis
ports:
- "6379:6379" # And no AUTH!
# ✓ Internal only (accessible to other containers)
services:
db:
image: postgres
expose:
- "5432" # Only internal
# No 'ports' = not exposed to host
# ✓ If must expose, bind to localhost
db:
ports:
- "127.0.0.1:5432:5432" # Only localhost
默认凭据
# ❌ No password or default password
services:
db:
image: postgres
environment:
POSTGRES_PASSWORD: postgres # Default!
redis:
image: redis
# No password at all
# ✓ Strong passwords from secrets
services:
db:
image: postgres
environment:
POSTGRES_PASSWORD_FILE: /run/secrets/db_password
secrets:
- db_password
secrets:
db_password:
file: ./secrets/db_password.txt # MUST NOT be in git!
非 root 用户
# ❌ Running as root (default)
FROM node:18
COPY . /app
CMD ["node", "server.js"] # Runs as root
# ✓ Create and use non-root user
FROM node:18
WORKDIR /app
COPY --chown=node:node . .
USER node
CMD ["node", "server.js"]
# ✓ Using numeric UID (more portable)
FROM node:18
RUN useradd -r -u 1001 appuser
WORKDIR /app
COPY --chown=1001:1001 . .
USER 1001
CMD ["node", "server.js"]
多阶段构建
# ❌ Build tools and secrets in final image
FROM node:18
COPY . .
RUN npm install
RUN npm run build
CMD ["node", "dist/server.js"]
# Final image has: source, node_modules (dev deps), build tools
# ✓ Multi-stage: only production artifacts
FROM node:18 AS builder
WORKDIR /app
COPY package*.json .
RUN npm ci
COPY . .
RUN npm run build
FROM node:18-slim AS production
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
USER node
CMD ["node", "dist/server.js"]
# Final image: minimal, no source, no build tools
Docker Compose 安全性
特权模式
# ❌ CRITICAL: Full host access
services:
app:
privileged: true # Container can do anything on host!
# ❌ HIGH: Dangerous capabilities
services:
app:
cap_add:
- SYS_ADMIN
- NET_ADMIN
卷挂载
# ❌ CRITICAL: Docker socket access = root on host
services:
app:
volumes:
- /var/run/docker.sock:/var/run/docker.sock
# ❌ HIGH: Sensitive host paths
services:
app:
volumes:
- /etc:/etc
- /root:/root
网络模式
# ❌ HIGH: Host network mode
services:
app:
network_mode: host # Bypasses Docker network isolation
镜像安全性
基础镜像
# ❌ Outdated or unverified
FROM node:14 # EOL version
FROM random-user/node-app # Unverified
# ✓ Official, recent, minimal
FROM node:20-slim
FROM node:20-alpine
镜像扫描
# Scan for vulnerabilities
docker scout cves <image>
trivy image <image>
grype <image>
快速审计命令
# Find secrets in Dockerfile
rg "(ENV|ARG).*(KEY|SECRET|PASSWORD|TOKEN)" Dockerfile*
# Find exposed ports in compose
rg "ports:" docker-compose*.yml -A 3
# Check for privileged/capabilities
rg "(privileged|cap_add|network_mode)" docker-compose*.yml
# Check for docker.sock mount
rg "docker.sock" docker-compose*.yml
# Check for USER instruction
grep "^USER" Dockerfile
# Check .dockerignore exists and has secrets
cat .dockerignore | grep -E "(env|key|secret|pem)"
加固检查清单
- ENV/ARG 指令中没有密钥
- 没有将密钥 COPY 到镜像中
- .dockerignore 排除了 .env、.git、.pem、.key
- 数据库/Redis 端口未暴露给主机(或仅绑定到 127.0.0.1)
- 所有服务均使用强密码(非默认密码)
- USER 指令设置了非 root 用户
- 生产镜像使用多阶段构建
- 未设置 privileged: true
- 未挂载 docker.sock(除非必需)
- 基础镜像为官方镜像且版本较新
- 已扫描镜像中的漏洞
评论
支持 Markdown