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 文档默认情况下,postfix 以“chroot 模式”运行,因此 postfix 被锁定在 /var/spool/postfix/ 中,并且根据postfix 文档,如果在“chroot 模式”下运行,所有 milter(socket)引用都是相对的(相对于 /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 切换用户:组,而不是直接向全世界开放。

环境:

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

我记得,centos 6 中的 postfix 在其标准配置中不运行 chrooted。当我从 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。

哦,我忘了: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,但这会使套接字世界可读,这可能是一个安全问题,因此我不建议这样做。

相关内容