背景:电子邮件是最古老的互联网协议之一,今天看来有很多漏洞可钻,尤其是伪造邮件的问题,在标准协议中无解。因此 IETF 补充了几个协议 RFC 6376、RFC 7208、RFC 7489 用于邮件防伪。
注意:这些防伪都是发件方保护自己邮件的,因此都需要收件方支持相关功能。
假设发信域是 example.com
DKIM、SPF、DMARC
DKIM
DKIM (DomainKeys Identified Mail) 是对邮件内容的保护,保证邮件内容在传输过程中没有被篡改,原理:
- 在发件服务器端设置一个私钥,发邮件时结合邮件内容计算出一个数字签名附在邮件头中,类似这样:“DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;…”
- 设置一个 TXT 记录, tag._domainkey.example.com ,内容包含相关的公钥,类似这样: “v=DKIM1; k=rsa; p=MIGfMA…”,tag 在 DKIM-Signature 中声明
- 收件服务器收到邮件后根据 邮件内容 + DKIM-Signature 计算出校验值,跟 公钥 进行比对。 如果不符,说明邮件在传输过程中被篡改,不再可信了。
注意:DKIM 并不能防止从非授权服务器发送伪造邮件或“代发”类型的伪造邮件,因为只要邮件头中不声明 DKIM-Signature ,收件方就无从验证邮件是否正确,因此主要是用于防篡改。需要和其他方式结合才能发挥防伪造的作用。
SPF
SPF (Sender Policy Framework) 是对邮件来源的保护,保证邮件是从授权服务器发出,原理:
- 针对 example.com 设置一个 TXT 记录,内容是允许发信的服务器,类似这样:”v=spf1 include:spf.icoremail.net a:coremail.cn ip4:1.2.3.4 ip6:1:2:3:4:5:6:7:8 -all”
- 收信服务器解析发信域的 SPF 记录,解析到最终的 IP
- 将 IP 列表与所连接的发信服务器 IP 进行比对(因此客户端 IP 不受影响、如果前端存在收信代理则需要特殊处理),符合就放行,不符合则根据 TXT 记录中的声明进行处理
SPF 由于设置简单、通用性强,被广泛使用,正规域名基本上都会设置 SPF 记录。
注意:由于 SPF 是验证 MAIL FROM: 命令中的域名, 会严重影响原件转发、自动转发的邮件,很多运营商并不严格遵守发件域的声明,保护作用被打了折扣。而且无法防范“代发”类型的伪造邮件
DMARC
DMARC (Domain-based Message Authentication, Reporting, and Conformance) 是对 DKIM、SPF 的增强,通过域名记录“强调”应该如何处理问题邮件,原理:
- _dmarc.example.com 设置一个 TXT 记录 “v=DMARC1; p=none; pct=100 rua=mailto:mailauth-reports@example.com”
- 收件服务器应该根据 _dmarc.example.com 的声明处理违反了 SPF 和 DKIM 的邮件
- 常用规则说明:
项 | 取值 | 说明 |
p | none / quarantine / reject | 不操作 / 隔离 / 拒绝 |
pct | 0-100 | 应用规则的比例,允许放行一部分邮件。例如设置为 60,则60%的邮件会被应用 DMARC 规则(可选) |
rua | 链接 | 邮件报告,收件服务器应该每天生成一个报告给 rua 声明的地址(可选) |
adkim | r / s | 是否严格遵守 DKIM 声明, 宽松 / 严格 (默认宽松) |
aspf | r / s | 是否严格遵守 SPF 声明, 宽松 / 严格 (默认宽松) |
DMARC 功能较复杂,是对 SPF、DKIM 的“强调”,应用范围较少。
不过 DMARC 是使用邮件头中 From: 字段的域名进行验证,因此能够阻止“代发”类型的邮件。
完整设置 DKIM + SPF + DMARC 能大大提高防伪造的能力,同时减少对原件转发、自动转发的影响,过程如下:
1 2 3 4 5 |
1. 伪造邮件,SPF 记录不符 a. 收件服务器遵守声明,拒信 b. 收件服务器未遵守声明但支持 DMARC ,DMARC 验证不通过,拒信 2. 代发邮件,SPF 记录正确,DMARC 校验发现 From: 字段域名的 SPF 不符,且不存在 DKIM 记录,拒信 3. 自动转发邮件,SPF 记录不符,但 DKIM 校验正确,放行 |
强调注意事项:
DKIM 并不能防止从 非授权服务器 发送的或“代发”类型的伪造邮件
SPF 由于影响了转发,导致很多运营商并没有严格遵守,保护作用略差,也不能防止“代发”类型
DMARC 一定要配合 DKIM 和 SPF,至少其中一个,最好是两个都配置
最后,DKIM + SPF + DMARC 并不是强制的,也比较新,因此并不是设置了就高枕无忧。到底能不能防住伪造邮件还要看收件服务器是否支持。
- 大多数负责任的运营商是支持了,但并不是全部。
- 企业自建的邮件服务器更是依赖管理员的水平。
终极解决方案 S/MIME:
S/MIME(Secure Multipurpose Internet Mail Extensions / 安全的多用途Internet邮件扩展) 是通过 CA 签发证书 => 客户端安装证书并对邮件进行签名 这种方式声明邮件的真实性,是终极解决方案。
缺点也很严重,最大的缺点是要钱,需要向 CA 购买证书。
其次要将证书安装在客户端(当前只有 Google 的 G suite 企业版支持证书托管)、使用客户端发信才能正常签名。
也只有国外较专业的客户端如 Outlook、Thunderbird、Mail.app 才支持。
但设置后是相当好用,在客户端会明确的显示邮件可信:
对于敏感账号,建议还是每年花几百块钱买个证书。