我正在尝试从C++程序中挂载ecryptfs。我绝对可以通过在提示符下发出以下命令来安装它而不会提出问题:
sudo mount -t ecryptfs -o "rw,key=passphrase:passphrase_passwd=geoff,ecryptfs_cipher=aes,ecryptfs_key_bytes=32,ecryptfs_passthrough=n,ecryptfs_enable_filename_crypto=n,no_sig_cache" ~/source/ ~/target/
请注意,实际上,我正在传递一个完整的规范路径,以防万一。
但是从程序内部,我在尝试使用具有相同参数的mount()
函数后errno=EINVAL
失败:
mount("~/source/", "~/target/", "ecryptfs", MS_NODEV, "rw,key=passphrase:passphrase_passwd=geoff,ecryptfs_cipher=aes,ecryptfs_key_bytes=32,ecryptfs_passthrough=n,ecryptfs_enable_filename_crypto=n,no_sig_cache")
该程序确实以root
权限启动,我已经检查了我是否CAP_SYS_ADMIN。
mount()
函数返回-1
并将errno
设置为EINVAL
。
我的论点正确吗?这可能是特权问题吗?
编辑:我通过system()
外部执行挂载来使其工作,但由于原因仍然想使用该功能。
我相信这是因为mount -t ecryptfs
实际上是在调用辅助程序可执行文件mount.ecryptfs
,并且它正在处理一些选项(特别是key=
(本身。实际传递给内核的内容是不同的(您可以通过稍后查看/proc/mounts 来查看这一点(。
如果您仔细查看 https://manpages.ubuntu.com/manpages/kinetic/en/man7/ecryptfs.7.html,key=
和ecryptfs_enable_filename_crypto=
列在"挂载帮助程序选项"下 - 实际内核模块的选项是ecryptfs_sig=(fekek_sig)
和ecryptfs_fnek_sig=(fnek_sig)
。
因此,如果您想绕过帮助程序并直接执行挂载,则需要使用 https://man7.org/linux/man-pages/man2/keyctl.2.html 将令牌加载到内核的密钥环中,并将 key= 替换为生成的令牌签名,就像 mount.ecryptfs 所做的那样。
看起来确实有一个 libecrytpfs 在 ecryptfs.h 中具有像ecryptfs_add_passphrase_key_to_keyring这样的功能,您可以(大概没有测试(使用它以与 mount.ecryptfs 匹配的方式执行此操作