我的邮件服务器设置工作多年。 最近我开始遇到以下问题:
邮件设置:sendmail + dovecot + procmail
主机文件服务器:CentOS 6.8,NFS将邮件目录导出到…
邮件服务器:CentOS 7.3,通过libvirtd / qemu在主机上作为访客虚拟机运行,NFS从主机挂载/ var / spool / mail。
症状:dovecot和procmail都发出错误(详情如下),似乎表明他们没有权限写入/ var / spool / mail。 但是,在NFS文件服务器和邮件NFS客户端上,/ var / spool / mail具有我知道如何给出的最一般权限。
在邮件服务器(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
在filehost中:/ etc / exports:
/mail/inbox mailserver(rw,no_root_squash,async,nohide)
这两个系统都没有运行SELinux或iptables(我依靠我们的网站的防火墙)。
我看到的东西的种类:
名称类似BOGUS.normaluser.hex-string的文件。 相应的日志消息是
Mar 29 12:14:34 mailserver procmail [20922]:将伪造的“/var/spool/mail/normaluser.lock”更名为“/var/spool/mail/BOGUS.normaluser.xGAs”
这可能是非常烦人的,因为曾经有过这样的情况,不仅仅是locking文件被声明为伪造的,而是正常的收件箱。 从normaluser的angular度来看,他们的收件箱在阅读邮件时消失了。
名称以下划线开头的文件,例如_2-E,eu92YB.mailserver.domain。
没有相应的日志消息。 这些文件的内容(总是1个字节或31-33个字节)表明这些是锁文件。 我昨天看到的一个网页描述了一个人使用strace来识别procmail正在写这些文件,但我不知道如何使用strace来确认我自己(我今天找不到页面)。
当我列出这些文件时,我发现它们是chmod 400,这可能是它们没有被删除的原因:
-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 -r -------- 1 normaluser mail 1 Mar 29 12:31 _uZF,kF-2YB.mailserver.domain -r -------- 1 normaluser mail 1 Mar 29 12:31 _uZF.kF-2YB.mailserver.domain -r -------- 1 normaluser mail 1 Mar 29 12:31 _uZF + kF-2YB.mailserver.domain
Mar 29 12:31:01 mailserver dovecot:imap(normaluser):错误:取消链接(/var/spool/mail/normaluser.lock)失败:操作不允许 Mar 29 12:31:01 mailserver dovecot:imap(normaluser):错误:file_dotlock_create()与mbox文件/ var / spool / mail / normaluser失败:操作不允许
对于用户来说,一个不会消失的locking文件意味着他们的所有邮件处理都会暂停,直到我手动删除locking文件。 权限似乎正常:
-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维基)与多个邮件服务器通过NFS访问同一目录有关,在这里不是这种情况。
我search了一下,弄错了,我找不到这个问题。 我正在寻求任何我忽略的东西,或者对于我可以运行的附加诊断的build议。
后来:
我正在接近一个解决scheme。 在客户端邮件服务器上:
$ 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帐户能够创build和删除/ 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
并validation了额外的.lock文件和BOGUS文件是由dovecot创build的,“_”下划线文件是由procmail创build的。 除非有人想看,否则我不会打扰审核日志。 他们显示的是正在使用正确的权限(uid,gid,euid等)创build文件,并且即使使用相同的权限进行删除调用,删除也不成功。
那么可能会导致文件被创build,但无法删除?
我设法解决了这个问题,虽然它揭示了另一个(较不重要的)问题。
偶尔的线索是,当我在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。 这向我build议,可能会有一些暂时的idmapd问题。 这与我观察到的一致:有时邮件服务器会像通过NFS没有rwx权限一样行事,即使在刚刚创build该文件之后。 由于只有NFSv4使用idmapd(至less对于NFS版本),我通过在mailserver NFS客户机上的/ etc / fstab中更改一行来切换到NFSv3:
filehost:/mail/inbox /var/spool/mail nfs defaults,vers=3 0 0
然后我重新启动邮件服务器,瞧! NFS问题消失了。 为了logging,我在诊断问题时多次重启邮件服务器,所以这不是 “通过简单重启来修复”的情况。
当然,这提出了为什么idmapd有问题的问题。 任何好奇的人都可以看看我上面的idmapd.confconfiguration。 但这是一个单独的问题,对我来说是一个低得多的优先事项。 我可能会有一天在serverfault上发布这个问题。
后来:
一个快速的networkingsearch给了我: nfs4 / idmapd / ldap-auth部分不正确的uid映射
内核3.13中实现了一个修复程序,但目前的CentOS7是内核3.10。 我不知道Redhat是否已经将这个修复软件移植到他们目前的CentOS7内核中。
这引发了问题的原因:我不断地在集群环境中添加新的活动用户。 在某些情况下,我必须通过/ var / spool / mail中的用户数量来触发idmapd错误。