用于dovecot和procmail的NFS挂载/ var / spool / mail的许可困难

我的邮件服务器设置工作多年。 最近我开始遇到以下问题:

邮件设置: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
  • locking文件不会消失。 典型的邮件日志条目:
 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错误。