概览
SMTP 协议是简单的邮件传输协议,目前邮件还是使用这个协议通信,但是它本身并没有很好的安全措施。SMTP 协议本身没有机制鉴别寄件人的真正身份,电子邮件的 “寄件者” 一栏可以填上任何名字,于是伪冒他人身份来网络钓鱼或寄出垃圾邮件便相当容易,而真正来源却不易追查。
MX 记录用于指定负责处理发往收件人域名的邮件服务器。MX 记录允许设置一个优先级,当多个邮件服务器可用时,会根据该值决定投递邮件的服务器(值越小优先级越高)。SMTP 会根据 MX 记录的值来决定邮件的路由过程。
SPF 记录的全称为 Sender Policy Framework,中文译作 “发件人策略框架”,它是一套电子邮件认证机制,可以确认电子邮件确实是由网域授权的邮件服务器寄出,防止有人伪冒身份网络钓鱼或寄出垃圾电邮。SPF 允许管理员设定一个 DNS TXT 记录或 SPF 记录设定发送邮件服务器的 IP 范围,如有任何邮件并非从上述指明授权的 IP 地址寄出,则很可能该邮件并非确实由真正的寄件者寄出。
SPF 和 DKIM 相互配合,可以告诉接收服务器允许和拒绝哪些电子邮件;DMARC 告诉它如何处理未通过身份验证的电子邮件;除此之外,DMARC 记录还会向 DMARC 记录中指定的电子邮件地址发送报告,其中包含域收到的电子邮件的数据。
通过规范和有效的方法设置邮件 SPF、DKIM、DMARC 参数,以阻止他人伪造发件人、冒充邮件地址和邮件内容被篡改等问题。
测试邮件安全分数值
发件人身份识别技术
https://www.microsoft.com/mscorp/safety/content/technologies/senderid/wizard/
SPF
防止伪造实际发件人
SPF 是指 Sender Policy Framework 的缩写,中文译作 “发信者策略框架”,是为了防范垃圾邮件而提出来的一种 DNS 记录类型,SPF 是一种 TXT 类型的记录。
SPF 是跟 DNS 相关的一项技术,它的内容写在 DNS 的 txt 类型的记录里面。mx 记录的作用是给寄信者指明某个域名的邮件服务器有哪些。SPF 的作用跟 mx 相反,它向收信者表明,哪些邮件服务器是经过某个域名认可会发送邮件的。 由定义可以看出,SPF 的作用主要是反垃圾邮件,主要针对那些发信人伪造域名的垃圾邮件。
SPF 记录的本质,是向收件人宣告:本域名的邮件从清单上所列 IP 发出的都是合法邮件。
查询验证方法
Windows
nslookup -type=txt dkim._domainkey.example.com
Linux
dig -t txt dkim._domainkey.example.com
基本验证示例
qq.com 宣告:spf.mail.qq.com 是合法的,其他不合法。
nslookup -type=txt qq.com
服务器: 10.0.16.1
Address: 10.0.16.4
非权威应答:
qq.com text =
"v=spf1 include:spf.mail.qq.com -all"
spf.mail.qq.com 宣告:qq-a.mail.qq.com、qq-b.mail.qq.com 等域名地址清单是合法的,其他不合法。
nslookup -type=txt spf.mail.qq.com
服务器: 10.0.16.1
Address: 10.0.16.4
非权威应答:
spf.mail.qq.com text =
"v=spf1 include:qq-a.mail.qq.com include:qq-b.mail.qq.com include:qq-c.mail.qq.com include:biz-a.mail.qq.com include:biz-b.mail.qq.com include:biz-c.mail.qq.com include:biz-d.mail.qq.com -all"
spf.mail.tencent.com 宣告:ip4:183.57.53.109 ip4:59.37.107.16 等 IP 地址清单是合法的,其他不合法。
nslookup -type=txt spf.mail.tencent.com
服务器: 10.0.16.1
Address: 10.0.16.4
非权威应答:
spf.mail.tencent.com text =
"v=spf1 ip4:183.57.53.109 ip4:59.37.107.16 ip4:220.249.245.26 ip4:203.205.248.43 ip4:203.205.248.63 ip4:123.151.155.118 ip4:123.151.155.119 ip4:14.18.183.58 ip4:14.18.178.29 ip4:61.241.47.121 a -all"
v=spf1 匹配类型
- all 匹配任何主机,它写在 SPF 记录最后以匹配在其前面所列出的主机
- ip4 匹配 IPv4 地址或网络范围
- ip6 匹配 IPv6 地址或网络范围
- a 匹配主机名或域名
- mx 匹配域名的 MX 记录,当出站与入站邮件为同一服务器时通常采用此种机制
- ptr 通过 DNS 反向记录来匹配发件人 IP 和域名,由于会增加 DNS 负载,一般不采用此种机制
- exists 只检查域是否在 DNS 中存在
- include 将发件人 IP 和 SPF 记录指向另一个域,这种匹配机制通常用于云服务,如 Exchange Online Protection
v=spf1 all 类型的匹配规则
- "v=spf1 -all"(拒绝所有,表示这个域名不会发出邮件)
- "v=spf1 +all"(接受所有)
- "v=spf1 ip4:192.168.0.1/16 -all"(只允许 192.168.0.1/16 范围内的 IP 发送邮件)
- "v=spf1 mx -all"(允许当前域名的 mx 记录对应的 IP 地址发送邮件)
- "v=spf1 mx mx:test.example.com -all"(允许当前域名和 test.example.com 的 mx 记录对应的 IP 地址发送邮件)
- "v=spf1 a mx ip4:173.194.72.103 -all"(允许当前域名的 a 记录和 mx 记录和一个给定的 IP 地址发送邮件)
- "v=spf1 include:example.com -all"(采用和 example.com 一样的 SPF 记录)
v=spf1 all 类型的常见限定词
- + 放行,如果没有明确指定限定词,则为默认值
- - 硬拒绝,直接拒绝来自未经授权主机的邮件
- ~ 软拒绝,邮件可被接受,也可被标记为垃圾邮件
- ? 中性,不考虑邮件是否被接受
v=spf1 all 类型的 {? 中性}、{~ 软拒绝}、{- 硬拒绝}
-
SPF neutral 解释 @ ? 中性
SPF neutral 意味着域名上的 SPF 记录并不对 IP 地址是否被允许下断言。一般来说,这可以通过在 SPF 记录的末尾添加 ?allmechanism 来实现。当该 mechanism 被估值时,所有的 IP 地址都会使 SPF 返回 neutral 结果。
根据邮件服务器上面的 DMARC 设置,SPF neutral 可以在 DMARC 中被解释为 pass 或者 fail(!)。这通常由 DMARC 设置中的一个标志位来确定,并且不同的 DMARC 包情况也不一样。在由 Trusted Domain 发布的 OpenDMARC 中,SPF neutral 缺省被 DMARC 解释成 fail。 -
SPF softfail 解释 @ ~ 软拒绝
SPF softfail 是一个弱宣称,意思是连接主机 IP 很可能不被允许。域名并没有发布一个更强更确定的策略,使得结果为 “fail”。这可以通过在 SPF 记录的末尾添加 ~allmechanism 来实现。当该 mechanism 被估值时,所有的 IP 地址都会使 SPF 返回 softfail 结果。
像 neutral 一样,根据您在邮件服务器上面的 DMARC 设置情况,SPF softfail 可以在 DMARC 中被解释为 pass 或者 fail。在 OpenDMARC 中,SPF softfail 缺省被 DMARC 解释成 fail。 -
SPF fail @ - 硬拒绝
SPF fail,也被称为 SPF hardfail,显式地宣称连接主机不被允许使用该域名来发送邮件。这可以通过在 SPF 记录的末尾添加 -allmechanism 来实现。当该 mechanism 被估值时,所有的 IP 地址都会使 SPF 返回 fail 结果。
在硬拒绝情况下,电子邮件将被完全丢弃。软拒绝可能允许将电子邮件传送到收件人的垃圾文件夹,通常建议使用~all
(软拒绝)。
检测工具
- https://labs.hexingxing.cn/ns
- https://www.mail-tester.com/spf-dkim-check
DKIM
防止邮件信息和内容被篡改
DKIM 是 DomainKeys Identified Mail 的缩写,中文译作 “域名密钥识别邮件”。这是一套电子邮件认证机制,使用公开密钥加密的基础提供了数字签名与身份验证的功能,以检测寄件者、主旨、内文、附件等部分有否被伪冒或窜改。一般来说,发送方会在电子邮件的标头插入 DKIM-Signature 及电子签名信息。而接收方则通过 DNS 查询得到公开密钥后进行验证。
DKIM 技术通过在每封电子邮件上增加加密标志,收件服务通过非对称加密算法解密并比较加密的 hash,判断邮件伪造。
DKIM 的基本工作原理是基于密钥认证方式,他会产生 1 组钥匙,公钥 (public key) 和私钥 (private key)。公钥将发布在 DNS 中,私钥会存放在寄信服务器中。发件时,发送方会在电子邮件的标头插入 DKIM-Signature 及电子签名信息,详见下方 DKIM 签名示例[1]。
收件人邮件服务器收到邮件后,会通过 DNS 获得 DKIM 公钥,利用公钥解密邮件头中的 DKIM 信息中的哈希值,收件服务器再计算收到邮件的哈希值,两者进行比较,如果一致则证明邮件合法,则传递邮件;否则为不合法,则判定为垃圾邮件, 由于数字签名是无法仿造的,因此这项技术对于垃圾邮件效果极好。
DKIM 记录命令
Windows
nslookup -type=txt dkim._domainkey.example.com
Linux
dig -t txt dkim._domainkey.example.com
配置
DKIM 记录存储了 DKIM 公钥,这是一串随机字符,用于验证使用私钥签署的任何内容。电子邮件服务器查询域名的 DNS 记录,以查看 DKIM 记录和其中的公钥。
DKIM 记录实际上是一种 DNS TXT(“文本”)记录。TXT 记录可用于存储域名管理员想要与其域名相关联的任何文本。DKIM 就是该类型 DNS 记录的许多用途之一。(在某些情况下,域名将其 DKIM 记录存储为反而指向密钥的 CNAME 记录;但是,官方 RFC 要求这些记录是 TXT。)
DKIM DNS TXT 记录示例
名称 | 在提示下键入 | 内容 | TTL |
---|---|---|---|
big-email._domainkey.example.com | TXT | v=DKIM1; p=76E629F05F70 9EF665853333 EEC3F5ADE69A 2362BECE4065 8267AB2FC3CB 6CBE |
6000 |
名称
DKIM 记录名称遵循以下格式:
DKIM 与大多数 DNS TXT 记录不同,DKIM 记录被存储在一个专门的名称下,而不仅仅是域名的名称。
[selector]._domainkey.[domain]
selector 是由域名使用的电子邮件服务提供商发布的专门值。它包含在 DKIM 标头中,使电子邮件服务器能够在 DNS 中执行所需的 DKIM 查找。domain 是电子邮件域名。._domainkey. 包含在所有 DKIM 记录名称中。
为了查询 DKIM 记录,电子邮件服务器使用电子邮件服务提供商提供的 DKIM 选择器,而不仅仅是域名。假设 example.com 使用 Big Email 作为他们的电子邮件服务提供商,并且假设 Big Email 使用 DKIM 选择器 big-email。example.com 的大部分 DNS 记录将被命名为 example.com,但他们的 DKIM DNS 记录名称将为 big-email._domainkey.example.com,这已在上面的示例中列出。
内容
这是列出公钥的 DKIM DNS 记录的部分。在上面的示例中,v=DKIM1
表示这个 TXT 记录应当被解释为 DKIM,公钥则是 p=
之后的内容。
DKIM 签名示例 [1]
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qq.com; s=s201512;
t=1681455054; bh=+OpAr9z698J7gT6eJ0m5oCGtVXnmTUTGEBrCqfaw4Pc=;
h=From:To:Cc:Subject:Date;
b=W5REIX5hoYQzNg8ltQj8RlA8AZjC59Bbz62hvqPZqyyiI1eQ4+H7/vV+IXqsoHkXj
XLmjofsxVnsaJZt28Uk5r7PcnBMnYszniBdEfFZ9pQ5zmCcIpHfw+Uj+c+IMLiNIvR
yvTs32WtsCA5H89zIky6Q3uq/3DFafPCnL8jN32A=
- v= 显示正在使用哪个版本的 DKIM。
- d= 是发件人的域名。
- s= 是选择器,接收服务器应使用它来查找 DNS 记录。
- h= 列出了用于创建数字签名 (b) 的标头字段。在本示例中,使用的是发件人、收件人和主题标头。如果 Bob 使用 example.com 域名向 Alice 发送电子邮件,主题行是 “Recipe for cheesecake”,这里使用的内容将是 “bob@example.com” +“alice@example.com” +“Recipe for cheesecake” 。(该内容也将规范化,即形成标准化的格式。)
- bh= 是电子邮件正文的哈希值。哈希值是一个专门的数学函数的结果,称为哈希函数。包含该值是为了使接收电子邮件的服务器能够在整个电子邮件正文加载之前计算签名,因为电子邮件正文可能是任何长度,在某些情况下加载可能需要很长的时间。
- a= 是用于计算数字签名 (b) 以及生成电子邮件正文哈希值 (bh) 的算法。在这个示例中,使用的是 RSA-SHA-256(RSA 使用 SHA-256 作为数字签名的哈希函数,并使用 SHA-256 用于正文哈希)。
- b= 是数字签名,由 h 和 bh 产生,并使用私钥签名。
检测工具
- https://www.mail-tester.com/spf-dkim-check
- https://dmarcly.com/tools/dkim-record-checker
DMARC
防止冒充显示地址和绕过 SPF 记录
DMARC 是 Domain-based Message Authentication, Reporting and Conformance 的缩写,中文译作 “基于域的消息认证,报告和一致性”。
DMARC 的目的是给电子邮件域名所有者保护他们的域名的能力,SPF 和 DKIM 缺少反馈机制, 这两个协议未定义如何处理"仿冒邮件"。DMARC 的主要用途在于设置 “处理策略”, 当收件服务接收到来自某个域未通过身份验证的邮件时,应执行的 dmarc 规定的处理机制。
基本验证示例
nslookup -type=txt _dmarc.mail.bytedance.net
服务器: 10.0.16.1
Address: 10.0.16.4
非权威应答:
_dmarc.mail.bytedance.net text =
"v=DMARC1;p=none;ruf=mailto:dmarc@bytedance.com;rua=mailto:dmarc_report@bytedance.com"
以上示例中,域名拥有者通过 DNS 发布 DMARC 策略,当收件者收到 “仿冒邮件时” 执行以下策略:
p
用于告知收件方,当检测到某邮件存在伪造我(发件人)的情况,收件方要做出什么处理,处理方式从轻到重依次为:none 为不作任何处理;quarantine 为将邮件标记为垃圾邮件;reject 为拒绝该邮件。初期建议设置为 none。
sp
DMARC 记录对子域名生效,同时声明子域名在有被伪造时,收件方须做出的处理方式。
rua
用于在收件方检测后,将一段时间的汇总报告,发送到哪个邮箱地址。
ruf
用于当检测到伪造邮件时,收件方须将该伪造信息的报告发送到哪个邮箱地址。
检测工具
- https://labs.hexingxing.cn/ns
- https://dmarcian.com/dmarc-inspector
- https://dmarcly.com/tools/dmarc-checker
0 条评论