docker-security について
docker-securityは、Docker利用者向けのセキュリティ強化ガイドです。イメージ、ビルド、実行時設定、シークレット、ホスト監査を例とチェックリストで扱います。
主な機能
- 01イメージとDockerfileの強化
- 02実行時の権限制限
- 03BuildKitとDocker secrets
- 04Docker Benchによる監査
- 05強化手順とよくある落とし穴
活用シーン
- 01コンテナを非rootで実行する設定
- 02ケイパビリティ制限と読み取り専用化
- 03ビルド時または実行時のシークレット注入
- 04CISガイダンスに沿ったDocker設定確認
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ full-stack-skills/ docker-skills --skill docker-securityインストール後、Claude Code で/docker-securityを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
agents/openai.yamlexamples/01-secure-dockerfile.md02-docker-bench.mdreferences/01-capabilities.md02-cis-checklist.md03-secrets-management.md詳細
Docker セキュリティ — 安全強化と保護
ライフサイクル全体にわたって Docker を保護するための包括的なガイダンスです。
使用するタイミング
ユーザーが次の項目に言及した場合は、必ずこのスキルを使用してください。
- 「docker セキュリティ」、「イメージセキュリティ」、「コンテナーセキュリティ」
- 「非 root で実行」、「rootless」、「最小権限」
- 「seccomp」、「AppArmor」、「SELinux」
- 「Docker Bench」、「CIS」
- 「シークレット管理」
- 「イメージ署名」、「コンテンツトラスト」
セキュリティモデル — 多層防御
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
イメージセキュリティチェックリスト
| # | 実践項目 | 方法 |
|---|---|---|
| 1 | 最小限のベースイメージ | alpine または distroless を使用します(Go → scratch) |
| 2 | 非 root ユーザー | Dockerfile の末尾に USER 1000:1000 を指定します |
| 3 | バージョンを固定 | alpine:latest ではなく FROM alpine:3.20@sha256:... を使用します |
| 4 | ADD より COPY を使用 | ADD は tar を自動展開するため、予期しない動作につながります |
| 5 | イメージにシークレットを含めない | --secret または実行時の注入を使用します |
| 6 | .dockerignore | .env、.git、認証情報を除外します |
セキュアな 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"]
実行時のセキュリティ
ケイパビリティ(最小権限)
# Drop ALL capabilities, add only what's needed
docker run --cap-drop=ALL --cap-add=NET_BIND_SERVICE nginx
# Common needed caps: NET_BIND_SERVICE, CHOWN, DAC_OVERRIDE
# NEVER: --privileged (gives full host access)
ルートファイルシステムを読み取り専用にする
# Prevents container from writing anywhere (except volumes/tmpfs)
docker run --read-only --tmpfs /tmp --tmpfs /run nginx
Seccomp プロファイル
# Custom seccomp profile (block syscalls)
docker run --security-opt seccomp=profile.json app
# Unconfined (NEVER in production)
docker run --security-opt seccomp=unconfined app
新しい権限の付与を禁止
# Prevent privilege escalation via setuid binaries
docker run --security-opt no-new-privileges app
シークレット管理
BuildKit シークレット(ビルド時)
# 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 .
docker build --secret id=aws_creds,src=$HOME/.aws/credentials -t app .
Docker シークレット(Swarm の実行時)
echo "mysecretpassword" | docker secret create db_password -
docker service create --secret db_password postgres
Docker Bench Security による監査
docker run --rm \
--pid host --network host \
-v /var/run/docker.sock:/var/run/docker.sock \
docker/docker-bench-security
ワークフロー — セキュリティ強化の手順
Step 1: イメージセキュリティ: docker scout cves <image> で脆弱性をスキャン → ベースイメージ/依存関係を更新
Step 2: Dockerfile の強化: USER を非 root に設定し、ADD より 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 を含むマージをブロック
注意点 — よくある落とし穴
--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 をブロックし、ベースイメージを定期的に更新します。
範囲 — 対応できること/できないこと
| 分類 | シナリオ | 説明 |
|---|---|---|
| ✅ 対応可能 | Dockerfile のセキュリティ強化 | USER を非 root に設定し、ADD より COPY を優先し、digest を固定 |
| ✅ 対応可能 | 実行時のセキュリティ設定 | seccomp/AppArmor/ケイパビリティ/読み取り専用 |
| ✅ 対応可能 | シークレット管理 | Docker secrets + BuildKit --secret + Vault |
| ✅ 対応可能 | セキュリティ監査(Docker Bench Security) | CIS チェックリスト + 項目ごとの修正 |
| ⚠️ 条件付き | イメージ署名(Notary) | 環境変数 DOCKER_CONTENT_TRUST=1 が必要 |
| ⚠️ 条件付き | 完全なコンプライアンスチェック | Scout スキャンと組織のセキュリティポリシーの併用が必要 |
| ❌ 範囲外 | CVE 脆弱性スキャン | docker-scout を使用します |
| ❌ 範囲外 | ホストシステムのセキュリティ | オペレーティングシステムの範囲 |
| ❌ 範囲外 | ネットワークセキュリティ/ファイアウォール | ネットワーク管理者の担当範囲 |
このスキルを使用しない場合
| ❌ 使用しない | ✅ 代わりに使用 |
|---|---|
| 脆弱性スキャン | docker-scout |
| Docker の基本 | docker-basics |
| 本番環境へのデプロイ | docker-production |
| レジストリ管理 | docker-hub |
セキュリティと安定性
- すべてのセキュリティ対策は、CIS Docker Benchmark および Docker の公式セキュリティガイダンスに基づいています。
- 設定のドリフトを検出するため、CI/CD で Docker Bench Security を定期的に実行してください。
- CVE 通知を受け取るため、Docker のセキュリティアドバイザリーを購読してください。
- 実行可能なスクリプトは含まれていません。ガイダンスのみです。
📚 公式ドキュメントの参考資料
| ドキュメント | URL |
|---|---|
| Docker セキュリティ | https://docs.docker.com/security/ |
| Docker Hardened Images | https://docs.docker.com/dhi/ |
| Docker Scout | https://docs.docker.com/scout/ |
| Docker Bench Security | https://docs.docker.com/engine/security/bench/ |
| seccomp の設定 | https://docs.docker.com/engine/security/seccomp/ |
| AppArmor | https://docs.docker.com/engine/security/apparmor/ |
🧭 Docker Skills Journey
📍 現在の位置:
docker-security— セキュリティ強化
← 前へ:docker-build | → 次へ:docker-scout / docker-cicd
コメント
Markdown 対応