mcpField
H
hardening-docker-containers-for-production

hardening-docker-containers-for-production

github.com/mukul975セキュリティ35.2k330 回インストール8 週間前に更新
リポジトリ

hardening-docker-containers-for-production について

本番環境でDockerコンテナを運用するチーム向けのセキュリティ強化ガイドです。CIS Docker Benchmark v1.8.0に基づき、ホスト、デーモン、イメージ、ランタイムの設定例と検証手順を示します。

主な機能

  1. 01Dockerfileとイメージの強化
  2. 02Dockerデーモンのセキュリティ設定
  3. 03コンテナの実行権限の制限
  4. 04イメージのコンテンツトラスト有効化
  5. 05ホストレベルの監査設定
  6. 06セキュリティチェックによる検証

活用シーン

  1. 01本番環境向けDocker導入の準備
  2. 02CISに沿ったセキュリティ制御の適用
  3. 03コンテナとホスト設定のレビュー

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/mukul975/anthropic-cybersecurity-skills --skill hardening-docker-containers-for-production

インストール後、Claude Code で/hardening-docker-containers-for-productionを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

LICENSE
assets/
template.md
references/
api-reference.md
standards.md
workflows.md
scripts/
agent.py
process.py

詳細

Docker コンテナーを本番環境向けに強化する

概要

本番環境向けに Docker コンテナーを強化するには、CIS Docker Benchmark v1.8.0 に準拠したセキュリティのベストプラクティスを適用し、攻撃対象領域を最小限に抑え、権限昇格を防ぎ、Docker デーモン、イメージ、コンテナー、ランタイム構成全体で最小権限の原則を徹底します。

使用する状況

  • 環境内で Docker コンテナーを本番環境向けに強化する機能をデプロイまたは構成する場合
  • コンプライアンス要件に準拠したセキュリティ制御を確立する場合
  • この分野のセキュリティアーキテクチャを構築または改善する場合
  • この実装が必要なセキュリティ評価を実施する場合

前提条件

  • Docker Engine 24.0+ がインストールされていること
  • Docker Compose v2
  • カーネル 5.10+ を搭載した Linux ホスト
  • Docker ホストの root または sudo アクセス
  • docker-bench-security ツール
  • Dockerfile の lint 用 Hadolint
  • イメージの lint 用 Dockle

主要な概念

CIS Docker Benchmark のセクション
  1. ホスト構成 - Docker デーモンのファイルを監査し、/var/run/docker.sock へのアクセスを制限します
  2. Docker デーモンの構成 - TLS を有効にし、コンテナー間通信を制限し、ロギングを構成します
  3. Docker デーモンの構成ファイル - daemon.json の所有権と権限を設定します
  4. コンテナーイメージとビルドファイル - 信頼できるベースイメージを使用し、脆弱性をスキャンし、マルチステージビルドを使用します
  5. コンテナーのランタイム - ケイパビリティを削除し、ルートファイルシステムを読み取り専用にし、システムコールを制限します
  6. Docker のセキュリティ運用 - 認証情報を監視、監査、ローテーションします
主要な強化原則
  • 最小権限:コンテナーを非 root ユーザーとして実行し、必要なもの以外のケイパビリティをすべて削除します
  • 不変性:ルートファイルシステムを読み取り専用にし、書き込み可能なディレクトリには tmpfs を使用します
  • 最小化:distroless または Alpine のベースイメージと、マルチステージビルドを使用します
  • 分離:seccomp プロファイル、AppArmor/SELinux、名前空間の制限を適用します
  • 監査可能性:コンテンツトラストを有効にし、すべてのコンテナーアクティビティをログに記録します

ワークフロー

ステップ 1:Dockerfile を強化する
# Use specific digest for reproducibility
FROM python:3.12-slim@sha256:abc123... AS builder

WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir --user -r requirements.txt

# Production stage - minimal image
FROM gcr.io/distroless/python3-debian12

# Copy only necessary artifacts
COPY --from=builder /root/.local /root/.local
COPY --from=builder /app /app

WORKDIR /app

# Create non-root user
USER 65534:65534

# Set read-only filesystem expectation
LABEL org.opencontainers.image.source="https://github.com/org/app"

ENTRYPOINT ["python", "app.py"]
ステップ 2:Docker デーモンの構成を強化する
{
  "icc": false,
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  },
  "live-restore": true,
  "userland-proxy": false,
  "no-new-privileges": true,
  "default-ulimits": {
    "nofile": {
      "Name": "nofile",
      "Hard": 64000,
      "Soft": 64000
    },
    "nproc": {
      "Name": "nproc",
      "Hard": 1024,
      "Soft": 1024
    }
  },
  "seccomp-profile": "/etc/docker/seccomp-default.json",
  "tls": true,
  "tlscacert": "/etc/docker/tls/ca.pem",
  "tlscert": "/etc/docker/tls/server-cert.pem",
  "tlskey": "/etc/docker/tls/server-key.pem",
  "tlsverify": true
}
ステップ 3:コンテナーのランタイムを強化する
docker run -d \
  --name production-app \
  --read-only \
  --tmpfs /tmp:rw,noexec,nosuid,size=100m \
  --tmpfs /var/run:rw,noexec,nosuid,size=10m \
  --cap-drop ALL \
  --cap-add NET_BIND_SERVICE \
  --security-opt no-new-privileges:true \
  --security-opt seccomp=/etc/docker/seccomp-default.json \
  --security-opt apparmor=docker-default \
  --pids-limit 100 \
  --memory 512m \
  --memory-swap 512m \
  --cpus 1.0 \
  --user 65534:65534 \
  --network custom-bridge \
  --restart on-failure:3 \
  --health-cmd "curl -f http://localhost:8080/health || exit 1" \
  --health-interval 30s \
  --health-timeout 10s \
  --health-retries 3 \
  myapp:latest
ステップ 4:Docker Content Trust を有効にする
export DOCKER_CONTENT_TRUST=1
export DOCKER_CONTENT_TRUST_SERVER=https://notary.example.com

# Sign and push image
docker trust sign myregistry.com/myapp:v1.0.0

# Verify image signature before pull
docker trust inspect --pretty myregistry.com/myapp:v1.0.0
ステップ 5:ホストレベルの監査を構成する
# Add audit rules for Docker files and directories
cat >> /etc/audit/rules.d/docker.rules << 'EOF'
-w /usr/bin/docker -k docker
-w /var/lib/docker -k docker
-w /etc/docker -k docker
-w /lib/systemd/system/docker.service -k docker
-w /lib/systemd/system/docker.socket -k docker
-w /etc/default/docker -k docker
-w /etc/docker/daemon.json -k docker
-w /usr/bin/containerd -k docker
-w /usr/bin/runc -k docker
EOF

systemctl restart auditd

検証コマンド

# Run Docker Bench Security
docker run --rm --net host --pid host \
  --userns host --cap-add audit_control \
  -e DOCKER_CONTENT_TRUST=$DOCKER_CONTENT_TRUST \
  -v /etc:/etc:ro \
  -v /usr/bin/containerd:/usr/bin/containerd:ro \
  -v /usr/bin/runc:/usr/bin/runc:ro \
  -v /usr/lib/systemd:/usr/lib/systemd:ro \
  -v /var/lib:/var/lib:ro \
  -v /var/run/docker.sock:/var/run/docker.sock:ro \
  docker/docker-bench-security

# Lint Dockerfile
hadolint Dockerfile

# Lint built image
dockle myapp:latest

# Verify no containers running as root
docker ps -q | xargs docker inspect --format '{{.Id}}: User={{.Config.User}}'

主要なセキュリティ制御

制御実装CIS セクション
非 root ユーザーDockerfile の USER 命令4.1
読み取り専用ルートファイルシステム--read-only フラグ5.12
ケイパビリティの削除--cap-drop ALL5.3
リソース制限--memory、--cpus、--pids-limit5.10
新たな権限の禁止--security-opt no-new-privileges5.25
コンテンツトラストDOCKER_CONTENT_TRUST=14.5
デーモンの TLSdaemon.json の TLS 構成2.6
監査ログauditd ルール1.1

参考資料

コメント