【ツール活用|豆知識】セキュリティの鉄則!rootless Dockerでコンテナを安全に運用する

1. 導入

Dockerは非常に便利なツールですが、デフォルトではDockerデーモンがroot権限で動作します。もしコンテナ内で脆弱性が突かれ「コンテナエスケープ」が発生した場合、攻撃者はホストOSのroot権限を奪取できてしまいます。この重大なリスクを回避するために導入すべきなのが「rootless Docker」です。本記事では、一般ユーザー権限でコンテナを動かすための基礎知識と実装手順を解説します。

2. 基礎知識

rootless Dockerとは、その名の通りroot権限を必要とせずにDockerデーモンを実行するモードです。
通常、DockerデーモンはUnixソケット(/var/run/docker.sock)をrootで管理しますが、rootlessモードではユーザー固有のソケットを作成します。これにより、万が一コンテナが乗っ取られても、攻撃者がアクセスできるのはそのユーザーの権限範囲内に限定されるため、権限昇格防止の観点から非常に強力な防御策となります。

3. 実装/解決策

rootless Dockerを利用するには、主に以下の手順を踏みます。

1. カーネル設定の確認: ユーザー名前空間(user namespace)を利用するため、`subuid`と`subgid`の設定が必要です。
2. インストール: 公式のインストールスクリプトを実行します。
3. 環境変数の設定: ユーザーの`.bashrc`等にDockerソケットのパスを通します。

具体的には、以下のコマンドでインストール可能です。

4. サンプルプログラム

以下は、rootless環境をセットアップするための基本的なコマンドフローです。

1. 必要なパッケージのインストール(Ubuntu/Debian系)
sudo apt-get install -y uidmap dbus-user-session

2. rootlessインストールスクリプトの実行
curl -fsSL https://get.docker.com/rootless | sh

3. 環境変数の設定(.bashrcに追記し、反映させる)
export PATH=/usr/bin:$PATH
export DOCKER_HOST=unix:///run/user/$(id -u)/docker.sock
echo 'export PATH=/usr/bin:$PATH' >> ~/.bashrc
echo 'export DOCKER_HOST=unix:///run/user/$(id -u)/docker.sock' >> ~/.bashrc

4. 動作確認:rootユーザーではないことを確認
docker run --rm hello-world

5. コンテナ内でユーザーIDを確認(1000番など、一般ユーザーであることを確認)
docker run --rm alpine id

5. 応用・注意点

rootless Dockerにはいくつか特有の注意点があります。

特権ポートの制限: rootlessモードでは、1024番未満のポート(80番や443番など)を直接バインドできません。これらを利用したい場合は、ポートフォワーディングを行うか、1024以上のポートで待ち受けてリバースプロキシ(Nginx等)で制御する必要があります。
ストレージドライバ: rootless環境では`vfs`ストレージドライバがデフォルトとなることが多く、パフォーマンスに影響が出る場合があります。
systemdとの連携: サーバー再起動時に自動起動させるには、`systemctl –user enable docker`を実行して、ユーザー単位のサービスとして登録することを忘れないようにしてください。

セキュリティを堅牢にするために、まずは開発環境や検証環境からrootlessへの移行を検討してみることを強くおすすめします。

コメント

タイトルとURLをコピーしました