User Namespace 用の ID のマッピング

Incus は安全なコンテナを実行します。これは主に User Namespace の使用 によって実現されています。User Namespace はコンテナを非特権で実行 することを可能にし、攻撃対象を大幅に限定します。

User Namespace はコンテナの UID と GID の組をホストの UID と GID の組にマッピングすることで機能します。

たとえば、 100000 から 165535 までのホストの UID と GID を Incus が使用できる ようにし、コンテナで 0 から 65535 までの UID/GID にマッピングするように 設定できます。

この結果、コンテナ内で 0 の UID で動くプロセスが実際には UID 100000 で動く ことになります。

root(0)と nobody(65534)の POSIX の範囲をカバーするため、割当は必ず 最低 65535 個の UID と GID であるべきです。

カーネルのサポート

User Namespace の使用にはカーネル 3.12 以上が必要です。 Incus は 古いカーネルでも起動しますが、コンテナを起動するのは拒否します。

使用可能な範囲

ほとんどのホストでは、 Incus は初回起動時に lxd ユーザーの割当のために /etc/subuid/etc/subgid をチェックし、そこで指定されている範囲の 最初の 65536 個の UID と GID をデフォルト・プロファイルで使用するように 設定します。

範囲が 65536 より小さい場合(範囲が全く無い場合を含む)、これが修正される まで Incus はコンテナの作成と起動に失敗します。

/etc/subuid/etc/subgidnewuidmap(パスを検索)、 newgidmap (パスを検索)のいくつか(ただし全部ではない)がシステムに存在する場合、 これは shadow の設定が間違っていることを示しているので、これが修正されるまで Incus はコンテナの起動に失敗します。

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

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

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

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

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

コンテナを他のコンテナからより一層隔離するために、 Incus はコンテナ毎に 異なる 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 を Incus に伝えることができます。

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

カスタムの ID マッピング

さらに Incus は 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 番目の エントリーはコンテナ内部での範囲です。これらの範囲は同じサイズでなければなりません。

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