hardening-docker-daemon-configuration について
Docker ホストを管理する運用・セキュリティチーム向けに、Docker デーモンの設定を強化する方法をまとめたスキルです。daemon.json、リモート API の TLS、ソケット保護、コンテナ分離策を扱います。
主な機能
- 01ユーザー名前空間のマッピング設定
- 02デフォルトのコンテナ間通信の無効化
- 03TLS によるリモート API の保護
- 04Docker ソケットアクセスの制限
- 05seccomp と AppArmor の設定
活用シーン
- 01コンテナ稼働ホストの強化
- 02安全なリモート Docker 管理の有効化
- 03デーモンとコンテナの設定確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill hardening-docker-daemon-configurationインストール後、Claude Code で/hardening-docker-daemon-configurationを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
LICENSEassets/template.mdreferences/api-reference.mdstandards.mdworkflows.mdscripts/agent.pyprocess.py詳細
Docker デーモン設定の強化
概要
Docker デーモン(dockerd)は root 権限で実行され、すべてのコンテナー操作を制御します。/etc/docker/daemon.json、TLS 証明書、ユーザー名前空間の再マッピング、ネットワーク制限を通じて設定を強化することは、権限昇格、水平移動、コンテナー脱出攻撃を防ぐために不可欠です。
使用する場面
- 環境で Docker デーモン設定の強化機能をデプロイまたは設定するとき
- コンプライアンス要件に準拠したセキュリティ制御を確立するとき
- この分野のセキュリティアーキテクチャを構築または改善するとき
- この実装を必要とするセキュリティ評価を実施するとき
前提条件
- Docker Engine 24.0+ がインストールされていること
- Docker ホストへの root または sudo アクセス
- TLS 証明書の生成に使用する OpenSSL
- Linux の名前空間と cgroups に関する知識
強化された daemon.json の基本設定
{
"icc": false,
"userns-remap": "default",
"no-new-privileges": true,
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "5"
},
"storage-driver": "overlay2",
"live-restore": true,
"userland-proxy": false,
"default-ulimits": {
"nofile": {
"Name": "nofile",
"Hard": 65536,
"Soft": 32768
},
"nproc": {
"Name": "nproc",
"Hard": 4096,
"Soft": 2048
}
},
"seccomp-profile": "/etc/docker/seccomp/default.json",
"default-address-pools": [
{
"base": "172.17.0.0/16",
"size": 24
}
],
"iptables": true,
"ip-forward": true,
"ip-masq": true,
"experimental": false,
"metrics-addr": "127.0.0.1:9323",
"max-concurrent-downloads": 3,
"max-concurrent-uploads": 5,
"default-runtime": "runc",
"runtimes": {
"runsc": {
"path": "/usr/local/bin/runsc",
"runtimeArgs": ["--platform=ptrace"]
}
}
}
設定項目ごとの説明
コンテナー間通信(ICC)を無効にする
{
"icc": false
}
デフォルトのブリッジネットワーク上にあるコンテナー間の通信を防ぎます。各コンテナーでは、明示的に --link を使用するか、ポートを公開したユーザー定義ネットワークを使用する必要があります。
ユーザー名前空間の再マッピングを有効にする
{
"userns-remap": "default"
}
コンテナーの root(UID 0)を、ホスト上の高い番号の非特権 UID にマッピングします。これにより、コンテナー脱出が発生してもホスト上で root 権限を取得できないようにします。
# Verify userns-remap is active
cat /etc/subuid
# Output: dockremap:100000:65536
cat /etc/subgid
# Output: dockremap:100000:65536
# Verify container UID mapping
docker run --rm alpine id
# uid=0(root) gid=0(root) -- but host UID is 100000+
新たな権限昇格を無効にする
{
"no-new-privileges": true
}
setuid/setgid バイナリやケーパビリティの昇格によって、コンテナープロセスが追加の権限を取得するのを防ぎます。
ライブリストアを有効にする
{
"live-restore": true
}
デーモンの停止中もコンテナーを実行し続けられるため、コンテナーを再起動せずにデーモンをアップグレードできます。
Userland プロキシを無効にする
{
"userland-proxy": false
}
ポート転送に docker-proxy ではなく iptables ルールを使用し、攻撃対象領域を縮小してパフォーマンスを向上させます。
リモート Docker API の TLS 設定
CA 証明書とサーバー証明書を生成する
# Create CA
openssl genrsa -aes256 -out ca-key.pem 4096
openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem \
-subj "/CN=Docker CA"
# Create server key and CSR
openssl genrsa -out server-key.pem 4096
openssl req -subj "/CN=docker-host" -sha256 -new -key server-key.pem -out server.csr
# Create extfile with SANs
echo "subjectAltName = DNS:docker-host,IP:10.0.0.5,IP:127.0.0.1" > extfile.cnf
echo "extendedKeyUsage = serverAuth" >> extfile.cnf
# Sign server certificate
openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem \
-CAcreateserial -out server-cert.pem -extfile extfile.cnf
# Create client key and certificate
openssl genrsa -out key.pem 4096
openssl req -subj "/CN=client" -new -key key.pem -out client.csr
echo "extendedKeyUsage = clientAuth" > extfile-client.cnf
openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem \
-CAcreateserial -out cert.pem -extfile extfile-client.cnf
# Set permissions
chmod 0400 ca-key.pem key.pem server-key.pem
chmod 0444 ca.pem server-cert.pem cert.pem
# Move to Docker TLS directory
sudo mkdir -p /etc/docker/tls
sudo cp ca.pem server-cert.pem server-key.pem /etc/docker/tls/
TLS 用に daemon.json を設定する
{
"tls": true,
"tlsverify": true,
"tlscacert": "/etc/docker/tls/ca.pem",
"tlscert": "/etc/docker/tls/server-cert.pem",
"tlskey": "/etc/docker/tls/server-key.pem",
"hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2376"]
}
クライアント接続
docker --tlsverify \
--tlscacert=ca.pem \
--tlscert=cert.pem \
--tlskey=key.pem \
-H=tcp://docker-host:2376 version
Docker ソケットの保護
# Restrict socket ownership
sudo chown root:docker /var/run/docker.sock
sudo chmod 660 /var/run/docker.sock
# Audit Docker socket access
sudo auditctl -w /var/run/docker.sock -k docker-socket
# Never mount Docker socket into containers
# BAD: docker run -v /var/run/docker.sock:/var/run/docker.sock ...
Rootless Docker
# Install rootless Docker
curl -fsSL https://get.docker.com/rootless | sh
# Configure environment
export PATH=$HOME/bin:$PATH
export DOCKER_HOST=unix://$XDG_RUNTIME_DIR/docker.sock
# Start rootless daemon
systemctl --user start docker
systemctl --user enable docker
# Verify rootless mode
docker info | grep -i rootless
# Rootless: true
コンテンツトラスト(イメージ署名)
# Enable Docker Content Trust
export DOCKER_CONTENT_TRUST=1
# Pull only signed images
docker pull library/alpine:3.18
# Will fail if image is not signed
# Sign and push image
docker trust sign myregistry/myapp:1.0
Seccomp プロファイル
# View default seccomp profile
docker info --format '{{.SecurityOptions}}'
# Use custom seccomp profile
docker run --security-opt seccomp=/etc/docker/seccomp/custom.json alpine
# Verify seccomp is enabled
docker inspect --format='{{.HostConfig.SecurityOpt}}' container_name
AppArmor プロファイル
# Check AppArmor status
sudo aa-status
# Use custom AppArmor profile
docker run --security-opt apparmor=docker-custom alpine
# Load custom profile
sudo apparmor_parser -r /etc/apparmor.d/docker-custom
検証コマンド
# Check daemon configuration
docker info
# Verify userns-remap
docker info --format '{{.SecurityOptions}}'
# Check ICC setting
docker network inspect bridge --format '{{.Options}}'
# Audit with Docker Bench
docker run --rm --net host --pid host \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /etc:/etc:ro \
docker/docker-bench-security
ベストプラクティス
- TLS なしで Docker デーモンを公開しない - リモートアクセスには必ず
--tlsverifyを使用します - ユーザー名前空間の再マッピングを有効にする - コンテナーの root を、ホスト上の非特権 UID にマッピングします
- ICC を無効にする - デフォルトのブリッジネットワーク上でのコンテナー間通信を防ぎます
- rootless モードを使用する - 可能な場合は、Docker デーモンを非 root として実行します
- コンテンツトラストを有効にする - 署名済みイメージのみをプルします
- ログローテーションを設定する - ログファイルによるディスク容量の枯渇を防ぎます
- seccomp プロファイルを使用する - コンテナーで使用可能なシステムコールを制限します
- Docker ソケットを監査する - /var/run/docker.sock へのアクセスを監視します
- Docker Bench を定期的に実行する - CIS ベンチマークのチェックを自動化します
- Docker を最新の状態に保つ - セキュリティパッチを速やかに適用します