我想使用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
在容器内工作,以便我的应用程序可以在运行时创建和安装任意加密卷,而无需禁用用户命名空间?
相关问题
systemd-nspawn:绑定文件夹的文件系统权限与文件而不是设备相关,唯一的答案只是说“
-U
主要与 rw 不兼容--bind
”。systemd-nspawn:如何允许访问所有设备不处理用户命名空间,也没有答案。
答案1
可能是您缺少m
权限。如果您至少在第一个上指定rwm
而不是指定,会发生什么?rw
DeviceAllow