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への移行を検討してみることを強くおすすめします。

コメント