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 など) を適切にサポートするため、何かを見逃すリスクがなくなります。