是否有可能某个进程无法链接某个文件,但我可以使用 sudo 来管理同一个用户?

是否有可能某个进程无法链接某个文件,但我可以使用 sudo 来管理同一个用户?

我在 Debian 10(无 SELinux)上使用 Dovecot 2.3.4.1 和 EncFS(encfs 版本 1.9.5)加密邮箱

基本设置是:

EncFS 安装

encfs --public /var/encrypted-mail /var/decrypted-mail -o nonempty --verbose

邮箱设置:

/var/decrypted-mail/domain.com/[email protected]/[cur,new...]

drwx------ 8 mail mail 4096 Dec 29 2019 /var/decrypted-mail(这些权限是递归的)

所有 dovecot 进程都以mail用户身份运行:

mail 5194 0.0 0.0 6308 4312 ? S 14:52 0:00 dovecot/imap

尽管一切似乎都配置正确,但我无法创建新文件夹或重命名现有文件夹。

我收到此错误/var/log/dovecot.log

Jan 24 14:59:04 imap([email protected])<6010><Us21sxWS5OZaC6Ex>: Error: Couldn't create mailbox list lock /var/decrypted-mail/domain.com/[email protected]/mailboxes.lock: file_create_locked(/var/decrypted-mail/domain.com/[email protected]/mailboxes.lock) failed: link(/var/decrypted-mail/domain.com/[email protected]/mailboxes.lockba53af3795974a32, /var/decrypted-mail/domain.com/[email protected]/mailboxes.lock) failed: Operation not permitted

该错误消息的源代码位于此处:https://github.com/dovecot/core/blob/4d09884528e592a0fa5d38bf479b3ddab1a4a0ef/src/lib/file-create-locked.c#L109-L123

如果我没看错的话,它无法使用“常规锁定”机制,并尝试将临时文件符号链接到mailboxes.lock。这表明,它可以创建临时文件mailboxes.lockba53af3795974a32,但无法对其进行符号链接。

当我在 shell 中运行此命令时: sudo -u mail bash -c 'touch mailboxes.lockba53af3795974a32 && ln -s mailboxes.lockba53af3795974a32 mailboxes.lock'

它运行正常并且没有出现任何错误。

为什么鸽舍的行为与正常贝壳的行为如此不同?

我唯一的解释是时间问题(临时文件之前被访问过,但是为什么它没有出现在 bash 重现中?)。

我也尝试过chmod -R g+rwx /var/decrypted-mail,以确保所有这些 gid 都不是问题,但这只是一次寻找解决方案的绝望尝试。

答案1

事实证明,这是encfs特定情况下已知的限制。

如果启用External IV Chaining硬链接,则会被禁用。

外部 IV 链接

1.1.3 中的新增功能。此选项与每个文件初始化向量和文件名初始化向量链密切相关。基本上,它将初始化向量链从文件名扩展到每个文件初始化向量。

启用此选项后,每个文件的初始化向量将使用从文件名初始化向量链代码派生的初始化向量进行编码。这意味着文件中的数据将与文件名绑定。如果加密文件在 encfs 之外重命名,它将不再可在 encfs 内解码。请注意,除非启用了块 MAC 标头,否则将无法检测到解码错误,并导致读取随机数据。

这会产生相关成本。启用外部 IV 链接后,文件系统中将不允许硬链接,因为无法正确解码指向相同数据的两个不同文件名。

此外,重命名文件需要修改文件头。因此,只有当用户对文件具有写权限时才允许重命名。

由于这些限制,此选项在标准模式下默认被禁用(而在偏执模式下默认被启用)。

来源:encfs(1) 手册页。

事实证明,我误读了的手册页link。它清楚地说明了它创建了一个新的 *硬链接默认情况下。我使用我发布的代码片段创建了一个软链接:

sudo -u mail bash -c 'touch mailboxes.lockba53af3795974a32 && ln -s mailboxes.lockba53af3795974a32 mailboxes.lock'

如果我跑了:

sudo -u mail bash -c 'touch mailboxes.lockba53af3795974a32 && ln mailboxes.lockba53af3795974a32 mailboxes.lock'

相反,我会得到与dovecot代码完全相同的错误消息:

ln: failed to create hard link 'mailboxes.lock' => 'mailboxes.lockba53af3795974a32': Operation not permitted


额外知识

在此过程中我发现的一个巧妙的技巧是,您可以使用 启用fuse文件系统的调试-f -d

实现类似encfscryfs允许您解析这些选项,如下fuse所示:

encfs enc dec -- -f -d

然后 Fuse 将在前台运行并向您显示挂载文件系统中发生的一切。:)

相关内容