我正在寻找有关如何实现 OpenDMARC-Reports 的电子邮件发送的建议。我遇到的问题是(出于显而易见的原因),我已经在 smtpd 服务器上为所有帐户实现了 SASL 身份验证。我查看了 OpenDMARC-Reports 源代码,据我所知,它对 SMTP 服务器进行的唯一身份验证是找出它所在主机的 FQDN。仅供参考,我已经通过 Dovecot 实现了 SASL 身份验证,它反过来访问 MySQL 以获取电子邮件/用户/密码信息。
理想情况下,我希望能够:a) 使用 Linux 服务帐户(例如 OpenDMARC)通过单独的 smtp 路由在本地发送电子邮件,或者 b) 让 OpenDMARC-Reports 将结果文件发送到文件,然后让电子邮件客户端(例如 mutt)处理电子邮件传输。 (OpenDMARC-Reports 会执行此操作,但它不会在域上设置“电子邮件已发送”标志 - 仅在通过电子邮件发送报告时才会设置。)
欢迎任何建议。
答案1
这确实是opendmarc-reports
脚本。您的解决方案修补脚本的贡献非常出色,我希望将其作为对受信任域项目的拉取请求,从根本上解决问题。手册页也应进行相应更新。
这个答案包含
- 与当前报告工具兼容的替代解决方案
- 考虑到您当前方法中使用的脚本,出现安全警告。
smtpd
为 OpenDMARC 报告单独提供未经身份验证的报告
与当前脚本兼容的替代解决方案是向 添加一个单独的、未经身份验证的smtpd
。master.cf
这样,smtpd
用户用于电子邮件提交的 就可以保持 SASL 身份验证。
有一些妥协;这并不能完全防止本地用户的滥用,但只能用于从某些地址发送内容受限的消息。此外,从日志中很容易检测到对该服务的滥用,因为它每天只能使用一次。
# Allow DMARC reports, as OpenDMARC aggregate report generation tool is a bit limited
127.0.0.1:10025 inet n - - - - smtpd
-o mynetworks=127.0.0.0/8
-o { smtpd_sender_restrictions = check_sender_access pcre:/etc/postfix/access/sender_dmarc, reject }
-o { smtpd_recipient_restrictions = permit_mynetworks, reject }
-o cleanup_service_name=dmarc-cleanup
-o milter_default_action=accept
-o smtpd_milters=inet:localhost:8891
-o non_smtpd_milters=inet:localhost:8891
dmarc-cleanup unix n - y - 0 cleanup
-o header_checks=pcre:/etc/postfix/access/header_dmarc
这里,
127.0.0.1:10025
- 使其在本地主机上监听
- 该端口
10025
应该在opendmarc-reports --smtp-port=10025
-
smtpd_sender_restrictions = check_sender_access pcre:/etc/postfix/access/sender_dmarc, reject
- 限制可以使用此服务的信封发件人地址
- 该文件包含PCRE 表允许的地址,例如
/^dmarc-noreply@example\.com$/ OK
-
smtpd_recipient_restrictions = permit_mynetworks, reject
mynetworks=127.0.0.0/8
仅允许发送- 如果这个参数的
main.cf
限制较少
OpenDKIM 过滤器
localhost:8891
用于 DKIM 签名。milter
如果不使用 DKIM 签名,则可以删除包含的行。- 如果您的 OpenDKIM 正在监听 UNIX 套接字,请将 替换为
inet:
,例如local:opendkim/opendkim.sock
。
单独的
cleanup
服务dmarc-cleanup
用于检查额外的内容。- 限制
header_checks=pcre:/etc/postfix/access/header_dmarc
允许的标题。 - 该文件包含PCRE 表允许的标头,例如
if /^From:/ !/^From: .*dmarc-noreply@example\.com/ REJECT Only DMARC reports allowed. F endif if /^Subject:/ !/^Subject: Report Domain:/ REJECT Only DMARC reports allowed. S endif
- 限制
安全警告:请勿将凭据作为命令行参数泄露!
您的解决方案2015 年以来在互联网上广泛传播的 存在一个安全漏洞:它在命令行上传递凭据。作为命令行参数,凭据对所有用户都是可见的(例如在 中ps ax
)。
幸运的是,OpenDMARC 报告工具也可以从环境变量中获取这些设置:
环境变量 | 等效命令行选项 | 默认值 |
---|---|---|
$OPENDMARC_DBHOST |
--dbhost |
localhost |
$OPENDMARC_PORT |
--dbport |
3306 |
$OPENDMARC_DB |
--dbname |
opendmarc |
$OPENDMARC_USER |
--dbuser |
opendmarc |
$OPENDMARC_PASSWORD |
--dbpasswd |
opendmarc |
我已经编写了一个改进的脚本来解决这个安全问题;GitHub oh2fih /OpenDMARC 报告。示例解决方案包含用于自动报告的 SystemD 单元,并将所有设置作为环境变量存储在受保护的文件中。