Debian 12 + LXD/LXC security.idmap.isolated が失敗する

Debian 12 + LXD/LXC security.idmap.isolated が失敗する

LXD/LXC を実行し、権限のないコンテナ設定になっている Debian 12.1 (6.1.0-11-amd64) では、security.idmap.isolated=trueコンテナのファイルの所有者/グループの更新に失敗するようです。

次に例を示します。

# lxc launch images:debian/12 debian
(...)

# lxc config get debian volatile.idmap.base
296608

# lxc stop debian
Error: The instance is already stopped

# lxc config set debian security.idmap.isolated true

# lxc config get debian security.idmap.isolated
true

# lxc start debian

ここで、コンテナ ボリューム上のファイルを一覧表示すると、それらはすべてホストrootユーザーが所有していることがわかります。

# ls -la /mnt/NVME1/lxd/containers/debian/rootfs/
total 24
drwxr-xr-x 1 root   root  154 Sep  5 06:28 .
d--x------ 1 296608 root   78 Sep  5 15:59 ..
lrwxrwxrwx 1 root   root    7 Sep  5 06:25 bin -> usr/bin
drwxr-xr-x 1 root   root    0 Jul 14 17:00 boot
drwxr-xr-x 1 root   root    0 Sep  5 06:28 dev
drwxr-xr-x 1 root   root 1570 Sep  5 06:28 etc

LXD/LXC の複数のバージョンを試しました。これは、 の 5.0.2 でも、aptの 4.0 および 5.17 (最新) でも発生しますsnap

興味深いことに、私は別の Debian 10 (4.19.0-25-amd64) を実行しており、それとsnapそれ以降の古い LXD 4 では、すべてが期待どおりに動作します。

# ls -la /mnt/NVME1/lxd/containers/debian/rootfs/
total 0
drwxr-xr-x 1 1065536 1065536  138 Oct 29  2020 .
d--x------ 1 1065536 root      78 Oct 14  2020 ..
drwxr-xr-x 1 1065536 1065536 1328 Jul 24 19:07 bin
drwxr-xr-x 1 1065536 1065536    0 Sep 19  2020 boot
drwxr-xr-x 1 1065536 1065536    0 Oct 14  2020 dev
drwxr-xr-x 1 1065536 1065536 1716 Jul 24 19:08 etc

このシステムでは、すべてのファイルが によって所有されていることがわかります1065536:1065536


アップデート:

lxc config show debian両方のマシンでマップを調べてみたところ、次のことがわかりました。

Debian 10 を実行しているマシン:

security.idmap.isolated: "true"
(...)
volatile.idmap.base: "1065536"
volatile.idmap.current: '[{"Isuid":true,"Isgid":false,"Hostid":1065536,"Nsid":0,"Maprange":65536},{"Isuid":false,"Isgid":true,"Hostid":1065536,"Nsid":0,"Maprange":65536}]'
volatile.idmap.next: '[{"Isuid":true,"Isgid":false,"Hostid":1065536,"Nsid":0,"Maprange":65536},{"Isuid":false,"Isgid":true,"Hostid":1065536,"Nsid":0,"Maprange":65536}]'
volatile.last_state.idmap: '[{"Isuid":true,"Isgid":false,"Hostid":1065536,"Nsid":0,"Maprange":65536},{"Isuid":false,"Isgid":true,"Hostid":1065536,"Nsid":0,"Maprange":65536}]'

Debian 12 を実行しているマシン:

security.idmap.isolated: "true"
(...)
volatile.idmap.base: "231072"
volatile.idmap.current: '[{"Isuid":true,"Isgid":false,"Hostid":231072,"Nsid":0,"Maprange":65536},{"Isuid":false,"Isgid":true,"Hostid":231072,"Nsid":0,"Maprange":65536}]'
volatile.idmap.next: '[{"Isuid":true,"Isgid":false,"Hostid":231072,"Nsid":0,"Maprange":65536},{"Isuid":false,"Isgid":true,"Hostid":231072,"Nsid":0,"Maprange":65536}]'
volatile.last_state.idmap: '[]'

アップデート:

また、新規インストールも試しましたDebian 11 (5.10.0-25-amd64) で期待通りに動作します:

root@vm-debian-11-cli:~# ls -la /mnt/NVME1/lxd/containers/debian/rootfs/
total 24
drwxr-xr-x 1 1065536 1065536  154 Sep  6 06:28 .
d--x------ 1 1065536 root      78 Sep  6 15:31 ..
lrwxrwxrwx 1 1065536 1065536    7 Sep  6 06:25 bin -> usr/bin
drwxr-xr-x 1 1065536 1065536    0 Jul 14 17:00 boot
drwxr-xr-x 1 1065536 1065536    0 Sep  6 06:28 dev
drwxr-xr-x 1 1065536 1065536 1570 Sep  6 06:28 etc

なぜ表示されないのですかvolatile.last_state.idmap: '[]'? Debian 10 と 11 の両方で動作するため、これは新しいカーネルやその構成に関連している可能性があります。

どうすれば修正できますか? ありがとうございます。

答え1

どうやらこれは新しいカーネルの設計上の機能のようです。LXC のメンテナーである Stéphane Graber によるわかりやすい説明がこちらにあります:

VFS idmap が利用可能になる前は、ディスク上のすべてのファイルの所有者を LXD で手動で書き換えることで、ファイルの所有権を回避する必要がありました。これが、古いカーネルで表示されているものです。

新しいカーネルでは、カーネルがディスク上の権限をシフトせずに保持し、カーネル内でシフトするだけで、コンテナー内の所有権が正しく見えるようになるため、これはもう必要ありません。

上記に示したものは、VFS idmap をサポートするカーネル上で完全に機能するセットアップのように見えます。

実際にホストマシン上でこれを設定できました:

root@vm-debian-12-cli:~# lxc info | grep 'shift\|idmap'
- storage_shifted
    idmapped_mounts: "true"
    shiftfs: "false"
    idmapped_mounts_v2: "true"

コンテナ内では、ルート マウント ポイントも次のように表示されますidmapped(最後の行):

root@debian:~# cat /proc/self/uid_map
         0     231072      65536

root@debian:~# cat /proc/self/gid_map
         0     231072      65536

root@debian:~# cat /proc/self/mountinfo
490 460 0:24 /@rootfs/mnt/NVME1/lxd/containers/debian/rootfs / rw,relatime,idmapped shared:251 master:1 - btrfs /dev/sda1 rw,space_cache=v2,user_subvol_rm_allowed,subvolid=259,subvol=/@rootfs/mnt/NVME1/lxd/containers/debian

これを無効にするには、次の操作を実行します。

systemd ユニットにオーバーライドを追加することで LXD に渡すことができる環境変数があります。LXD_IDMAPPED_MOUNTS_DISABLE=1

しかし、グレーバー氏によれば、そうすべきではないそうです。

はい、システムは今のところ完全に正常に動作しており、オーバーヘッドも最小限に抑えられているので、心配する必要はありません。

従来の起動前シフト方式は非常に遅く、非常に危険でした。クラッシュしたり、特定のメタデータ (ACL、xattr など) をシフトできなかったりすると、コンテナーでセキュリティ上の問題が発生する可能性がありました。また、CoW ファイルシステムにとっても、コンテナー内のすべてのファイルが変更されたように見え、数 GB のデータが重複する可能性があるため、非常に不便でした。

shiftfs (Ubuntu 固有のハック) と、現在では適切な VFS idmap シフトにより、カーネルは、idmapped としてマークされているマウントへのファイルシステム操作で、逆 uidmap/gidmap を適用するだけです。これは、実行する操作が非常に簡単で、コンテナー マップの動的な変更が可能になり (分離に非常に便利)、コンテナー間でデータを共有でき、uid/gid を保持できるすべてのもの (ioctl、xattr、acl など) を適切にサポートするため、何かを見逃すリスクがなくなります。

関連情報