邮件防伪造

背景:电子邮件是最古老的互联网协议之一,今天看来有很多漏洞可钻,尤其是伪造邮件的问题,在标准协议中无解。因此 IETF 补充了几个协议 RFC 6376、RFC 7208、RFC 7489 用于邮件防伪。

注意:这些防伪都是发件方保护自己邮件的,因此都需要收件方支持相关功能。

假设发信域是 example.com

DKIM、SPF、DMARC

DKIM

DKIM (DomainKeys Identified Mail) 是对邮件内容的保护,保证邮件内容在传输过程中没有被篡改,原理:

  1. 在发件服务器端设置一个私钥,发邮件时结合邮件内容计算出一个数字签名附在邮件头中,类似这样:“DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;…”
  2. 设置一个 TXT 记录, tag._domainkey.example.com ,内容包含相关的公钥,类似这样: “v=DKIM1; k=rsa; p=MIGfMA…”,tag 在 DKIM-Signature 中声明
  3. 收件服务器收到邮件后根据 邮件内容 + DKIM-Signature 计算出校验值,跟 公钥 进行比对。 如果不符,说明邮件在传输过程中被篡改,不再可信了。

注意:DKIM 并不能防止从非授权服务器发送伪造邮件或“代发”类型的伪造邮件,因为只要邮件头中不声明 DKIM-Signature ,收件方就无从验证邮件是否正确,因此主要是用于防篡改。需要和其他方式结合才能发挥防伪造的作用。

SPF

SPF (Sender Policy Framework) 是对邮件来源的保护,保证邮件是从授权服务器发出,原理:

  1. 针对 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”
  2. 收信服务器解析发信域的 SPF 记录,解析到最终的 IP
  3. 将 IP 列表与所连接的发信服务器 IP 进行比对(因此客户端 IP 不受影响、如果前端存在收信代理则需要特殊处理),符合就放行,不符合则根据 TXT 记录中的声明进行处理

SPF 由于设置简单、通用性强,被广泛使用,正规域名基本上都会设置 SPF 记录。

注意:由于 SPF 是验证 MAIL FROM: 命令中的域名, 会严重影响原件转发、自动转发的邮件,很多运营商并不严格遵守发件域的声明,保护作用被打了折扣。而且无法防范“代发”类型的伪造邮件

DMARC

DMARC (Domain-based Message Authentication, Reporting, and Conformance) 是对 DKIM、SPF 的增强,通过域名记录“强调”应该如何处理问题邮件,原理:

  1. _dmarc.example.com 设置一个 TXT 记录 “v=DMARC1; p=none; pct=100 rua=mailto:mailauth-reports@example.com”
  2. 收件服务器应该根据 _dmarc.example.com 的声明处理违反了 SPF 和 DKIM 的邮件
  3. 常用规则说明:
取值 说明
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 能大大提高防伪造的能力,同时减少对原件转发、自动转发的影响,过程如下:

强调注意事项:

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 才支持。

但设置后是相当好用,在客户端会明确的显示邮件可信:

对于敏感账号,建议还是每年花几百块钱买个证书。

留下评论

您的邮箱地址不会被公开。 必填项已用 * 标注