ユーザー名前空間 (user namespace) 用の ID のマッピング#
イントロダクション#
LXD は安全なコンテナを実行します。これは主にユーザー・ネームスペースの使用 によって実現されています。ユーザー・ネームスペースはコンテナを非特権で実行 することを可能にし、攻撃対象を大幅に限定します。
ユーザー・ネームスペースはコンテナの UID と GID の組をホストの UID と GID の組にマッピングすることで機能します。
例えば、 100000 から 165535 までのホストの UID と GID を LXD が使用できる ようにし、コンテナで 0 から 65535 までの UID/GID にマッピングするように 設定できます。
この結果、コンテナ内で 0 の UID で動くプロセスが実際には UID 100000 で動く ことになります。
root (0) と nobody (65534) の POSIX の範囲をカバーするため、割当は必ず 最低 65535 個の UID と GID であるべきです。
カーネルのサポート#
ユーザー・ネームスペースの使用にはカーネル 3.12 以上が必要です。 LXD は 古いカーネルでも起動しますが、コンテナを起動するのは拒否します。
使用可能な範囲#
ほとんどのホストでは、 LXD は初回起動時に lxd
ユーザーの割当のために
/etc/subuid
と /etc/subgid
をチェックし、そこで指定されている範囲の
最初の 65536 個の UID と GID をデフォルト・プロファイルで使用するように
設定します。
範囲が 65536 より小さい場合 (範囲が全く無い場合を含む)、これが修正される まで LXD はコンテナの作成と起動に失敗します。
/etc/subuid
、 /etc/subgid
、 newuidmap
(パスを検索)、 newgidmap
(パスを検索) のいくつか (ただし全部ではない) がシステムに存在する場合、
これは shadow の設定が間違っていることを示しているので、これが修正されるまで
LXD はコンテナの起動に失敗します。
これらのファイルが 1 つも無い場合、 LXD は 1000000 の基点の UID/GID から開始する 1000000000 の UID/GID の範囲を想定します。
これは最もよくあるケースであり、完全に非特権なコンテナをホストするシステム上で稼働するのではない場合 (コンテナランタイム自身はユーザー権限で実行するような場合)に、通常は推奨される設定です。
ホスト間で異なる範囲の使用#
ホスト間でコンテナを移動する時、送信側のマッピングが送られるので、受信側の ホストで異なる範囲にマッピング可能です。
コンテナ毎に異なる ID マッピング#
コンテナを他のコンテナからより一層隔離するために、 LXD はコンテナ毎に
異なる ID マッピングを使用することをサポートしています。これはコンテナ毎に
security.idmap.isolated
と security.idmap.size
という 2 つの設定項目で
制御できます。
security.idmap.isolated
が設定されたコンテナは
security.idmap.isolated
が設定された他のコンテナと衝突しないユニークな
ID の範囲を持つように設定されます (もしそのようなコンテナが 1 つも存在しない場合、
このキーを設定しようとしても失敗します)。
security.idmap.size
が設定されたコンテナはこのサイズに ID の範囲が設定
されます。このプロパティが設定されていない隔離されたコンテナは ID の範囲が
デフォルトのサイズ 65536 に設定されます。これにより POSIX に準拠し、コンテナ内で
nobody
ユーザーが使用できます。
特定のマッピングを選択するには security.idmap.base
を設定すると
自動検出機構をオーバーライドし、コンテナでベースとして使用したい
ホストの UID/GID を LXD に伝えることができます。
これらのプロパティを反映するにはコンテナの再起動が必要です。
カスタムの ID マッピング#
さらに LXD は ID マッピングの一部をカスタマイズすることをサポートします。例えば、
UID を変更するファイルシステムを必要とせずに、ホストのファイルシステムの一部を
コンテナにバインドマウントすることをユーザーに許可できます。このためのコンテナ毎の
設定項目は raw.idmap
で、設定例は以下のようになります。
both 1000 1000
uid 50-60 500-510
gid 100000-110000 10000-20000
1 行目は、ホストの UID と GID 1000 の両方をコンテナ内の UID 1000 にマッピング する設定です (これは例えばユーザーのホームディレクトリをコンテナ内にバインドマウント するのに使用できます)。
2 行目と 3 行目は UID または GID のどちらかだけをコンテナ内にマッピングする設定 です。行の中の 2 番目のエントリーはソース ID 、 つまりホスト上の ID で、 3 番目の エントリーはコンテナ内部での範囲です。これらの範囲は同じサイズでなければなりません。
このプロパティを反映するにはコンテナの再起動が必要です。