NFS 挂载的 /var/spool/mail 在 dovecot 和 procmail 中存在权限问题

NFS 挂载的 /var/spool/mail 在 dovecot 和 procmail 中存在权限问题

我的邮件服务器设置已经运行多年。最近我开始遇到以下问题:

邮件设置:sendmail+dovecot+procmail

主机文件服务器:CentOS 6.8,NFS 将邮件目录导出到……

邮件服务器:CentOS 7.3,通过 libvirtd/qemu 在主机上作为客户虚拟机运行,NFS 从主机挂载 /var/spool/mail。

症状:dovecot 和 procmail 都发出了错误(详情如下),似乎表明它们没有写入 /var/spool/mail 的权限。但是,/var/spool/mail 具有我所知道的最通用的权限,无论是在 NFS 文件服务器还是在邮件 NFS 客户端上。

在邮件服务器(NFS 客户端)上:

 $ ls -lhd /var/spool/mail
 drwxrwxrwt 5 root mail 6.8M Mar 29 12:37 /var/spool/mail

在邮件服务器:/etc/fstab 中:

 filehost:/mail/inbox      /var/spool/mail         nfs     defaults        0 0

在 NFS 主机上:

 $ ls -lhd /mail/inbox
 drwxrwxrwt. 5 root mail 6.8M Mar 29 12:41 /mail/inbox

在文件主机:/etc/exports 中:

 /mail/inbox          mailserver(rw,no_root_squash,async,nohide)

两个系统都没有运行 SELinux 或 iptables(我依赖于我们站点的防火墙)。

我看到的事情如下:

  • 文件名类似于 BOGUS.normaluser.hex-string。相应的日志消息是

    3 月 29 日 12:14:34 邮件服务器 procmail[20922]: 将虚假的“/var/spool/mail/normaluser.lock”重命名为“/var/spool/mail/BOGUS.normaluser.xGAs”

    这可能特别烦人,因为有时不仅锁定文件被声明为假,而且普通用户的收件箱也被声明为假。从普通用户的角度来看,他们的收件箱在他们阅读邮件时消失了。

  • 文件名称以下划线开头,例如,_2-E,eu92YB.mailserver.domain。

    没有相应的日志消息。这些文件的内容(始终为 1 字节或 31-33 字节)表明这些是锁文件。我昨天看到的一个网页描述了有人使用 strace 来识别 procmail 正在写入这些文件,但我不知道如何使用 strace 来亲自确认这一点(今天我找不到该页面)。

    当我列出文件时,我看到它们是 chmod 400,这可能是它们没有被删除的原因:

-r-------- 1 普通用户邮件 1 3 月 29 日 12:30 _uZF%kE-2YB.mailserver.domain
-r-------- 1 普通用户邮件 1 3 月 29 日 12:30 _uZF+kE-2YB.mailserver.domain
-r-------- 1 普通用户邮件 1 3 月 29 日 12:31 _uZF,kF-2YB.mailserver.domain
-r-------- 1 普通用户邮件 1 3 月 29 日 12:31 _uZF.kF-2YB.mailserver.domain
-r-------- 1 普通用户邮件 1 3 月 29 日 12:31 _uZF+kF-2YB.mailserver.domain
  • 不会消失的锁文件。典型的邮件日志条目:
3 月 29 日 12:31:01 邮件服务器 dovecot:imap(normaluser):错误:取消链接(/var/spool/mail/normaluser.lock)失败:操作不允许

3 月 29 日 12:31:01 邮件服务器 dovecot:imap(normaluser):错误:file_dotlock_create()因 mbox 文件 /var/spool/mail/normaluser 而失败:操作不允许

对于用户来说,锁文件不消失意味着他们的所有邮件处理都会停止,直到我手动删除锁文件。权限似乎正常:

-rw------- 1 普通用户 theirgroup 33 3 月 29 日 12:30 normaluser.lock

我根据 dovecot wiki 对 dovecot 选项进行了一些尝试,希望我犯了错误。当前相关值是:

 mmap_disable = yes
 dotlock_use_excl = yes
 mail_fsync = optimized
 mail_nfs_storage = no
 mail_nfs_index = no
 mail_privileged_group=mail

设置 mail_nfs_storage=yes 似乎不会改变任何东西,因为该参数(根据 dovecot wiki)与多个邮件服务器通过 NFS 访问同一目录有关,而这里并非如此。

我搜索了 Google 并摸索了好久,还是没能找到问题所在。我想问一下我忽略了什么,或者询问我可以运行的其他诊断程序的建议。

之后:

我离解决方案越来越近了。在客户端邮件服务器上:

 $ cd /var/spool/mail
 $ sudo -u normaluser touch test
 $ sudo -u normaluser rm test

没问题。

 $ sudo -u dovenull touch test
 $ sudo -u dovenull rm test
 rm: cannot remove ‘test’: Operation not permitted
 $ ls -lh test
 -rw-r--r-- 1 nobody nobody 0 Mar 31 12:03 test

啊哈!dovenull 帐户不允许在 NFS 导入的目录中执行任何操作。我尝试将 dovenull 帐户添加到 NFS 服务器(具有相同的 uid/gid),但这并没有解决问题:

 $ sudo -u dovenull rm test
 rm: cannot remove ‘test’: Operation not permitted
 $ ls -lh test
 -rw-r--r-- 1 dovenull dovenull 0 Mar 31 12:03 test

这感觉像是 idmap 问题。以下是客户端和服务器上 idmap.conf 中唯一未注释的行:

[General]
Domain = mydomain.com
[Mapping]
Nobody-User = nobody
Nobody-Group = nobody
[Translation]
Method = nsswitch

我快到了……我能感觉到它……

后来:

我可以感受到我想要的一切,但这并不意味着我有答案。我让 dovenull 帐户能够在 /var/spool/mail 中创建和删除(这与仔细查看 /etc/nssswitch.conf 并意识到我必须重新启动 NIS 有关),但这并没有解决我的问题。dovenull 帐户不会写入 /var/spool/mail。

我使用了 auditctl:

auditctl -w /var/spool/mail -p war -k mail-inbox
ausearch -k mail-inbox > mail-inbox.txt

并验证了额外的 .lock 文件和 BOGUS 文件是由 dovecot 创建的,而“_”下划线文件是由 procmail 创建的。除非有人想看审计日志,否则我不会费心发布它们;它们显示的是文件是使用正确的权限(uid、gid、euid 等)创建的,并且删除操作失败,即使删除调用是使用这些权限进行的。

那么什么原因会导致文件被创建但无法被删除呢?

答案1

我设法解决了这个问题,但它暴露了另一个(不太重要的)问题。

线索是,偶尔,当我在 NFSv4 客户端上列出 /var/spool/mail 时,我会看到如下内容:

-r-------- 1 4294967294    mail 1 Mar 29 12:30 _uZF%kE-2YB.mailserver.domain
-r-------- 1 4294967294    mail 1 Mar 29 12:30 _uZF+kE-2YB.mailserver.domain
-rw------- 1 normaluser    mail 1 Mar 29 12:31 normaluser

然后当我立即执行“ls -lh”时,我会看到:

-r-------- 1 normaluser    mail 1 Mar 29 12:30 _uZF%kE-2YB.mailserver.domain
-r-------- 1 normaluser    mail 1 Mar 29 12:30 _uZF+kE-2YB.mailserver.domain
-rw------- 1 normaluser    mail 1 Mar 29 12:31 normaluser

该数字 4294967294 在 32 位无符号整数中为 -2,通常是分配给 nfsnobody 帐户的 UID。这向我暗示可能存在暂时的 idmapd 问题。这与我观察到的情况一致:有时邮件服务器会表现得好像它没有通过 NFS 的 rwx 权限,即使它刚刚创建了该文件。由于只有 NFSv4 使用 idmapd(至少对于 NFS 版本而言),我通过更改邮件服务器 NFS 客户端上的 /etc/fstab 中的一行切换到 NFSv3:

filehost:/mail/inbox      /var/spool/mail         nfs     defaults,vers=3   0 0

然后我重启了邮件服务器,然后就好了!NFS 问题消失了。顺便说一下,我在诊断问题时重启了邮件服务器好几次,所以这是不是“通过简单重启即可解决”的情况。

当然,这引发了为什么 idmapd 有问题的问题。任何好奇的人都可以查看上面的 idmapd.conf 配置。但这是一个单独的问题,对我来说优先级要低得多。我可能会在某一天将这个问题发布在 serverfault 上。

之后:

通过快速的网络搜索,我得到了以下信息:nfs4/idmapd/ldap-auth 的 uid 映射部分不正确

内核 3.13 中实现了修复,但当前的 CentOS7 是内核 3.10。我不知道 Redhat 是否已将修复移植到其当前的 CentOS7 内核中。

这给了我问题原因的线索:我不断向我们的集群环境添加新的活跃用户。在某个时候,我肯定超出了 /var/spool/mail 中的用户数量,从而触发了 idmapd 错误。

相关内容