SPF记录

正如上篇文章所说到的那样,SPF记录某种程度上阻止了邮件的伪造。今天来看一看这到底是怎么回事。

SPF记录,称为Sender Policy Framework,即发件人策略框架。
这个东西本身其实是一条DNS的TXT记录,大概长这个样子:

v=spf1 include:spf1.baidu.com include:spf2.baidu.com include:spf3.baidu.com a mx ptr -all

如果你熟悉Linux, 可以通过dig命令获取某个域名的TXT记录,比如:

ubuntu@instance-20200124-1331:~$ dig baidu.com TXT

; <<>> DiG 9.11.3-1ubuntu1.11-Ubuntu <<>> baidu.com TXT
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 63973
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;baidu.com.			IN	TXT

;; ANSWER SECTION:
baidu.com.		7090	IN	TXT	"google-site-verification=GHb98-6msqyx_qqjGl5eRatD3QTHyVB6-xQ3gJB5UwM"
baidu.com.		7090	IN	TXT	"v=spf1 include:spf1.baidu.com include:spf2.baidu.com include:spf3.baidu.com a mx ptr -all"

;; Query time: 0 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: Wed Mar 18 08:02:26 UTC 2020
;; MSG SIZE  rcvd: 221

大多数知名的域名都会有spf记录,大家可以试着看一看。

spf记录防止邮件伪造的原理就是收信服务器收到邮件以后会去查询发件服务器声称来源域名的spf记录,如果spf记录允许了发件服务器的ip就通过,否则就拒绝。具体一点就是比如 123.123.123.123 发了一封邮件给 example@example.com, 并声称自己是 example@qq.com, 那么 example.com 的服务器收到邮件后就会去查询 qq.com 的spf记录中有没有 123.123.123.123 这个ip地址,如果有的话就通过,没有的话就拒绝。

spf记录的格式大概是这样的:

  • v=spf1是必要的部分必须在开头,代表spf第一版
  • 接下来是不同的mechanism,可以有一个或多个,用空格分隔,分为
    all: 使用方式为all,匹配任何ip
    ip4: 使用方式为ip4:ip4cidr,IPv4CIDR
    ip6: 使用方式为ip6:ip6cidr,IPv6CIDR
    a: 使用方式为a,该域名A记录
    mx: 使用方式为mx,该域名MX记录
    ptr: 这是一个已被淘汰的mechanism,使用方式为ptr或ptr:domain,会进行ptr(rdns)查找判断是否属于对应域名,开销很大
    exists: 使用方式为exists:domain,查找这个域名的A记录,有任何返回即为命中
    include: 使用方式为include:domain,包含另一个域名的MX记录
  • 每个mechanism前面都可以有不同的前缀,前缀包括
    "+" Pass(通过)(默认) 
    "-" Fail(拒绝)
    "~" Soft Fail(软拒绝)
    "?" Neutral(中立)
  • 判断时会从前到后进行判断,直到命中或者是结束,从而得到对应的处理结果
  • 除此之外,spf还有一些modifier,这些modifier每个只能出现一次:
    redirect: 使用方式为redirect=domain,使用规定域名的spf记录代替当前记录
    exp: 使用方式为exp=domain,如果邮件被拒绝则返回额外信息。额外信息由规定域名的TXT记录决定。
  • 最后,就会产生如下结果
    结果 含义 处理方法
    Pass 发件 IP 是合法的 接受来信
    Fail 发件 IP 是非法的 退信
    Soft Fail 发件 IP 非法,但是不采取强硬措施 接受来信,但是做标记
    Neutral SPF 记录中没有关于发件 IP 是否合法的信息 接受来信
    None 服务器没有设定 SPF 记录 接受来信
    PermError 发生了严重错误(例如 SPF 记录语法错误) 没有规定
    TempError 发生了临时错误(例如 DNS 查询失败) 接受或拒绝

总之,由上文可见,如果spf记录被正确设置,攻击者就无法进行邮件的伪造,因为任何伪造的邮件都会因为发件ip不符合spf记录被拒收,这大大减少了邮件伪造的可能性。虽然很多网站当今都设置了spf记录,但是经过短暂的调查,还有很多网站没有设置。比如说中国政府网gov.cn。事实上,即使你不会从这个域名发送任何邮件,设置一个拒绝全部的spf记录v=spf1 -all仍然是有必要的,毕竟这样才可以尽可能减少邮件被伪造的可能。网络上的漏洞可能有很多,但是现代技术已经为我们提供了很多解决或者规避的方法,但最后看得还是人们有没有意识去实施各种安全手段来保证互联网的安全与稳定。

本篇文章部分参考https://www.renfei.org/blog/introduction-to-spf.html,CC-BY-SA 4.0 Intl, 致以诚挚的感谢

点赞
  1. 多米诺说道:
    Google Chrome Windows 10
    学到了,溯洄洄好强啊
  2. YFshadaow说道:
    Google Chrome Windows 10
    明白了

发表评论

电子邮件地址不会被公开。必填项已用 * 标注