在Ubuntu上使用Postfix设置OpenDMARC以阻止电子邮件欺骗/垃圾邮件

在先前的文章中,我们讨论了如何使用iRedMail或Modoboa快速设置自己的邮件服务器,以及一些有效的技巧来阻止电子邮件垃圾邮件。 本教程将向您展示如何在Ubuntu上使用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后缀ubuntu

然后,我检查了电子邮件标题,该标题显示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,我也建议您阅读该文章。

要遵循本教程,您需要首先使SPF和DKIM验证生效,因为DMARC依赖于SPF和DKIM验证结果来做出最终决定。

在Ubuntu 16.04,Ubuntu 18.04或20.04上使用Postfix SMTP服务器设置OpenDMARC

OpenDMARC是可以执行DMARC验证和报告的开源软件。 它已经在Ubuntu存储库中,因此您可以运行以下命令进行安装。

sudo apt install opendmarc

如果要求您使用dbconfig-common为OpenDMARC配置数据库,则可以安全地选择 没有

使用dbconfig-common为opendmarc配置数据库

安装后,它将自动启动。 使用以下命令检查其状态:

systemctl status opendmarc

输出:

● opendmarc.service - OpenDMARC Milter
   Loaded: loaded (/lib/systemd/system/opendmarc.service; disabled; vendor preset: enabled)
   Active: active (running) since Tue 2018-10-30 19:49:52 CST; 23s ago
     Docs: man:opendmarc(8)
           man:opendmarc.conf(5)
 Main PID: 14858 (opendmarc)
    Tasks: 6 (limit: 1110)
   CGroup: /system.slice/opendmarc.service
           └─14858 /usr/sbin/opendmarc

提示:如果上述命令没有立即退出,您可以通过按Q键使其退出。

请注意,系统启动时自动启动已禁用。 我们可以通过以下方式启用它:

sudo systemctl enable opendmarc

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

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

然后找到以下行:

# RejectFailures false

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

RejectFailures true

您可能希望OpenDMARC忽略通过SMTP AUTH成功认证的SMTP客户端。 例如,我在博客Web服务器上运行一个Postfix SMTP服务器,该服务器使用主邮件服务器作为中继来发送通知电子邮件,因此我希望openDMARC忽略从博客Web服务器提交的电子邮件。 这也适用于通过端口587提交外发电子邮件的台式机/移动邮件客户端。在这种情况下,请在此文件末尾添加以下行。

IgnoreAuthenticatedClients true

在此文件的末尾添加以下行。

RequiredHeaders    true

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

建议在此文件末尾也添加以下行。 当OpenDMARC在消息头中找不到SPF结果时,它将使自身执行回退SPF检查。

SPFSelfValidate true

OpenDMARC是作为milter(邮件过滤器)实现的。 Postfix可以通过Unix套接字与远程应用程序对话。 OpenDMARC使用的默认套接字文件是 /var/run/opendmarc/opendmarc.sock。 但是Ubuntu随附的Postfix SMTP守护程序在chroot监狱中运行,这意味着SMTP守护程序解析相对于Postfix队列目录的所有文件名(/var/spool/postfix)。 因此,我们需要更改OpenDMARC使用的套接字文件。

找到以下行。

Socket local:/var/run/opendmarc/opendmarc.sock

更改为:

Socket local:/var/spool/postfix/opendmarc/opendmarc.sock

保存并关闭文件。 在Ubuntu 16.04上,此文件中没有定义Socket,您只需要在文件中添加以上行即可。

注意/etc/default/opendmarc 文件还可以设置套接字文件的位置,但是 opendmarc Ubuntu 18.04和20.04上的软件包不会读取此文件,因此我们需要在以下位置设置套接字文件路径 /etc/opendmarc.conf 文件。

创建一个目录以保存OpenDMARC套接字文件并更改所有权,以便 opendmarc 用户和 opendmarc 组可以访问它。

sudo mkdir -p /var/spool/postfix/opendmarc

sudo chown opendmarc:opendmarc /var/spool/postfix/opendmarc -R

将权限更改为750以限制访问,因此用户不在组中 opendmarc 无法访问该目录。

sudo chmod 750 /var/spool/postfix/opendmarc/ -R

添加用户 postfix 分组 opendmarc

sudo adduser postfix opendmarc

然后重新启动OpenDMARC。

sudo systemctl restart opendmarc

配置Postfix SMTP服务器

编辑主配置文件。

sudo nano /etc/postfix/main.cf

如果您已经配置了OpenDKIM,则该文件中应包含如下所示的行。

# Milter configuration
milter_default_action = accept
milter_protocol = 6
smtpd_milters = local:opendkim/opendkim.sock
non_smtpd_milters = $smtpd_milters

现在,您只需要添加OpenDMARC套接字文件,以便Postfix可以与OpenDMARC对话。 (确保它在OpenDKIM套接字之后。)

# Milter configuration
milter_default_action = accept
milter_protocol = 6
smtpd_milters = local:opendkim/opendkim.sock,local:opendmarc/opendmarc.sock
non_smtpd_milters = $smtpd_milters

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

sudo systemctl restart postfix

如果您使用iRedMail

如果使用iRedMail设置邮件服务器,则没有OpenDKIM。 iRedMail使用Amavis进行DKIM签名和验证,但是OpenDMARC无法从Amavis读取DKIM验证重用,这将导致DMARC检查失败。 因此,我们需要按以下步骤设置DKIM验证。

运行以下命令以安装OpenDKIM。

sudo apt install opendkim

编辑OpenDKIM主配置文件。

sudo nano /etc/opendkim.conf

找到以下行

#Mode        sv

默认情况下,OpenDKIM将同时充当签名者和验证者(v)。 由于iRedMail已经使用Amavis进行DKIM签名,因此我们只需要OpenDKIM充当验证者,因此OpenDMARC可以读取验证结果。 除掉 # 符号,然后将模式更改为验证程序。

Mode         v

然后在此文件的末尾添加以下行。

#OpenDKIM user
# Remember to add user postfix to group opendkim
UserID             opendkim

# Hosts to ignore when verifying signatures
ExternalIgnoreList  /etc/opendkim/trusted.hosts
InternalHosts       /etc/opendkim/trusted.hosts
Socket              local:/var/spool/postfix/opendkim/opendkim.sock

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

sudo adduser postfix opendkim

创建受信任的主机文件。

sudo mkdir /etc/opendkim/
sudo nano /etc/opendkim/trusted.hosts

将以下行添加到新创建的文件中。

127.0.0.1
localhost

*.your-domain.com

以上意味着来自上述IP地址和域的消息将受到信任。 保存并关闭文件。 然后更改所有权。

sudo chown -R opendkim:opendkim /etc/opendkim

接下来,创建一个目录来保存OpenDKIM套接字文件,并且仅允许opendkim用户和组访问它。

sudo mkdir /var/spool/postfix/opendkim

sudo chown opendkim:opendkim /var/spool/postfix/opendkim

如果可以在/ etc / default / opendkim文件中找到以下行。

SOCKET="local:/var/run/opendkim/opendkim.sock"

更改为

SOCKET="local:/var/spool/postfix/opendkim/opendkim.sock"

之后,我们需要编辑Postfix主要配置文件。

sudo nano /etc/postfix/main.cf

在此文件的末尾添加以下行,以将Postfix与OpenDKIM和OpenDMARC连接。

# Milter configuration
milter_default_action = accept
milter_protocol = 6
smtpd_milters = local:opendkim/opendkim.sock,local:opendmarc/opendmarc.sock
non_smtpd_milters = $smtpd_milters

保存并关闭文件。 重新启动OpenDKIM,OpenDMARC和Postfix。

sudo systemctl restart opendkim opendmarc postfix

测试OpenDMARC验证

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

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

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

sudo nano /var/log/mail.log

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

opendmarc[26495]: implicit authentication service: mail.linuxbabe.com
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 命令行实用程序以释放保留队列中的消息。

结论

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

Sidebar