Centos6

安裝 NFS 的 /var/spool/mail 用於 dovecot 和 procmail 的權限問題

  • April 3, 2017

我的郵件伺服器設置工作了多年。最近我開始遇到以下問題:

郵件設置: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): 錯誤: 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 訪問同一目錄有關,這裡不是這種情況。

我用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 導入的目錄中執行任何操作。我嘗試向 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 時,我會看到如下內容:

-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 上發布這個問題。

之後:

一個快速的網路搜尋給了我這個:Partially wrong uid mapping with nfs4/idmapd/ldap-auth

在核心 3.13 中進行了修復,但目前的 CentOS7 是核心 3.10。我不知道 Redhat 是否已將修復程序反向移植到他們目前的 CentOS7 核心中。

這為我提供了導致問題的線索:我不斷地將新的活躍使用者添加到我們的集群環境中。在某些時候,我一定是在 /var/spool/mail 中觸發了 idmapd 錯誤的使用者數量。

引用自:https://serverfault.com/questions/841375