Postfix - Opendkim - 無法連線到本機套接字

Postfix - Opendkim - 無法連線到本機套接字

當 postfix 嘗試連接到 opendkim 的 unix 套接字時,我收到拒絕錯誤,實際錯誤:

Sep 24 15:41:43 service-a-4 postfix/cleanup[17414]: warning: connect to Milter service unix:var/run/opendkim/opendkim.sock: Permission denied

根據後綴文檔,postfix 預設以「chroot 模式」運行,因此 postfix 被鎖定到 /var/spool/postfix/,並且根據後綴文檔,如果在“chroot 模式”下運行,則所有 milter(套接字)引用都是相對的(相對於 /var/spool/postfix)。

所以我的配置看起來像:

# /etc/opendkim.conf
Socket local:/var/spool/postfix/var/run/opendkim/opendkim.sock

# /etc/postfix/main.cf
smtpd_milters = unix:/var/run/opendkim/opendkim.sock

現在,當我嘗試發送測試電子郵件時,我收到權限被拒絕錯誤,因此我嘗試了一些權限測試:

# Correctly lists the socket file
sudo su -s /bin/bash postfix -c "ls /var/spool/postfix/var/run/opendkim/opendkim.sock"

但是當我嘗試作為後綴連接時,什麼也沒有發生:

# Does not work
sudo su -s /bin/bash postfix -c "nc -U -D /var/spool/postfix/var/run/opendkim/opendkim.sock"

# Does work (as root)
nc -U -D /var/spool/postfix/var/run/opendkim/opendkim.sock

在偵錯此網站時,SELinux 會暫時停用(允許)。每次配置更改後我都會重新啟動兩個進程(opendkim 和 postfix)。

我還缺什麼?

版本:

CentOS 6.5
Postfix v2.6.6
Opendkim v2.9

答案1

在我的 CentOS6 上測試後發現 postfix 似乎並沒有真正「chrooted」。
我的設定:

# /etc/opendkim.conf
Socket local:/var/run/opendkim/opendkim.sock

# /etc/postfix/main.cf
smtpd_milters = unix:/var/run/opendkim/opendkim.sock

這將產生:connect to Milter service unix:/var/run/opendkim/opendkim.sock: Permission denied.
但是,套接字 umask 為 002,結果為srwxrwxr-x. opendkim:opendkim opendkim.sock.

將 umask 更改為 000 可以解決問題。儘管如此,讓 opendkim 切換 user:group 比僅僅向世界開放要好。

環境:

centos 6.5 2.6.32-573.7.1.el6.x86_64
postfix 2.6.6-6.el6_5 @updates
opendkim 2.10.3-1.el6 @epel

答案2

對於那些發現此問題並且上述答案無法解決問題的人,我的問題是 opendkim 套接字資料夾上缺少群組執行權限/var/run/opendkim/

我添加了一個 cron @reboot 以確保群組權限已設置 @reboot root chmod g+x /var/run/opendkim/

修復/修補了重新啟動後返回的以下警告。

警告:連接到 Milter 服務 unix:/var/run/opendkim/opendkim.sock:權限被拒絕

TCP 連線對我來說並不是一個好的解決方案,因為我每小時簽署 10 萬多封電子郵件。

答案3

IIRC,centos 6 中的 postfix 不會在其標準配置中執行 chroot。當我從 epel 配置 opendkim 時,它帶有以下配置:

Socket                  inet:8891@localhost

因此在 postfix 中啟用它只需將其新增至 main.cf 即可:

smtpd_milters = inet:127.0.0.1:8891
non_smtpd_milters = $smtpd_milters
milter_default_action = accept
milter_protocol = 2

重新啟動 opendkim 和 postfix正確配置金鑰、TrustedHosts、SigningTable、Keytable 並將 txt 記錄發佈到 dns。

O,我忘了:postfix 也應該是 opendkim 群組的成員。

答案4

為了使 postfix 和 opendkim 透過 unix 套接字進行通信,opendkim 必須能夠建立套接字,並且 postfix 必須能夠讀取套接字。

在 Debian 中,postfix 作為 chroot /var/spool/postfix 運行,因此一個可能的設定是:

/etc/opendkim.conf:
Socket                  local:/var/spool/postfix/opendkim/opendkim.sock

/etc/postfix/main.cf:
smtpd_milters = unix:opendkim/opendkim.sock

/var/spool/postfix/opendkim 必須存在且應歸 opendkim 所有:

drwxr-xr-x 2 opendkim opendkim 4096 Jul 27 15:22 opendkim/

這應該使 opendkim 能夠創建套接字和 postfix 來存取該目錄,但 postfix 仍然無法讀取套接字:

srwxrwx--- 1 opendkim opendkim 0 Jul 27 15:22 opendkim.sock=

您可以將套接字放入後綴組中:

/etc/opendkim.conf:
UserID                  opendkim:postfix

srwxrwx--- 1 opendkim postfix 0 Jul 27 15:43 opendkim.sock=

或將 postfix 放入 opendkim 群組:

$ usermod -a -G opendkim postfix

要么應該給 postfix 正確的權限。現在 postfix 應該能夠對訊息進行簽署了。不同的發行版的工作方式可能略有不同,但這應該給您一個開始。

理論上,您也可以將 opendkim umask 更改為 002,但這將使套接字世界可讀,這可能是安全問題,所以我建議不要這樣做。

相關內容