如何使设备在具有用户命名空间的 systemd-nspawn 容器内可用?

如何使设备在具有用户命名空间的 systemd-nspawn 容器内可用?

我想使用cryptsetup内部安装加密的图像文件systemd-nspawn容器。但是,我收到此错误消息:

[root@container ~]# echo $key | cryptsetup -d - open luks.img luks
Cannot initialize device-mapper. Is dm_mod kernel module loaded?
Cannot use device luks, name is invalid or still in use.

内核模块dm_mod已加载到主机系统上,尽管容器内部的情况看起来有点奇怪:

[root@host ~]# grep dm_mod /proc/modules
dm_mod 159744 2 dm_crypt, Live 0xffffffffc12c6000

[root@container ~]# grep dm_mod /proc/modules
dm_mod 159744 2 dm_crypt, Live 0x0000000000000000

strace表示cryptsetup无法创建/dev/mapper/control

[root@etrial ~]# echo $key | strace cryptsetup -d - open luks.img luks 2>&1 | grep mknod
mknod("/dev/mapper/control", S_IFCHR|0600, makedev(0xa, 0xec)) = -1 EPERM (Operation not permitted)

我不太清楚为什么会发生这种情况。我正在启动容器模板[email protected]单元,这似乎应该允许访问设备映射器:

# nspawn can set up LUKS encrypted loopback files, in which case it needs
# access to /dev/mapper/control and the block devices /dev/mapper/*.
DeviceAllow=/dev/mapper/control rw
DeviceAllow=block-device-mapper rw

阅读关于 USB 设备的相关问题的评论,我想知道解决方案是否是为/dev/mapper.但是,cryptsetup在容器内给了我相同的错误消息。当我strace这样做时,看起来仍然存在权限问题:

# echo $key | strace cryptsetup open luks.img luks --key-file - 2>&1 | grep "/dev/mapper"
stat("/dev/mapper/control", {st_mode=S_IFCHR|0600, st_rdev=makedev(0xa, 0xec), ...}) = 0
openat(AT_FDCWD, "/dev/mapper/control", O_RDWR) = -1 EACCES (Permission denied)

# ls -la /dev/mapper
total 0
drwxr-xr-x 2 nobody nobody      60 Dec 13 14:33 .
drwxr-xr-x 8 root   root       460 Dec 15 14:54 ..
crw------- 1 nobody nobody 10, 236 Dec 13 14:33 control

显然,发生这种情况是因为模板单元启用了用户命名空间,出于安全原因我无论如何都希望这样做。正如中所解释的文档

在大多数情况下,使用是推荐的选项,因为它可以极大地增强容器安全性,并且在大多数情况下完全自动运行...[这]是使用模板单元文件--private-users=pick时的默认选项...[email protected]

请注意,当[该--bind选项]与 结合使用时--private-users,生成的挂载点将归用户所有nobody。这是因为挂载及其文件和目录继续由相关主机用户和组拥有,而容器中不存在这些用户和组,因此显示在通配符 UID 65534 ( nobody) 下。如果创建了此类绑定安装,建议使用--bind-ro=.

想必我将无法使用 . 的只读权限执行任何操作/dev/mapper。那么,有什么方法可以cryptsetup在容器内工作,以便我的应用程序可以在运行时创建和安装任意加密卷,而无需禁用用户命名空间?

相关问题

答案1

可能是您缺少m权限。如果您至少在第一个上指定rwm而不是指定,会发生什么?rwDeviceAllow

相关内容