在CentOS / RHEL上使用Postfix设置OpenDMARC以阻止电子邮件欺骗

在以前的文章中,我们讨论了阻止电子邮件垃圾邮件的几个有效技巧。 本教程将向您展示如何在CentOS / RHEL上使用Postfix SMTP服务器设置OpenDMARC,以阻止电子邮件欺骗和垃圾邮件。 OpenDMARC是针对MTA(消息传输代理,又名SMTP服务器)的开源DMARC电子邮件策略过滤器。

什么是DMARC

DMARC(基于域的消息身份验证,报告和遵从性)是Internet标准(RFC 7489),允许域所有者阻止其域名被电子邮件欺骗者使用。 在发明DMARC之前,不良行为者很容易在发件人地址中使用其他人的域名。

如果域所有者为其域名创建了DMARC DNS记录,并且接收电子邮件服务器实施了DMARC验证,则不良行为者需要通过SPF对齐或DKIM对齐才能通过DMARC验证。 如果DMARC检查失败,则可以拒绝所欺骗的电子邮件。 永远不会被最终用户看到。 除非域名所有者的电子邮件服务器受到损害,否则不良行为者很难通过SPF或DKIM。

电子邮件欺骗示例

垃圾邮件发送者使用以下命令向我发送了赎金电子邮件 winsaaluminyumankara.com 在发件人地址中。 的Whois信息 winsaaluminyumankara.com 是公开的。 显然,垃圾邮件发送者不是负责此域名的人。

dmarc设定

winsaaluminyumankara.com 有DMARC记录。

opendmarc-postfix-centos 8

然后,我检查了电子邮件标题,该标题显示SPF失败。 没有DKIM签名。 因此DMARC检查失败。 这是一封欺骗性的电子邮件。

opendmarc后缀

这表明,电子邮件欺骗者不仅使用大品牌,而且互联网上的任何域名都可能被不良行为者冒充。 不幸的是,此域名的DMARC策略是 p=none,它告诉接收电子邮件服务器在DMARC检查失败时不做任何特殊处理。 如果政策是 p=reject,则我的Postfix SMTP服务器将使用OpenDMARC拒绝此电子邮件。

Paypal和Facebook创建了一个 reject DMARC的域名政策。

opendmarc配置

因此,如果坏演员试图欺骗Paypal或Facebook,我的电子邮件服务器可以使用OpenDMARC拒绝欺骗的电子邮件。 还有许多其他知名域名部署了 reject DMARC政策,如下表所示。

  • bankofamerica.com
  • yahoo.com
  • chase.com
  • wellsfargo.com
  • facebook.com
  • google.com
  • youtube.com
  • twitter.com
  • reddit.com
  • instagram.com
  • linkedin.com
  • medium.com
  • pinterest.com
  • dropbox.com
  • microsoft.com
  • whatsapp.com

安全邮箱提供商Protonmail正在使用Postfix和OpenDMARC对入站电子邮件执行DMARC检查,我将向您展示如何在自己的Postfix SMTP服务器上执行相同的操作。

先决条件

本教程适用于邮箱提供商和任何运行自己的邮件服务器的人,以保护其用户免受电子邮件欺骗的欺骗。 如果您是域名所有者,并且想防止电子邮件欺骗者使用您的域名,请阅读本文以创建DMARC记录并分析DMARC报告。 如果您还不完全了解DMARC,我也建议您阅读该文章。

在设置OpenDMARC之前,您应该在邮件服务器上运行DKIM验证服务。 OpenDMARC应该与OpenDKIM结合使用。 如果使用Amavis进行DKIM签名和验证,则建议从Amavis切换到OpenDKIM。 那是因为OpenDMARC无法从Amavis读取DKIM验证结果。 您不必完全卸载Amavis。 只需在Amavis中禁用DKIM,然后安装和配置OpenDKIM。

如果您不喜欢切换到OpenDKIM,则需要通过milter界面将Amavis与Postfix集成,这将在本文结尾处进行说明。

步骤1:在CentOS / RHEL上安装和配置OpenDMARC

OpenDMARC是可以执行DMARC检查和报告的开源软件。 您可以从EPEL存储库将其安装在CentOS / RHEL上。

sudo dnf install epel-release

sudo dnf install opendmarc

启动OpenDMARC。

sudo systemctl start opendmarc

在启动时启用自动启动。

sudo systemctl enable opendmarc

OpenDMARC监听 127.0.0.1:8893。 运行以下命令以检查其状态。

systemctl status opendmarc

输出:

● opendmarc.service - Domain-based Message Authentication, Reporting & Conformance (DMARC) Milter
   Loaded: loaded (/usr/lib/systemd/system/opendmarc.service; enabled; vendor preset: disabled)
   Active: active (running) since Sun 2020-03-08 23:52:59 EDT; 1min 4s ago
     Docs: man:opendmarc(8)
           man:opendmarc.conf(5)
           man:opendmarc-import(8)
           man:opendmarc-reports(8)
           http://www.trusteddomain.org/opendmarc/
 Main PID: 19987 (opendmarc)
    Tasks: 3 (limit: 5047)
   Memory: 1.1M
   CGroup: /system.slice/opendmarc.service
           └─19987 /usr/sbin/opendmarc -c /etc/opendmarc.conf -P /var/run/opendmarc/opendmarc.pid

然后,使用文本编辑器编辑主配置文件。

sudo nano /etc/opendmarc.conf

找到以下行:

# AuthservID name

默认情况下,OpenDMARC使用MTA主机名作为AuthserveID,但是最好为身份验证服务使用其他名称,因为Amavisd-new将覆盖OpenDMARC添加的身份验证结果标头。 您可以将其更改为以下内容,这很容易让您查看哪个程序添加了哪个身份验证结果标头。

AuthservID OpenDMARC

接下来,添加以下行。 用您的真实Postfix主机名替换主机名。 这告诉OpenDMARC信任认证结果 mail.yourdomain.com 在ID中。 当您运行OpenDKIM来执行DKIM验证时,这是必需的。 如果Postfix主机名未包含在 TrustedAuthservIDs,则OpenDMARC将忽略OpenDKIM生成的Authentication-Results标头。

TrustedAuthservIDs mail.yourdomain.com

然后找到以下行。

# IgnoreAuthenticatedClients false

将值更改为 true 忽略通过SMTP AUTH成功认证的SMTP客户端,包括通过端口587提交传出电子邮件的台式机/移动邮件客户端。

IgnoreAuthenticatedClients true

然后找到以下行:

# RejectFailures false

默认情况下,即使域的策略设置为OpenDMARC,也不会拒绝未通过DMARC检查的电子邮件 p=reject。 如果您希望拒绝未通过DMARC的电子邮件,请在将域策略设置为“ p=reject,然后取消注释此行并进行更改 falsetrue

RejectFailures true

找到以下行。

# RequiredHeaders  false

更改为:

RequiredHeaders    true

这将拒绝不符合RFC5322中描述的电子邮件标头标准的电子邮件。 例如,如果传入的电子邮件没有 From: 标头或 date: 标头,它将被拒绝。 无法从中提取域名的“发件人:”字段也将被拒绝。

默认情况下,CentOS / RHEL上的OpenDMARC将忽略电子邮件标题中的任何SPF结果,并自行执行SPF检查。 这由以下两个参数控制。

SPFIgnoreResults true

SPFSelfValidate true

如果您希望在邮件服务器上使用其他SPF检查服务,请告诉OpenDMARC信任电子邮件标头中的SPF结果,并且仅当它在标头中找不到SPF结果时才执行SPF检查。

SPFIgnoreResults false

SPFSelfValidate true

保存并关闭文件。 然后重新启动OpenDMARC,以使更改生效。

sudo systemctl restart opendmarc

步骤2:将OpenDMARC与Postfix SMTP服务器集成

如果您使用OpenDKIM

编辑Postfix主配置文件。

sudo nano /etc/postfix/main.cf

如果您遵循了我在CentOS 8 / RHEL 8上的DKIM教程,那么该文件中应该包含如下几行。 OpenDKIM正在监听 127.0.0.1:8891

# Milter configuration
milter_default_action = accept
milter_protocol = 6
smtpd_milters = inet:127.0.0.1:8891
non_smtpd_milters = $smtpd_milters

现在,您只需要添加OpenDMARC套接字,以便Postfix可以与OpenDMARC进行通信。 (确保它在OpenDKIM套接字之后。)OpenDMARC侦听 127.0.0.1:8893

# Milter configuration
milter_default_action = accept
milter_protocol = 6
smtpd_milters = inet:127.0.0.1:8891,inet:127.0.0.1:8893
non_smtpd_milters = $smtpd_milters

保存并关闭文件。 然后重新启动Postfix,以使更改生效。

sudo systemctl restart postfix

如果您使用Amavis

如果您使用Amavis进行DKIM签名和验证,例如 iRedMail,则OpenDMARC无法从Amavis读取DKIM验证结果。 您可以安装OpenDKIM来验证DKIM签名。

从EPEL(企业Linux的额外软件包)存储库中安装OpenDKIM。

sudo dnf install epel-release

sudo dnf install opendkim

默认情况下, opendkim CentOS / RHEL上的软件包仅在验证模式下运行。 不会将DKIM签名添加到外发电子邮件中。 这就是我们想要的,因为Amavis将添加DKIM签名。 编辑OpenDKIM配置文件。

sudo nano /etc/opendkim.conf

找到以下行。

KeyFile   /etc/opendkim/keys/default.private

由于我们不希望OpenDKIM签署外发电子邮件,因此需要注释掉这一行,然后保存并关闭文件。

编辑Postfix主要配置文件。

sudo nano /etc/postfix/main.cf

在此文件的末尾添加以下行,以便Postfix能够通过milter协议调用OpenDKIM。 请注意,您应该使用 127.0.0.1 作为地址。 不要使用 localhost

# Milter configuration
milter_default_action = accept
milter_protocol = 6
smtpd_milters = inet:127.0.0.1:8891,inet:127.0.0.1:8893
non_smtpd_milters = $smtpd_milters

保存并关闭文件。 然后加 postfix 用户 opendkim 组。

sudo gpasswd -a postfix opendkim

重新开始 postfix 服务。

sudo systemctl restart postfix

现在,我们可以启动opendkim服务。

sudo systemctl start opendkim

并在引导时启用自动启动。

sudo systemctl enable opendkim

步骤3:测试OpenDMARC验证

现在,将电子邮件从您的其他电子邮件地址发送到您的域地址。 之后,检查电子邮件标题。 如果OpenDMARC正常工作,则可以看到如下所示的DMARC验证结果。

Authentication-Results: OpenDMARC; dmarc=pass (p=none dis=none) header.from=gmail.com

我从我的Gmail帐户发送了一封电子邮件到我的域电子邮件地址,并通过了DMARC验证。 如果您没有看到此电子邮件标题,请检查您的邮件日志。

sudo nano /var/log/maillog

您将看到类似以下的内容:

opendmarc[26495]: 61DAA3EA44: gmail.com pass

使用Telnet测试OpenDMARC

您可以使用telnet欺骗另一个域名,例如paypal.com。 首先,运行以下命令以连接到邮件服务器的端口25。

telnet mail.yourdomain.com 25

然后使用以下步骤发送欺骗电子邮件。 (您输入粗体文本。)

HELO mail.paypal.com
250 mail.yourdomain.com
MAIL FROM:<[email protected]>
250 2.1.0 Ok
RCPT TO:<[email protected]>
250 2.1.5 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
From:     [email protected]
To:       [email protected]
Subject:  Please update your password.

Click this link to update your password.
.
550 5.7.1 rejected by DMARC policy for paypal.com
quit

如您所见,我的邮件服务器拒绝了这封电子邮件,因为它没有通过DMARC检查,并且Paypal部署了 p=reject 政策。

注意: 如果域的DMARC策略设置为 p=quarantine,那么OpenDMARC过滤器会将被欺骗的电子邮件无限期地放入Postifx保留队列中。 邮政局长可以使用以下命令列出队列中的所有邮件 postqueue -p 命令并使用 postsuper 命令行实用程序以释放保留队列中的消息。

(可选)通过Milter将Amavis与Postfix集成

如前提条件部分中所述,我建议从Amavis切换到OpenDKIM,但是如果您不喜欢切换,则需要通过milter接口将Amavis与Postfix集成在一起,以便OpenDMARC可以从Amavis读取DKIM验证结果。

安装 amavisd-milter CentOS / RHEL上的软件包。

sudo dnf install amavisd-milter

启动服务。

sudo systemctl start amavisd-milter

在启动时启用自动启动。

sudo systemctl enable amavisd-milter

Amavisd-milter在以下位置监听Unix套接字 /run/amavisd/amavisd-milter.sock。 编辑Postfix主要配置文件。

sudo nano /etc/postfix/main.cf

在文件末尾添加以下行。 请注意,应将amavisd-milter Unix套接字放在OpenDMARC TCP套接字之前。

# Milter configuration
milter_default_action = accept
milter_protocol = 6
smtpd_milters = unix:/run/amavisd/amavisd-milter.sock,inet:127.0.0.1:8893
non_smtpd_milters = $smtpd_milters

还要注释掉以下行,因此Postfix不会两次将传入的电子邮件传递给Amavis。

content_filter = smtp-amavis:[127.0.0.1]:10024

保存并关闭文件。 然后加 postfixamavis 组,因此Postfix将能够访问Amavis Unix套接字。

sudo gpasswd -a postfix amavis

经过身份验证的用户提交的外发电子邮件不应通过milter界面传递给Amavis,因为Amavis不会添加DKIM签名。 他们应该使用 127.0.0.1:10026 像往常一样,以便添加DKIM签名。 编辑Postfix master.cf文件。

sudo nano /etc/postfix/master.cf

找出 submission 零件。 如果您遵循我在CentOS / RHEL上的Amavis教程,它应该看起来如下。

submission     inet     n    -    y   -    -    smtpd
 -o syslog_name=postfix/submission
 -o smtpd_tls_security_level=encrypt
 -o smtpd_tls_wrappermode=no
 -o smtpd_sasl_auth_enable=yes
 -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
 -o smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject
 -o smtpd_sasl_type=dovecot
 -o smtpd_sasl_path=private/auth
 -o content_filter=smtp-amavis:[127.0.0.1]:10026

现在,在末尾添加以下选项。

-o smtpd_milters=

像这样:

submission     inet     n    -    y   -    -    smtpd
 -o syslog_name=postfix/submission
 -o smtpd_tls_security_level=encrypt
 -o smtpd_tls_wrappermode=no
 -o smtpd_sasl_auth_enable=yes
 -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
 -o smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject
 -o smtpd_sasl_type=dovecot
 -o smtpd_sasl_path=private/auth
 -o content_filter=smtp-amavis:[127.0.0.1]:10026
 -o smtpd_milters=

这将使Postfix提交服务完全不使用任何斜符,从而使通过身份验证的用户提交的电子邮件不会通过斜符界面传递给Amavis。 请注意,请勿在等号(=)之前添加任何空格。

您还应该将此行添加到 smtps 零件。

smtps     inet  n       -       y       -       -       smtpd
  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject
  -o smtpd_sasl_type=dovecot
  -o smtpd_sasl_path=private/auth
  -o content_filter=smtp-amavis:[127.0.0.1]:10026
  -o smtpd_milters=

保存并关闭文件。 重新启动Postfix,以使更改生效。

sudo systemctl restart postfix

现在,OpenDMARC将能够从Amavis读取DKIM验证结果,而Amavis将继续为经过身份验证的用户添加DKIM签名。

包起来

我希望本教程可以帮助您在CentOS / RHEL上使用Postfix SMTP服务器设置OpenDMARC,以阻止电子邮件欺骗和垃圾邮件。 与往常一样,如果您发现这篇文章很有用,请订阅我们的免费新闻通讯以获取更多提示和技巧。 保重🙂

Sidebar