我的磁盘上有两个 luks 加密分区,旁边是 efisys 分区。第一个加密分区仅包含 /boot,第二个分区包含 /root 和 swap 的 lvm 存储。Grub 安装在 efisys 上,它要求输入密码来解密 /boot。一段时间后(grub 的 cryptsetup 运行非常慢),它成功解密 /boot,在那里找到内核和 initramfs 磁盘并移交给它们。Initramfs 磁盘包含用于 lvm 分区解密的密钥文件,因此无需密码即可完成启动过程。由于我有 sddm 自动登录,因此只提示我输入一次密码,虽然 /boot 未安装在真实文件系统中,但即使 root 不输入密码也无法访问加密密钥文件。
让我恼火的是,我必须在 kwallet 和 gnome-keyring 中输入密码才能解锁它们。我很想在启动期间从 initramfs 磁盘中的某个位置加载它们的密码,并通过 keyctl 将其存储在内核的密钥环中。问题是我无法做到这一点。我可以从用户空间看到密钥,但在尝试获取有效负载时收到权限被拒绝错误。我发现了一个有趣的文章关于密钥的权限,但这没有帮助:keyctl_perm: Permission denied
如果我尝试更改密钥的权限,并且keyctl_link: Permission denied
尝试在 initramfs 脚本中将密钥从 @s 链接到 @u,我会得到结果。
我可以使用 /run 中某处的临时文件,并将权限设置为 700,但问题只是出于好奇,想知道我做错了什么。
这是我尝试使用的脚本:
/etc/initramfs-tools/scripts/local-premount/传递密钥
key="$(cat /secret-key | /bin/keyctl padd user secret-key @s)"
/bin/keyctl setperm "${key}" 0x3f3f0000
/bin/keyctl link "${key}" @u
/bin/keyctl unlink "${key}" @s
/bin/keyctl timeout ${key} 120