sjy*_*sjy 12 users container namespace bind-mount 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.
Run Code Online (Sandbox Code Playgroud)
该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
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
我不太确定为什么会发生这种情况。我开始与容器的systemd-nspawn@.service模板单元,这似乎像它应该允许访问设备映射:
# 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
Run Code Online (Sandbox Code Playgroud)
阅读有关 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
Run Code Online (Sandbox Code Playgroud)
显然,这是因为模板单元启用了用户命名空间,出于安全原因我无论如何都想要。如文档中所述:
在大多数情况下, using
--private-users=pick是推荐选项,因为它可以大规模增强容器安全性,并且在大多数情况下完全自动运行...... [this] 如果使用systemd-nspawn@.service模板单元文件,则是默认值......请注意,当 [
--bind选项] 与 结合使用时--private-users,生成的挂载点将由nobody用户拥有。这是因为挂载及其文件和目录继续归相关主机用户和组所有,它们不存在于容器中,因此显示在通配符 UID 65534 (nobody) 下。如果创建了此类绑定安装,建议使用--bind-ro=.
据推测,我将无法对/dev/mapper. 那么,有什么方法可以让我cryptsetup在容器内工作,以便我的应用程序可以在运行时创建和挂载任意加密卷,而无需禁用用户命名空间?
systemd-nspawn:绑定文件夹的文件系统权限与文件而不是设备有关,唯一的答案只是说“-U主要与 rw 不兼容--bind”。
systemd-nspawn:如何允许访问所有设备不涉及用户命名空间,也没有答案。