我的邮件服务器设置工作了多年。最近我开始遇到以下问题:
邮件设置:sendmail+dovecot+procmail
主机文件服务器:CentOS 6.8,NFS 将邮件目录导出到...
邮件服务器:CentOS 7.3,通过 libvirtd/qemu 作为来宾 VM 在主机上运行,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 Mar 29 12:30 _uZF%kE-2YB.mailserver.domain -r-------- 1 个普通用户邮件 1 Mar 29 12:30 _uZF+kE-2YB.mailserver.domain -r-------- 1 个普通用户邮件 1 Mar 29 12:31 _uZF,kF-2YB.mailserver.domain -r-------- 1 个普通用户邮件 1 Mar 29 12:31 _uZF.kF-2YB.mailserver.domain -r-------- 1 个普通用户邮件 1 Mar 29 12:31 _uZF+kF-2YB.mailserver.domain
- 不会消失的锁文件。典型的邮件日志条目:
3 月 29 日 12:31:01 mailserver dovecot: imap(normaluser): Error: unlink(/var/spool/mail/normaluser.lock) failed: Operation not allowed 3 月 29 日 12:31:01 mailserver dovecot: imap(normaluser): Error: file_dotlock_create() failed with mbox file /var/spool/mail/normaluser: Operation not allowed
对于用户而言,不会消失的锁定文件意味着他们所有的邮件处理都会停止,直到我手动删除锁定文件。权限看起来很正常:
-rw------- 1 normaluser theirgroup 33 Mar 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 访问同一目录的多个邮件服务器有关,这里不是这种情况。
我用谷歌搜索和摆弄,我无法找到问题所在。我正在询问我忽略的任何内容,或者关于我可以运行的其他诊断的建议。
之后:
我越来越接近解决方案。在客户端邮件服务器上:
$ 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 导入的目录中执行任何操作。我尝试向 NFS 服务器添加一个 dovenull 帐户(具有相同的 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
我很近……我能感觉到……
再后来:
我能感觉到我想要的一切,但这并不意味着我有答案。我得到了能够在 /var/spool/mail 中创建和删除的 dovenull 帐户(这与仔细查看 /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 等)创建文件,并且即使使用相同的权限进行删除调用,删除也不成功。
那么什么可能导致文件被创建,但无法被删除呢?
我设法解决了这个问题,尽管它揭示了另一个(不太重要的)问题。
线索是偶尔,当我在 NFSv4 客户端上列出 /var/spool/mail 时,我会看到如下内容:
然后当我之后立即执行“ls -lh”时,我会看到:
该数字 4294967294 在 32 位无符号整数中为 -2,通常是分配给 nfsnobody 帐户的 UID。这向我表明可能存在暂时的 idmapd 问题。这与我观察到的一致:有时邮件服务器会表现得好像它没有通过 NFS 获得 rwx 权限,即使它刚刚创建了该文件。由于只有 NFSv4 使用 idmapd(至少对于 NFS 版本),我通过更改邮件服务器 NFS 客户端上的 /etc/fstab 中的一行来切换到 NFSv3:
然后我重新启动了邮件服务器,瞧!NFS 问题消失了。作为记录,我在诊断问题时多次重启了邮件服务器,所以这不是“通过简单重启修复”的情况。
当然,这就引出了idmapd为什么有问题的问题。任何好奇的人都可以看看我上面的 idmapd.conf 配置。但这是一个单独的问题,对我来说优先级要低得多。有一天我可能会在 serverfault 上发布这个问题。
之后:
一个快速的网络搜索给了我这个:Partially wrong uid mapping with nfs4/idmapd/ldap-auth
在内核 3.13 中进行了修复,但当前的 CentOS7 是内核 3.10。我不知道 Redhat 是否已将修复程序反向移植到他们当前的 CentOS7 内核中。
这为我提供了导致问题的线索:我不断地将新的活跃用户添加到我们的集群环境中。在某些时候,我一定是在 /var/spool/mail 中触发了 idmapd 错误的用户数量。