Postfix(SASL)和 OpenDMARC 报告

Postfix(SASL)和 OpenDMARC 报告

我正在寻找有关如何实现 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 报告单独提供未经身份验证的报告

与当前脚本兼容的替代解决方案是向 添加一个单独的、未经身份验证的smtpdmaster.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

这里,

  1. 127.0.0.1:10025

    • 使其在本地主机上监听
    • 该端口10025应该在opendmarc-reports --smtp-port=10025
  2. smtpd_sender_restrictions = 
        check_sender_access pcre:/etc/postfix/access/sender_dmarc,
        reject
    
    • 限制可以使用此服务的信封发件人地址
    • 该文件包含PCRE 表允许的地址,例如
      /^dmarc-noreply@example\.com$/ OK
      
  3. smtpd_recipient_restrictions = 
        permit_mynetworks,
        reject
    
    • mynetworks=127.0.0.0/8仅允许发送
    • 如果这个参数的main.cf限制较少
  4. OpenDKIM 过滤器localhost:8891用于 DKIM 签名。

    • milter如果不使用 DKIM 签名,则可以删除包含的行。
    • 如果您的 OpenDKIM 正在监听 UNIX 套接字,请将 替换为inet:,例如local:opendkim/opendkim.sock
  5. 单独的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 单元,并将所有设置作为环境变量存储在受保护的文件中。

相关内容