ユーザー名前空間 (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 を変更するファイルシステムを必要とせずに、ホストのファイルシステムの一部を
コンテナーに bind mount することをユーザーに許可できます。このためのコンテナー毎の
設定項目は raw.idmap
で、設定例は以下のようになります。
both 1000 1000
uid 50-60 500-510
gid 100000-110000 10000-20000
1 行目は、ホストの uid と gid 1000 の両方をコンテナー内の uid 1000 にマッピング する設定です (これは例えばユーザーのホームディレクトリをコンテナー内に bind mount するのに使用できます)。
2 行目と 3 行目は uid または gid のどちらかだけをコンテナー内にマッピングする設定 です。行の中の 2 番目のエントリーはソース ID 、 つまりホスト上の ID で、 3 番目の エントリーはコンテナー内部での範囲です。これらの範囲は同じサイズでなければなりません。
このプロパティを反映するにはコンテナーの再起動が必要です。