本文由ZDNS产品研发中心原创 ,未经授权谢绝转载
前言
有多种协议可用于保护电子邮件安全,主流的包括SPF、DKIM 和 DMARC 协议,这三种协议通过保护发件人(电子邮件地址/域名)、发送主机(邮件系统)以及电子邮件消息的真实性来防范网络钓鱼、垃圾邮件、病毒和其他恶意软件。启用这些协议需要修改邮件服务器处理消息的方式(即邮件服务器或服务商需配置或提供相关功能),并向域名的DNS系统中添加相关的解析记录。
这三种协议通常是一起使用的,但也可以在没有 DMARC 的情况下使用 SPF 或 DKIM中的任一个。
SPF协议
什么是SPF协议
当前 Email 通信,仍在使用 SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)协议,正如协议的名字所暗示的,SMTP 实际上是一个非常简单(甚至简陋)的传输协议,本身并没有很好的安全措施。根据 SMTP 的规则,发件人的邮箱地址是可以由发信方任意声明的。在 SMTP 协议制定的时候也许还好,但在垃圾和诈骗邮件横行的今天,这显然是极不安全的。SPF 出现的目的,就是为了防止随意伪造发件人。
SPF(Sender Policy Framework,发送者策略框架)使得 MX(邮件交换)网关能够拒绝来自未经授权服务器的电子邮件消息。通过 DNS 发布有效发送地址的列表。列出的地址通常是终端用户用于其出站消息的SMTP网关,但也可能包括为组织发送营销邮件的外部服务提供商的地址。接收系统可以对照已发布的列表检查入站消息,并拒绝任何来自未列出服务器的消息。
SPF验证原理
SPF 记录实际上是DNS服务器的一个特殊格式的 TXT 记录,验证原理如下所述:
假设邮件服务器收到了一封邮件,来自主机的 IP 是101.226.139.1,并且声称发件人为email@example.cn。为了确认发件人不是伪造的,邮件服务器会去查询example.cn的 SPF 记录。如果该域的 SPF 记录设置允许 IP 为101.226.139.1的主机发送邮件,则服务器就认为这封邮件是合法的;如果不允许,则通常会退信,或将其标记为垃圾/仿冒邮件。
仿冒者虽然可以“声称”他的邮件来自example.cn,但是却无权操作example.cn的 DNS 记录;同时他也无法伪造自己的 IP 地址。因此 SPF 是很有效的,当前基本上所有的邮件服务提供商(例如 Gmail、QQ 邮箱等)都会验证它。
SPF记录语法
SPF记录的格式是在 DNS 中以 TXT 类型的资源记录形式存在的,一条基本的SPF记录通常包含以下几个部分:
v=spf - 版本声明,必须是v=spf1
mechanism - 描述如何检查IP地址的机制
解释 - 可选的,用exp=后跟文本说明
如:v=spf1 a mx ip4:192.0.2.1 ~all
关于v=spf1,这是必须的,这个表示采用 SPF 1 版本,现在SPF的最新版本就是第 1 版。
一条 SPF 记录定义了一个或者多个 mechanism,而 mechanism 则定义了哪些 IP 是允许的,哪些 IP 是拒绝的。mechanism 包括以下几类:
all | ip4 | ip6 | a | mx | ptr | exists | include
每个 mechanism 可以有四种前缀:
"+" Pass(通过)
"-" Fail(拒绝)
"~" Soft Fail(软拒绝)
"?" Neutral(中立)
验证时,将从前往后依次验证每个 mechanism。如果一个 mechanism 包含了要查询的 IP 地址(称为命中),则验证结果由相应 mechanism 的前缀决定。默认的前缀为+。如果验证完所有的 mechanisms 也没有命中,则结果为 Neutral。
除了以上四种情况,还有 None(无结果)、PermError(永久错误)和 TempError(临时错误)三种其他情况。对于这些情况的解释和服务器通常的处理办法如下:
注意,上面所说的服务器处理办法仅仅是 SPF 标准做出的建议,并非所有的邮件服务器都严格遵循这套规定。
各类型 mechanism 说明如下:
all:表示所有 IP,肯定会命中。因此通常把它放在 SPF 记录的结尾,表示处理剩下的所有情况。例如:
"v=spf1 -all" 拒绝所有(表示这个域名不会发出邮件)
"v=spf1 +all" 接受所有(域名所有者认为 SPF 是没有用的,或者根本不在乎它)
ip4:格式为ip4:或者ip4:/,指定一个 IPv4 地址或者地址段。如果prefix-length没有给出,则默认为/32。例如:
"v=spf1 ip4:192.168.0.1/16 -all"
只允许在 192.168.0.1 ~ 192.168.255.255 范围内的 IP
ip6:格式和ip4的很类似,默认的prefix-length是/128。例如:
"v=spf1 ip6:1080::8:800:200C:417A/96 -all"
只允许在 1080::8:800:0000:0000 ~ 1080::8:800:FFFF:FFFF 范围内的 IP
a 和 mx:这俩的格式是相同的,以a为例,格式为以下四种之一:
a
a/
a:
a:/
会命中相应域名的 a 记录(或 mx 记录)中包含的 IP 地址(或地址段)。如果没有提供域名,则使用当前域名。例如:
"v=spf1 mx -all"
- 允许当前域名的 mx 记录对应的 IP 地址。
"v=spf1 mx mx:deferrals.example.com -all"
- 允许当前域名和 deferrals.example.com 的 mx 记录对应的 IP 地址。
"v=spf1 a/24 -all"
- 类似地,这个用法则允许一个地址段。
例如,这是一个比较常见的 SPF 记录,它表示支持当前域名的 a 记录和 mx 记录,同时支持一个给定的 IP 地址;其他地址则拒绝:
v=spf1 a mx ip4:173.194.72.103 -all
Include:格式为include:,表示引入域名下的 SPF 记录。注意,如果该域名下不存在 SPF 记录,则会导致一个PermError结果。例如:
"v=spf1 include:example.com -all" 即采用和 example.com 完全一样的 SPF 记录
exists:格式为exists:。将对执行一个 A 查询,如果有返回结果(无论结果是什么),都会看作命中。
ptr:格式为ptr或者ptr:。使用ptr机制会带来大量很大开销的 DNS 查询,所以连官方都不推荐使用它。
exp:格式为exp=,目的是如果邮件被拒绝,可以给出一个消息。而消息的具体内容会首先对执行 TXT 查询,然后执行宏扩展得到。
邮件服务对SPF的验证流程
SPF:验证“EHLO”/“HELO”和“MAIL FROM”信息(邮件信封):
(可选)检查“EHLO”/“HELO”主机名,以验证关联的 IP 地址是否解析为客户端的 IP 地址,从而确认客户端(发送邮件服务器)的身份与所声称的一致
(强制)检查“MAIL FROM”地址中的发送域,以验证客户端的 IP 地址是否有权从相关域发送邮件,从而确认客户端(发送邮件服务器)有权为发件人发送/转发邮件
如果没有可用的“MAIL FROM”信息(通常用于退回邮件),SPF 将优先使用“EHLO”/“HELO”主机名,而不是发送域
经过上述验证成功后,即可得到一个被验证的邮件信封
验证在邮件管道(在 MX 网关上)中应尽早执行,以便在发生硬故障时,软件可以通过活动 SMTP 连接返回错误消息
如果消息/信封验证失败,则可以立即阻止连接/消息,或者可以在“Received-SPF”和/或“Authentication-Results”标头中转发否定结果的消息
DKIM协议
什么是DKIM
DKIM(DomainKeys Identified Mail,域密钥识别邮件),是一种电子邮件验证系统,旨在帮助接收邮件服务器确定某个电子邮件是否真的由声称拥有其发件人地址的域所授权并发送。
邮件发送方发送邮件时,利用本域私钥加密邮件生成DKIM签名,将DKIM签名及其相关信息插入邮件头。邮件接收方接收邮件时,通过DNS查询获得公钥,验证邮件DKIM签名的有效性。从而确认在邮件发送的过程中,防止邮件被恶意篡改,保证邮件内容的完整性。
DKIM验证原理
密钥生成与存储:发送域首先生成一对公钥和私钥。私钥保留在邮件服务器上,并用于签署即将发出的邮件。公钥则作为DKIM记录存储在发送域的DNS记录中,通常是以TXT类型的DNS记录形式存在。
邮件签署:当邮件从授权的服务器发出时,邮件服务器会使用私钥对邮件的部分或全部内容(通常是邮件头和主体的一部分)进行加密签名。这个签名被添加到邮件头部的DKIM-Signature字段中,包含了一系列标识符(比如d=域名、s=选择器、bh=散列摘要、b=签名数据等)。
邮件验证:当邮件到达接收方邮件服务器时,服务器会提取DKIM-Signature头信息,并查找与邮件中标识的域名和选择器相对应的DKIM记录。接收方邮件服务器从DNS中获取到相应的公钥后,使用该公钥对邮件签名进行解密验证。
如果数字签名验证通过,则表明邮件内容在传输过程中未被篡改,并且邮件的确是从声称的域名授权的服务器发送的。
DKIM记录语法
DKIM记录的格式是在 DNS 中以 TXT 类型的资源记录形式存在的,它包含了公开可用的DKIM公钥和其他相关参数,以便邮件接收服务器能够验证发送自特定域名的电子邮件的真实性。DKIM记录的核心组成部分包括以下几个部分:
selector._domainkey.domain.tld. TTL IN TXT "v=DKIM1; k=rsa; p=base64_public_key"
selector:这是一个可自定义的选择器,用于区分同一域名下可能有的多个DKIM密钥对。选择器通常代表一个特定的邮件服务器或服务,使得同一个域名下的不同邮件流可以用不同的DKIM密钥进行签名。selector需要配置到邮件系统上,不同品牌的邮件系统配置方法不同。
_domainkey:这是一个固定的子域名前缀,用来标识这是一个DKIM相关的DNS记录。
domain.tld:指的是要验证的域名,即邮件声称的发件人地址所属的域名。例如,如果发件人为test@example.cn,那么这里将是example.cn。
“v=DKIM1;k=rsa;
p=base64_public_key”:这是一个字符串值,其中包含了DKIM记录的具体参数:
t=:签名时间戳选项。
s=:服务类型选项,用于限定签名的应用范围。
h=:签名头列表,列出哪些邮件头会被纳入签名计算中。
g=:公钥管理规范(GUA)选项,指向另一个URI,可用于更新公钥信息。
此外,DKIM TXT记录还可能包含其他参数,如:
"v=spf1 mx -all"
- 允许当前域名的 mx 记录对应的 IP 地址。
"v=spf1 mx mx:deferrals.example.com -all"
- 允许当前域名和 deferrals.example.com 的 mx 记录对应的 IP 地址。
"v=spf1 a/24 -all"
- 类似地,这个用法则允许一个地址段。
邮件服务对DKIM的验证流程
DKIM:对发出的邮件及其标题进行签名,并验证收到的邮件上的签名
使用标头中指定的签名域中发布的公钥,检查邮件随附的数字签名的有效性(在“DKIM-Signature”标头中)
由于签名域不一定是“MAIL FROM”或“From”标头中指定的发送域,因此 DKIM 首先确认的是签名域(即在邮件中声明的负责签名的域名)确实是该邮件的发起者之一
出站邮件在发送邮件管道(基础设施的最后一跳)中尽可能晚地进行签名,以便签名尽可能多地覆盖标头;传入邮件上的签名在接收管道(基础设施的第一跳)中尽可能早地进行验证,以便添加或修改标头对验证过程的影响尽可能小
DKIM本身并不阻止消息,验证结果会被添加到消息的‘Authentication-Results’头部中,并且可能会反映在垃圾邮件过滤分数或DMARC评估中。
DMARC协议
什么是DMARC
DMARC(Domain-based Message Authentication, Reporting and Conformance,基于域名的消息认证、报告与一致性)是对其他两种邮件安全标准DKIM和SPF的补充,旨在解决域名冒充问题,特别是防范那些企图伪装成某个组织或个人进行电子邮件欺诈的行为。
DMARC基于已经广泛部署的SPF和DKIM两种邮件身份验证协议,通过增加域名对齐检查和提供详细的报告机制,强化了电子邮件安全和防止钓鱼攻击的能力。
这一协议是通过DNS发布的。它也可能包含一个邮件地址,邮件系统可以通过该地址报告被拒绝的消息。这样一来,邮件域名的操作者就可以监控真实和伪造邮件的投递情况。
目前也有各种开源工具可用于处理和分析DMARC报告,比如parcedmarc、TA-dmarc等。
DMARC验证原理
DMARC要求SPF和DKIM验证结果与邮件信头中的发信域(即用户直观看到的发信人域名)一致。也就是说,如果邮件信头声称来自example.cn,则SPF和DKIM验证也必须与example.cn保持一致。
DMARC允许域名管理员定义政策,决定邮件服务器在邮件无法通过DMARC验证时应该如何处理,比如“none”(不做任何动作,仅报告)、“quarantine”(隔离邮件,例如放入垃圾邮件文件夹)或“reject”(直接拒收邮件)。
DMARC提供了一个标准化的反馈机制,让邮件接收方能够定期向域名管理员发送关于DMARC检查结果的报告。这些报告可以帮助管理员了解其域名下邮件的发送情况,及时发现并阻止未经授权的邮件发送行为。
DMARC语法
DMARC记录的格式是在 DNS 中以 TXT 类型的资源记录形式存在的,DMARC记录的核心组成部分包括以下几个部分:
_dmarc.domain.tld. IN TXT "v=DMARC1; p=reject; pct=100; rua=mailto:dmarcreports@domain.tld; ruf=mailto:abuse@domain.tld;"
这个记录中包含了DMARC策略及其参数:
_dmarc:固定的域名前缀,表示这条TXT类型的记录是用于dmarc检查。
v=DMARC1:表示DMARC版本为1。
p:表示对不符合策略的邮件采取的策略。
rua=mailto:dmarcreports@domain.tld 设置了授权收件人邮箱地址,用于接收汇总政策执行报告。
ruf=mailto:abuse@domain.tld 设置了故障报告的接收邮箱地址,用于接收详尽的错误分析报告。
注意:管理员在首次实施DMARC时,通常会先设置为“监控”模式(policy of “none”),收集一段时间的报告,了解正常邮件和潜在欺诈邮件的情况,之后逐步加强策略至“隔离”或“拒绝”。
邮件服务对DMARC的验证流程
DMARC:根据发送域在“From”标头中发布的策略处理 SPF 和/或 DKIM 验证的结果
检查“From”标头中的发送域是否与信封中的发送域(对于 SPF)和签名域(对于 DKIM)匹配;这种一致性检查将通过SPF/DKIM验证的发件人域名与'From'字段中的信息(即显示名称)联系起来。
在“From”标头中指定的发件人域名所发布的策略用于决定如果SPF和DKIM验证结果(包括一致性结果)为负面(例如,验证失败),则如何处理传入的邮件消息:允许、阻止或隔离。
如果策略中有要求,则汇总报告和失败报告将发送给发件人域名的运营商;报告信息是标准化的,以便可以进行自动化处理。
如何保护无邮件域名
管理员可通过以下测试工具验证相关的邮件安全配置:
mail-tester:
https://www.mail-tester.com/
DMARC Checker:
https://dmarcchecker.app/
如何保护无邮件域名
在过去,没有办法明确地指示一个域没有邮件服务。发送给这样一个域的邮件发送者必须首先请求MX记录,如果没有找到MX记录,则会回退到查询A/AAAA记录。发送者必须确定(web)服务器没有入站邮件端口(如25端口上的SMTP)才能推断出——在多次无效查询和相当长的延迟之后——该域实际上没有邮件服务。
然而,RFC 7505 引入了一种使用 DNS 明确指示一个域没有邮件服务的方法:Null MX 记录。Null MX 记录格式如下(注意末尾的点):
example.cn IN MX 0 .
由于这一概念相对较新(RFC是在2015年发布的),许多没有邮件服务的域还没有设置Null MX记录。(截至2024年4月,大约有5万个.nl域已经设置了这样的记录。)出于效率和安全性的考虑,建议邮箱或DNS管理员为那些还没有设置Null MX记录的无邮件服务域添加这些记录。
此外,管理员还应该发布一个相应的SPF记录,在该记录中不授权任何服务器为该域发送邮件。一个典型的SPF记录配置可能看起来像这样:
example.cn IN TXT“v=spf1 -all”
为了进一步增强安全性,除了配置Null MX记录和SPF记录之外,管理员还应该设置一个带有'reject'选项的DMARC记录,并指定一个RUA(Report URI)地址,以便接收关于不符合DMARC策略的消息报告。这里是一个示例DMARC记录,它包含了'reject'选项以及一个报告URI地址:
_dmarc.example.cn IN TXT "v=DMARC1; p=reject; sp=reject; adkim=s; aspf=s; rua=mailto:dmarc-reports@admin.cn;"
最后,被指定的DMARC报告接收者必须首先在其自己的域中发布一个DMARC授权记录,以允许接收这些消息。
example.cn._report._dmarc.admin.cn IN TXT "v=DMARC1;"
注:RFC 7505:
https://www.rfc-editor.org/rfc/rfc7505.html
扫描二维码 | 了解更多
往期推荐 ·