Docker Compose と Ubuntu による安全なデプロイ
· 約 7 分
シリコンバレーのスタートアップでは、Docker Compose はコンテナ化アプリケーションを迅速にデプロイ・管理するための好まれるツールの一つです。しかし、利便性にはしばしばセキュリティリスクが伴います。Site Reliability Engineer(SRE)として、セキュリティ脆弱性が壊滅的な結果を招くことを痛感しています。本記事では、Docker Compose と Ubuntu を組み合わせた実務でまとめたベストなセキュリティ実践を共有し、Docker Compose の便利さを享受しつつシステムの安全性を確保する方法をご紹介します。
I. Ubuntu システムのセキュリティ強化
コンテナをデプロイする前に、Ubuntu ホスト自体のセキュリティを確保することが重要です。主な手順は以 下の通りです。
1. Ubuntu と Docker を定期的にアップデート
システムと Docker の両方を最新の状態に保ち、既知の脆弱性を修正します。
sudo apt update && sudo apt upgrade -y
sudo apt install docker-ce docker-compose-plugin
2. Docker 管理権限を制限
Docker の管理権限を厳格にコントロールし、特権昇格攻撃を防止します。
sudo usermod -aG docker deployuser
# 一般ユーザーが簡単に Docker 管理権限を取得できないようにする
3. Ubuntu ファイアウォール (UFW) を設定
ネットワー クアクセスを適切に制限し、不正アクセスを防止します。
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status verbose
4. Docker と UFW の連携を適切に設定
デフォルトでは Docker が iptables を直接操作し、UFW をバイパスします。手動で制御することを推奨します。
Docker 設定ファイルを編集します。
sudo nano /etc/docker/daemon.json
以下の内容を追加します。
{
"iptables": false,
"ip-forward": true,
"userland-proxy": false
}
Docker サービスを再起動します。
sudo systemctl restart docker
Docker Compose でアドレスを明示的にバインドします。
services:
webapp:
ports:
- "127.0.0.1:8080:8080"
II. Docker Compose のセキュリティベストプラクティス
以下の設定は Docker Compose v2.4 以降を対象としています。Swarm モードと非 Swarm モードの違いに注意してください。
1. コンテナ権限を制限
デフォルトで root で実行されるコンテナはリスクが高いため、非 root ユーザーに変更します。
services:
app:
image: your-app:v1.2.3
user: "1000:1000" # 非 root ユーザー
read_only: true # 読み取り専用ファイルシステム
volumes:
- /tmp/app:/tmp # 書き込みが必要なディレクトリだけマウント
cap_drop:
- ALL
cap_add:
- NET_BIND_SERVICE
解説
- 読み取り専用ファイルシステムはコンテナ内部での改ざんを防止します。
- マウントするボリュームは必要最小限に留めます。