ユーザー名前空間 (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/subgidnewuidmap (パスを検索)、 newgidmap (パスを検索) のいくつか (ただし全部ではない) がシステムに存在する場合、 これは shadow の設定が間違っていることを示しているので、これが修正されるまで LXD はコンテナーの起動に失敗します。

これらのファイルが 1 つも無い場合、 LXD は 1000000 の基点の uid/gid から開始する 1000000000 の uid/gid の範囲を想定します。

これは最もよくあるケースであり、完全に非特権なコンテナーをホストするシステム上で稼働するのではない場合 (コンテナーランタイム自身はユーザー権限で実行するような場合)に、通常は推奨される設定です。

ホスト間で異なる範囲の使用

ホスト間でコンテナーを移動する時、送信側のマッピングが送られるので、受信側の ホストで異なる範囲にマッピング可能です。

コンテナー毎に異なる ID マッピング

コンテナーを他のコンテナーからより一層隔離するために、 LXD はコンテナー毎に 異なる ID マッピングを使用することをサポートしています。これはコンテナー毎に security.idmap.isolatedsecurity.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 番目の エントリーはコンテナー内部での範囲です。これらの範囲は同じサイズでなければなりません。

このプロパティを反映するにはコンテナーの再起動が必要です。