在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
是公开的。 显然,垃圾邮件发送者不是负责此域名的人。
winsaaluminyumankara.com
有DMARC记录。
然后,我检查了电子邮件标题,该标题显示SPF失败。 没有DKIM签名。 因此DMARC检查失败。 这是一封欺骗性的电子邮件。
这表明,电子邮件欺骗者不仅使用大品牌,而且互联网上的任何域名都可能被不良行为者冒充。 不幸的是,此域名的DMARC策略是 p=none
,它告诉接收电子邮件服务器在DMARC检查失败时不做任何特殊处理。 如果政策是 p=reject
,则我的Postfix SMTP服务器将使用OpenDMARC拒绝此电子邮件。
Paypal和Facebook创建了一个 reject
DMARC的域名政策。
因此,如果坏演员试图欺骗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配置数据库,则可以安全地选择 没有。
安装后,它将自动启动。 使用以下命令检查其状态:
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
,然后取消注释此行并进行更改 false
至 true
。
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,以阻止电子邮件欺骗和垃圾邮件。 与往常一样,如果您发现这篇文章很有用,请订阅我们的免费新闻通讯以获取更多提示和技巧。 保重🙂