第十一章:DMARCDMARC组件DMARC记录强制性DMARC标签法医报告对齐其他标签DMARC有什么问题DMARC认证接收链DMARC与小型邮件服务器接收其他域的报告处理报告dmarcts-report-parser配置 dmarcts-report-parser测试 dmarcts-report-parserdmarcts-report-viewer配置 dmarcts-report-viewer查看报告上线
长期开放标准的乐趣之一是任何人都可以实现它们。这也是一个巨大的问题。程序可能会间歇性地被放弃、复活、转世、分叉或重新实施,而不会更改名称,被一家意图将标准私有化的公司接管,或者被扔进垃圾桶。偶尔,它们会被关心它们的人精心维护几十年。
在互联网的某个地方,这些程序的每个变体都部署在生产中。SPF验证器大多有效。DKIM验证器?同样的,除非他们没有。当这些程序导致有人拒绝您的邮件时,问题就来了。也许他们会把它还给你。也许他们会把它扔进垃圾邮件文件夹,或者默默地丢弃它。
你无法得知。
基于域的邮件身份验证、报告和一致性(Domain-based Message Authentication, Reporting, and Conformance —— DMARC)为您提供了一种方法,让您告诉外部MTA您对邮件的期望,并让这些MTA在您的邮件不符合这些期望时提供反馈。它在RFC 7489中定义。DMARC解决了SPF和DKIM对齐问题,这与有效的SPF或DKIM不同。主机可能正在从SPF记录中列出的IP地址为您的域发送邮件,但其错误的标头使其错位(第7章)。一封电子邮件可能具有有效的DKIM签名,但如果用户可见的 From
标头错误,则无法进行DKIM对齐(第9章)。DMARC政策对SPF或DKIM的有效性没有任何要求,只要求一致性。
DMARC允许您向外部MTA提供指导,说明您希望他们如何处理您的不合格消息,以及在哪里发送DMARC故障的汇总报告。邮件操作员可以查看报告,确定哪些对齐检查失败,哪些主机发送了消息,并决定采取什么行动。
从本质上讲,系统管理员希望他们的系统符合尽可能高的标准。我们的网络服务器是安全的(不管这意味着什么)。我们的密码包括大小写混合的字母、数字、符号和 Imperial March(帝国进行曲)。我们打算用DKIM对所有内容进行签名,并发布包含可能发送邮件的每个主机的SPF记录。在这种心态下,任何没有完美对齐的东西显然都是伪造的,应该单方面抛弃。不过,任何在计算机行业工作一周以上的人都会明白,我们会错过一些东西。一些关键系统从自己的主机名而不是域发送邮件,或者有一个奇怪的系统只在银河参议院开始其十年一次的会议时发送邮件。DMARC故意允许软部署。您可以发布要求严格对齐SPF和/或DKIM的严格政策,但要求向您报告失败,而不是丢弃。使用故障报告查找并修复部署差距。最终,失败报告将停止出现,您将更新您的策略,要求其他人隔离甚至拒绝不合规的邮件。
这是理论,至少。实践有点不同。
DMARC记录描述了您要执行的测试、处理测试失败的策略、报告收件人以及您想要的报告类型。
DMARC告诉外部MTA如何评估DKIM和SPF的一致性。域可以声明消息应该具有简单或宽松的SPF或DKIM对齐。如果不声明策略,默认情况下两者都是宽松的。
DMARC策略告诉接收MTA如何处理不符合请求的SPF和DKIM对齐级别的邮件。策略可以要求对邮件进行隔离(可能是垃圾邮件)、拒绝或正常处理。你必须明确声明你的政策。
报告是DMARC的关键。您必须定义一个电子邮件地址才能接收汇总报告。您可以定义另一个地址来接收详细的每消息取证报告。并非所有收件人都会发送失败报告,更不用说法医报告了,但您必须提供收件人,以防他们这样做。
用DMARC记录定义所有这些。
与其他电子邮件相邻协议一样,DMARC记录是通过DNS TXT记录分发的键值对语句的集合。其中一些标签是强制性的,而另一些标签是为以后的扩展而创建的,现在可以忽略。DMARC记录适用于子域,因此除非您创建其他记录,否则 ratoperatedvehicle.com
的DMARC记录将应用于 mail.ratooperatedvehcle.com
。DMARC记录出现在 _dmarc
的区域中,看起来像这样:
xxxxxxxxxx
_dmarc.mwl.io. TXT "v=DMARC1; p=none; rua=mailto:dmarc@mwl.io;"
DMARC记录有几个强制标签和几个可选标签。
这是一个仅包含强制标签的最小DMARC记录:
xxxxxxxxxx
v=DMARC1; p=none; rua=mailto:dmarc@ratoperatedvehicle.com;
v
标签给出DMARC版本。它应该始终设置为 DMARC1
,因为版本2还不存在。
p
标记是策略,告诉远程MTA如何处理SPF和DMARC对齐测试失败的消息。
rua
(reporting URI: aggregate)标记定义了外部MTA应在何处发送故障报告。该帐户必须存在并且必须接受邮件。虽然电子邮件是目前唯一支持的方法,但人们正在研究其他方法。为了便于将来使用,每个地址都必须以 mailto:
关键字开头。用逗号分隔多个地址。
一旦你有了基本策略,你就可以添加额外的标签。
正常的DMARC报告会识别消息何时未通过DMARC记录中声明的DKIM或SPF对齐策略。稍后我们将查看其中一份报告,但您可能需要有关未通过DMARC策略的特定消息的详细报告。这些法医报告是失败电子邮件的精简副本。它们包含SPF和DKIM标头、发送邮件的MTA和发件人。取证报告是查找网络上配置错误的主机的好方法。它们也是获取有关试图伪造您域名的每条垃圾邮件的不可操作信息的好方式。
您的策略必须定义您想了解的失败类型以及这些报告的收件人。使用 ruf
(reporting URI: forensic)标签作为人们应向其发送取证报告的电子邮件地址。
fo
标记告诉外部MTA您想要什么类型的故障报告。默认值 0
声明只有当SPF和DKIM都无法通过对齐时才需要报告。若要在SPF或DKIM失败时获取报告,请将 fo
设置为 1
。要专门查看失败的DKIM消息,请使用 d
。使用 s
获取所有失败的SPF测试的报告。您可以通过用分号分隔来列出多个值。在这里,我要求法医报告 forensic@ratoperatedvehicle.com
,并请求报告0和1。
xxxxxxxxxx
v=DMARC1; p=none; rua=mailto:dmarc@ratoperatedvehicle; ruf=mailto:forensic@ratoperatedvehicle.com; fo=0;1;
法医报告是一项公共服务,但许多组织不发送。如果有人在数百万条垃圾邮件上伪造了你的域名,你将收到数万份法医报告。如果有人使用垃圾邮件的死星,将数百万条来自你的邮件伪造到Gmail,你的小型MTA能否应对谷歌转发给你的每条伪造邮件的详细信息?可能不会。
DMARC接受松弛的(relaxed)SPF和DKIM对齐。也许你的电子邮件系统是原始的,你想对其中一个或两个实施严格的(strict)对齐。使用 aspf
标签设置SPF对齐,使用 adkim
设置DKIM对齐。 r
的值表示松弛对齐,而 s
表示严格对齐。松弛对齐是默认设置,不需要声明。
xxxxxxxxxx
v=DMARC1; p=none; rua=mailto:dmarc@ratoperatedvehicle; aspf=s; adkim=s;
上面的示例告诉外部MTA需要严格对齐。要求SPF或DKIM严格对齐几乎总是一个糟糕的决定。
其余的标签提供了部署速度和报告间隔的选项。
pct
标记告诉外部MTA应该过滤域消息的百分比。如果将策略从无切换到隔离,但将 pct
设置为 1
,则外部MTA应将 1%
的违反DMARC的邮件放入垃圾邮件文件夹中。这允许DMARC执法的缓慢推出。
您可以使用 ri
(report interval —— 报告间隔)要求外部MTA以一定的间隔发送违规报告,但许多MTA会忽略这一点,转而使用自己的设置。将其设置为秒数。任何小于3600(一小时)或大于86400(一天)的数值都特别容易被忽略。
虽然该标准定义了其他标签,但它们只有一个合法值,声明它们不会改变任何事情。
DMARC在单个实体向单个实体发送消息的世界中工作得很好。当你转发消息时,一切都会出错。
客户端可以毫无问题地将邮件作为附件转发。转发的消息被包装在具有适当SPF和DKIM标头的新消息中。反弹式转发( Bounce-style),即客户端通过其本地MTA重新发送带有原始标头的邮件,会破坏SPF和DKIM。反弹的消息几乎肯定会违反DMARC政策。隔离或拒绝策略意味着外部MTA将阻止邮件或将其放入垃圾邮件文件夹。
第7章和第9章讨论了对齐和邮件列表的问题。如果您的域部署了仅报告策略,则向邮件列表发送邮件将从接收邮件的每个MTA生成DMARC失败报告。一些邮件列表有数以万计的订阅者。
假设我向一个有五万订阅者的列表发送了一条消息。我的消息有了新的标题,并转发给了所有五万人。如果他们中的十分之一发送DMARC故障报告,我将收到五千份报告。更糟糕的是,这些报告将是不可操作的。我对邮件列表的工作方式无能为力。每次我发布到列表中时,我都会得到它。
DMARC倡导者希望邮件列表改变他们发送消息的方式。许多邮件列表已经这样做了。其他人没有。更改邮件列表以符合DMARC通常意味着降低用户体验或违反用户期望,尤其是在长期列表上。我在几个有30多年历史的邮件列表中,由不同的组织运营,拥有数十万订阅者。其中许多列表发送的邮件都带有 From
标头,该标头使用原始发件人的姓名和电子邮件地址,从而破坏了对齐。订户使用分散在整个互联网历史中的邮件客户端。更改这些列表上的标题会影响每个订阅者。其中一些订阅者是解析和分析消息的软件。一些邮件列表托管在几十年来没有更新的软件上。改变世界电子邮件系统的行为就像用独木舟桨操纵冰山。即使所有的邮件列表软件和客户端配置都可以更新,一些邮件列表运营商也不想与DMARC有任何关系,并积极反对它。
我不会说DMARC是否是“正确”的解决方案。一些组织,包括大部分电子邮件帝国,会检查传入的邮件是否来自具有DMARC记录的域,并将结果用作垃圾邮件评分系统的一部分。
您必须有DMARC记录。你如何处理DMARC记录是可以协商的。
当您向邮件列表发送邮件时,邮件列表软件可以验证邮件的DKIM签名。它甚至可以验证对齐并遵守DMARC政策。但是,邮件列表无法以可验证的方式转发DKIM签名。订阅MTA的用户必须信任邮件列表软件。
DMARC认证接收链(Authenticated Received Chain —— ARC)专门支持邮件列表。ARC让邮件列表声明“我收到此邮件时,此邮件上的DKIM签名很好”,并用自己的签名签署该声明。如果接收MTA接受该签名,则不会为通过该列表接收到的消息发送DMARC失败报告。
ARC的问题在于它没有分配信任的机制。每个MTA运营商必须决定它信任哪些邮件列表。这些决定是由便利性和意识驱动的。如果我知道我的服务器上有很多人订阅了Debian或FreeBSD邮件列表,我可能会信任这些发件人。如果我不知道,我不会的。如果我花时间查看我发送的DMARC报告,我可能会注意到我应该信任的其他人。许多MTA运营商在ARC之前设置了DMARC系统,并且没有更新他们的系统,因此他们发送报告而不管ARC如何。
运行邮件列表超出了本书的范围。你不需要部署ARC。你只需要认识到它的存在。标题 ARC-Message-Signature
(ARC消息签名)、 ARC-Authentication-Results
(ARC身份验证结果)和 ARC-Seal
(ARC印章)都与ARC有关。
结果是:即使使用ARC,每当您的任何用户向这些邮件列表之一发送消息时,您都会收到不可操作的“失败”报告。
如果你不发布DMARC记录,评估你的邮件的垃圾邮件检测系统会说,“我发现你缺少DMARC令人不安。”这增加了你的邮件落入垃圾邮件文件夹的几率。但是,对于报告、邮件列表等,你应该怎么做呢?
如果你真正为自己运行一个邮件系统,并且不使用邮件列表,或者如果你知道你的用户都不会注册邮件列表,你可以安全地部署积极的DMARC策略。从“none”策略的报告模式开始,当你收到的报告说你可以时,增加严格程度。
如果你经常使用邮件列表,你仍然需要一个简单的DMARC记录。在初始报告中搜索怪异之处,并追查系统中任何意外的发件人。一旦你确认一切正常,可以每月检查一次,然后继续使用你的邮件列表。
另一个问题是:你应该发送故障报告吗?故障报告旨在作为一项公共服务。你的报告会为公众服务吗?电子邮件帝国的DMARC报告将超过您可能发送的任何内容。发送DMARC报告会增加服务器发送的电子邮件数量,以及您处理的无法送达邮件数量。如果您经常通信的域提供了由电子邮件帝国维护的报告地址,并且您发送了大量故障报告,那么帝国将您的服务器标记为垃圾邮件发送者的可能性就会增加。如果你的目标和我一样,是让你的MTA在互联网上和平共处,而不会被你无法控制的力量压垮,不要发送DMARC报告。像这样部署一个简单的DMARC记录,继续你的生活。
xxxxxxxxxx
_dmarc.example.com. TXT "v=DMARC1; p=none; rua=mailto:dmarc@example.com;"
使用许多在线DMARC记录测试仪之一来验证世界是否理解你的记录。许多人会抱怨你的“none”政策。忽略这一点。
如果你想发送DMARC报告,请调查OpenDMARC(http://www.trusteddomain.org/opendmarc/)。
我经营多个域名。虽然许多人都有SPF记录,公开宣布对电子邮件保持沉默,但也有一些人确实发送了信息。我希望我所有域的所有DMARC报告都能到达一个中央邮箱。然而,你不能随便把你的报告地址指向任何地方。如果您的DMARC记录列出了除其自身之外的域中的报告地址,则该域必须在DNS中声明同意接收您的报告。记录看起来是这样的:
domain.report.dmarc TXT "v=DMARC1"
此记录声明此域接受DMARC版本1中此域的故障报告。
我的小帝国的所有DMARC报告都去了 dmarc@ratoperatedvehicle.com
。 ratoperatedvehicle.com
的DNS需要每个域都有一个条目,就像 solveamurder.org
的这个条目一样。
xxxxxxxxxx
solveamurder.org._report._dmarc TXT "v=DMARC1"
如果您跳过此步骤,高级垃圾邮件系统将宣布您的DMARC记录无效。
DMARC报告是严格格式化的XML。用眼睛阅读不熟悉的XML很烦人。您可以使用dmarc-cat等工具使单个报告易于解析,但DMARC报告在聚合在一起时最有用。正如您所料,许多人编写了DMARC解析器。许多都是针对大型运营的,需要Grafana或Splunk或整个AWS等工具。
Techsneeze的Dmarcts-report-parser是小型服务器的合理选择。它从IMAP邮箱读取邮件并将其馈送到MariaDB数据库。它有一个配套的PHP脚本dmarcts报告查看器,可以读取数据库并在网页上显示结果。
我们将把报告输入数据库,然后再将数据取出。
在以下位置查找dmarcts报告解析器https://github.com/techsneeze/dmarcts-report-parser 。解析器是一个Perl脚本,旨在通过 cron(8)
或类似程序按计划运行。它使用配置文件和数据库。大多数Unixes都提供套餐。在做任何事情之前,创建数据库并创建一个专用帐户来拥有数据库。
xxxxxxxxxx
$ mysql -u root -p
> create database whinging;
> create user 'c3p0'@'localhost' identified by 'HeadBackwards!';
> grant all privileges on whinging.* to 'c3p0'@'localhost';
> flush privileges;
同时收集DMARC报告帐户的信息。在设置解析器之前,请先验证用户名和密码是否正确。
在 /etc/dmarcts-report-passer.conf 中配置解析器。它从核心行为设置开始。
xxxxxxxxxx
$debug = 0;
$delete_reports = 0;
解析器仅在出现严重问题时才产生输出。如果解析器没有按预期工作,请将 debug
设置为 1
以获得详细输出。您还可以在命令行上启用调试以进行交互式测试。
解析器可以在阅读报告后将其删除,将其留在收件箱中,或将其移动到文件夹中。一旦你知道解析器工作正常,数据将进入数据库,你可能想通过将 delete_reports
设置为 1
来删除电子邮件。现在,把它们留在原地。
现在我们有了数据库设置。
xxxxxxxxxx
$dbtype = 'mysql';
$dbname = 'whinging';
$dbuser = 'c3p0';
$dbpass = 'HeadBackwards!';
$dbhost = 'localhost';
$dbport = '3306';
输入数据库名称、用户名和密码。默认的数据库类型、主机和端口应该是可以的,除非您篡改了数据库服务器。
然后我们就有了帐户登录信息。您的邮件系统提供基于TLS的IMAP,因此请使用它。
xxxxxxxxxx
$imapserver = 'localhost';
$imapuser = 'dmarc@ratoperatedvehicle.com';
$imappass = 'ExposeMyFlaws';
$imapport = '993';
$imapssl = '1';
$imaptls = '0';
$tlsverify = '1';
$imapignoreerror = '0';
IMAP服务器、用户和密码应直接来自DMARC报告帐户。本书中设置的系统只接受通过TLS的IMAP连接,因此将 imapport
设置为993。
imapssl
和 imaptls
选项的名称令人困惑。 imapssl
选项意味着“此主机是否使用TLS专用端口?”我们的服务器使用,因此将其设置为 1
。 imaptls
选项启用机会TLS,或将未加密的连接切换到TLS中游。我们的Dovecot配置无法启用该功能,因此请将其关闭。
tlsverify
选项告诉解析器验证服务器证书。
最后, imapignoreeror
选项是针对特定Microsoft Exchange 2007错误的解决方法。不要启用它。
然后,我们告诉解析器在哪里找到新报告,在哪里存储处理后的报告,以及如何管理不可解析的报告。
xxxxxxxxxx
$imapreadfolder = 'Inbox';
$imapmovefolder = 'processed';
$imapmovefoldererr = 'Inbox.notProcessed';
$maxsize_xml = 50000;
$delete_failed = 0;
imapreadfolder
告诉解析器在哪里可以找到传入的报告。
设置 imapmovefolder
告诉解析器将已处理的报表移动到另一个文件夹。
DMARC报告来自世界各地,由许多不同的软件系统发送。解析器可能会被其中一些阻塞。您的DMARC报告地址是公开的,因此可能会吸引垃圾邮件。如果设置imapmovefoldererr
,解析器无法添加到数据库中的消息将保存在单独的文件夹中。同样, maxsize.xml
选项允许您设置以字节为单位的最大报告大小。如果您的数据库可以接受,您可以增加最大大小。在更改之前,请验证它是否正常工作!
如果要删除无法解析的报告,请将 delete_failed
设置为 1
。
解析器现在应该已经准备好接收邮件了。
在命令行运行解析器以验证其是否正常工作。使用 -i
标志告诉它使用IMAP。它通常以静默方式运行,因此添加 --info
标志以获得一些输出。
xxxxxxxxxx
$ dmarcts-report-parser.pl -i --info
dmarcts-report-parser.pl: Adding missing table <rptrecord> to the database.
dmarcts-report-parser.pl: Adding missing table <report> to the database.
dmarcts-report-parser.pl: Processed 0 emails.
这很好,但很无聊。解析器连接到数据库并添加了缺失的表。它连接到消息存储,没有发现任何电子邮件,但至少电子邮件连接正常。
如果您没有看到这样的内容,并且想要详细的输出,请使用 -d
启用调试。
现在最难的部分是:该账户尚未收到任何DMARC报告。当您确实收到报告时,请再次运行它。
xxxxxxxxxx
$ dmarcts-report-parser.pl -i --info
dmarcts-report-parser.pl: Processed 3 emails.
您可以检查数据库以验证是否输入了报告。此时,您可以使用 dmarcts-report-parser -i
安排它每天运行。一旦有了数据,就可以设置报告查看器。
在以下网址查找dmarcts-report-viewer https://github.com/techsneeze/dmarcts-report-viewer 。与dmarcts-report-parser不同,dmarcts-report-viewer很少打包。您可能需要从git中提取它。
xxxxxxxxxx
# cd /var/www
# git clone https://github.com/techsneeze/dmarcts-report-viewer.git
进入 dmarcts-report-viewer 目录。
查看器包含的内容比解析器多,因为网站需要美观。您需要担心的唯一文件是配置文件 dmarcts-report-viewer-config.php.sample 。将其复制到纯 dmarcts-report-viewer-config.php ,并在那里进行更改。查看器以完全相同的方式使用与解析器相同的配置选项。
xxxxxxxxxx
$dbtype="mysql";
$dbhost="localhost";
$dbname="whinging";
$dbuser="c3p0";
$dbpass="HeadBackwards!";
$dbport="3306";
就是这样。请注意,完全没有任何身份验证设置。观众没有身份验证系统。仅在专用网络上运行它,或在web服务器上添加密码。另一方面,查看器不允许更改数据,让其他系统管理员看到你的失败会让他们对自己的失败感觉更好。
配置您的web服务器以显示目录。这里有一个Apache的例子。
xxxxxxxxxx
<Directory "/var/www/dmarcts-report-viewer/">
Require all granted
</Directory>
Alias /dmarc /var/www/dmarcts-report-viewer
重启你的web服务器。
将您的web浏览器指向 dmarcts-report-viewer.php 脚本。您可以在某处添加重定向,将调用指向脚本中的该目录。您将看到一个显示最新报告的页面,其中包含选择不同月份、报告来源和不同标准的选项。
如果报告没有显示,请像调试任何PHP应用程序一样调试它。
使用这些报告可以识别哪些主机发送的邮件对齐不正确,或者哪些主机是自己发送邮件而不是通过MTA发送邮件。一旦你解决了这些问题,你就可以决定如何处理进一步的报告。
现在你有了DKIM、SPF和DMARC,你可以现实地将测试邮件发送到电子邮件帝国。你在那里的某个地方有一个账户。给自己发封邮件。验证此MTA是否可以验证您的SPF和DKIM,以及它是否识别您的DMARC。看看它是否发送了DMARC报告,或者他们是否按原样接受你的邮件。如果帝国从第一刻就意识到你配置了这些标准,他们不会立即阻止你。他们可能会将您分类到他们的垃圾邮件文件夹中。不过,不要立即将新地址发送给所有联系人。慢慢开始发送邮件。让帝国习惯你的服务器。慢慢开始。
现在让我们来谈谈接收邮件的大问题:阅读和分类。