一封小小邮件背后的防范策略

Posted by 陈树义 on 2022-01-25

邮件这种通讯方式在国内不是很常用,一般情况下我们都在找工作时用来收 offer。但邮件在国外却是一种很重要的通讯方式,许多外国人习惯于使用邮件进行工作沟通。对于做跨境电商的公司来说,邮件营销更是一个非常重要的营销方式。

相信做过邮件发送相关功能的朋友都知道,我们可以使用 Java 程序发送邮件,并且可以任意填写收件人的名称,例如我可以把发件人写成 service@qq.com 以此来假冒企鹅公司的客服,从而发送一些诈骗信息。

但实际上通过这种方式发出去的邮箱,很可能到不了用户的邮箱中,为什么呢?因为现今的邮件服务商都采用了 DKIM 和 SPF 验证来保护自己的邮件域名,避免别人假冒自己的域名发送钓鱼邮件。

什么是 DKIM ?

DKIM 全称是 DomainKeys Identified Mail,即域名密钥识别邮件标准,其存在的意义是用于防止电子邮件欺诈,即防止别人冒用你的域名给别人发邮件。一般来说,发送方会在电子邮件中插入签名,而接收方则通过域名 DNS 解析拿到公钥进行对签名进行验证。

提示:这里会涉及到关于公钥、私钥的知识,如果你不太清楚,可以先百度了解一下再阅读。

简单地说,我们通过生成两把钥匙,一把叫私钥,一把叫私钥。私钥是存在发件服务器的,在发送邮件的时候对发送内容进行签名,之后将签名信息存入邮件里,随着邮件发送携带给收件箱服务器。公钥则是通过 DNS 解析,存放在域名的 DNS TXT 记录中,任何人可以获取到这把公钥。

当收件人服务器收到这封邮件时,其会通过发件人的域名获取到公钥。之后用公钥对邮件的签名进行验证,如果验证正确,那么表明这封邮件确实是由改域名所有者发出的,而不是其他人伪造的。

这里暗含一个知识点:能被公钥验证正确的数据,必然是用对应私钥加密的数据。先记住就好,想弄清楚原理,可以百度一下。

只有通过公钥验证的邮件,才会被正确投递到用户的收件箱中,否则会被附件服务器拒收。整个过程如下图所示。

那么如何设置 DKIM 呢?

一般情况下,我们都是通过邮件服务商发送邮件的。这时候直接到邮件服务商的管理后台,获取相关配置信息,然后为对应的发件域名配置一个 DNS 记录即可。

什么是 SPF ?

SPF,全称为 Sender Policy Framework,即发件人策略框架。其实用来验证哪些服务器或者 IP 可以发送哪些域名的邮件的。例如:我的网站为 shuyi.tech,那么我当然不允许其他人冒充 me@shuyi.tech 的邮箱给别人发邮件。

而 SPF 记录就是在 DNS 上配置一条记录,这条记录显示了哪些域名或者 IP 可以使用这个邮件域名。我们只要把自己发邮件的服务器的域名或者 IP 记录上去,那么其他人就冒充不了我们了。SPF 记录的出现,就是为了防止随意伪造发件人。

SPF 记录实际上是服务器的一个 DNS 记录,原理其实很简单:
假设邮件服务器收到了一封邮件,来自主机的 IP 是 143.174.12.123,并且声称发件人为 email@example.com。为了确认发件人不是伪造的,邮件服务器会去查询 example.com 的 SPF 记录。如果该域的 SPF 记录设置允许 IP 为 173.194.72.103 的主机发送邮件,则服务器就认为这封邮件是合法的。如果不允许,则通常会退信,或将其标记为垃圾或仿冒邮件。

因为不怀好心的人虽然可以「声称」他的邮件来自 example.com,但是他却无权操作 example.com 的 DNS 记录;同时他也无法伪造自己的 IP 地址。因此 SPF 是很有效的,当前基本上所有的邮件服务提供商(例如 Gmail、QQ 邮箱等)都会验证它。

与 DKIM 类似,一般情况下,我们都可以通过邮件服务商配置对应的 SPF 记录值。之后在我们的域名服务商上,为对应的域名配置好对应的 SPF 记录值即可。

DKIM 与 SPF 的异同?

DKIM 与 SPF 都是用来防止伪造发件人的,但它们的侧重点不同。

DKIM 侧重于对邮件的完整性进行校验,如果有别人修改了邮件内容,那么通过 DKIM 就可以识别出来,从而避免被伪造。而 SPF 则是通过校验哪些 IP 或域名有权限发送邮件,其维护了一个权限列表,但是不具有校验邮件完整性的能力。

从实现原理来看,DKIM 使用了公钥、私钥的加密方式,相对更加复杂。而 SPF 则是简单的进行信息的比对,相对来说更加简单一些。

参考资料