hardening-docker-containers-for-production について
本番環境でDockerコンテナを運用するチーム向けのセキュリティ強化ガイドです。CIS Docker Benchmark v1.8.0に基づき、ホスト、デーモン、イメージ、ランタイムの設定例と検証手順を示します。
主な機能
- 01Dockerfileとイメージの強化
- 02Dockerデーモンのセキュリティ設定
- 03コンテナの実行権限の制限
- 04イメージのコンテンツトラスト有効化
- 05ホストレベルの監査設定
- 06セキュリティチェックによる検証
活用シーン
- 01本番環境向けDocker導入の準備
- 02CISに沿ったセキュリティ制御の適用
- 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 と一緒にインストールされる参考資料やスクリプト。
LICENSEassets/template.mdreferences/api-reference.mdstandards.mdworkflows.mdscripts/agent.pyprocess.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 のセクション
- ホスト構成 - Docker デーモンのファイルを監査し、/var/run/docker.sock へのアクセスを制限します
- Docker デーモンの構成 - TLS を有効にし、コンテナー間通信を制限し、ロギングを構成します
- Docker デーモンの構成ファイル - daemon.json の所有権と権限を設定します
- コンテナーイメージとビルドファイル - 信頼できるベースイメージを使用し、脆弱性をスキャンし、マルチステージビルドを使用します
- コンテナーのランタイム - ケイパビリティを削除し、ルートファイルシステムを読み取り専用にし、システムコールを制限します
- 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 ALL | 5.3 |
| リソース制限 | --memory、--cpus、--pids-limit | 5.10 |
| 新たな権限の禁止 | --security-opt no-new-privileges | 5.25 |
| コンテンツトラスト | DOCKER_CONTENT_TRUST=1 | 4.5 |
| デーモンの TLS | daemon.json の TLS 構成 | 2.6 |
| 監査ログ | auditd ルール | 1.1 |
参考資料
コメント
Markdown 対応