今天翻看邮箱,偶然看到之前课程助教让我们做作业时使用S/MIME签名和加密的邮件,然后想起邮件系统的设计似乎可以轻松伪造Sender这一问题,结果就看到一个叫SPF的东西,遂把它配置到自己的域名邮箱上,记录一下。
何为SPF
发件人策略框架(英语:Sender Policy Framework;简称SPF; RFC 4408)是一套电子邮件认证机制,可以确认电子邮件确实是由网域授权的邮件服务器寄出,防止有人伪冒身份网络钓鱼或寄出垃圾电邮。SPF允许管理员设定一个DNS TXT记录或SPF记录设定发送邮件服务器的IP范围,如有任何邮件并非从上述指明授权的IP地址寄出,则很可能该邮件并非确实由真正的寄件者寄出(邮件上声称的“寄件者”为假冒)
From:Wikipedia-发件人策略框架
简单来说,就是发送方可以在自己域名的TXT字段上配置一些允许的ip地址范围,只有在这些ip地址发出的邮件才被认为是真实的。如果其它ip的主机以这个域名下的邮箱身份发出邮件,接收者可以认为邮件是假冒的。
(算是又一个基于DNS来保证安全的例子了)
拿我们常用的gmail为例,查询google.com
的TXT记录,其中一个结果就是SPF配置:
google.com. 19 IN TXT "v=spf1 include:_spf.google.com ~all"
qq邮箱和163邮箱也是类似:
qq.com. 97 IN TXT "v=spf1 include:spf.mail.qq.com -all"
163.com. 10295 IN TXT "v=spf1 include:spf.163.com -all"
这三个邮箱都没有直接列出允许的ip范围,而是使用了include:<domain>
的形式来表示引入<domain>
这个域名下的SPF记录(用法有点像CNAME那样)。
关于spf的更多语法,建议阅读这篇文章。
如何配置
本人的域名邮箱接的是腾讯企业邮,其网站上其实有介绍该怎么配置。
具体来说,只要为你邮箱中的域名加上下面这样一条TXT记录就行了:
v=spf1 include:spf.mail.qq.com ~all
最后效果是:
imlk.top. 300 IN TXT "v=spf1 include:spf.mail.qq.com ~all"
对于自建邮箱服务器的情况,按规则自己写一条包含ip的spf就行了。
补充
DKIM
DKIM是一种防止邮件内容被恶意篡改的方法,发件服务器使用私钥为邮件进行签名,而接收方通过dns查询到发件方域名对应的公钥信息,验证签名的完整性。
可惜的是腾讯企业邮箱似乎无法开启DKIM,默认发出去的邮件中也未找到DKIM-Signature
字段。
DMARC
如果说SPF和DKIM定义了如何防止被别人假冒身份发送邮件,那么DMARC则定义了接收者收到假冒邮件后应该怎么处理。
给域名下的_dmarc
子域加一条TXT记录v=DMARC1; p=none; rua=mailto:[email protected]
,具体细节可以直接参考腾讯企业邮箱。
测试SPF
这个网站可以直接测试SPF:
具体来说,它会随机生成一个邮箱,然后让你用配置好spf的邮箱给它发邮件,然后会出一份报告。
看起来配置没有问题。
接着我们使用swaks从本机直接发送一封伪装身份的邮件:
swaks --to [email protected] --from [email protected] --body 'This is a spoof email' --header 'Subject: Spoof Email' --ehlo imlk.top --header-X-Mailer imlk.top
结果SPF检测报告SoftFail
并且DMARC也报告了fail
如果向Gmail发送伪装身份的文件,则会报告错误: