MENU

【歪门邪道】从垃圾邮件谈电子邮件的认证机制

May 12, 2023 • 瞎折腾

今天我在检查邮箱的时候看到了一封十分逼真的垃圾邮件。正好借这个机会来浅显地介绍一下电子邮件的认证机制。

电子邮件系统

电子邮件系统是一个简单又精妙的系统。这可能是为数不多的被大规模使用的去中心化协议(曾经有一个IRC,但很明显,它早就不算大规模了)。这里先给未曾见识过真正的互联网的年轻人介绍一下电子邮件吧。

话是这么说,可是现在的年轻人都刷b站、抖音、快手这些东西,真的会有年轻人用浏览器看我的博客吗?或者说,这样的年轻人,还需要为他/她/它科普什么是真正的互联网吗?

总之,电子邮件是早年间随着互联网一起产生的。从历史上说,最早的互联网来自于ARPANET,一个用于科研和国防领域的封包交换网络,始于1969年。在这个项目中,人们一直在研究怎么用计算机互相发送消息。据考证,第一封电子邮件是在1971年在ARPANET上发送的,同时引入了我们现在非常熟悉的地址语法,也就是someone@example.com这样的格式。随后经过一系列RFC的完善,我们最终有了一个公开的电子邮件标准。

但和TCP/IP协议一样,由于早期互联网比较原始,人们并没有对协议的各个方面考虑的十分周到,尤其是安全方面。前几天TCP/IP的设计者Vint Cerf就说他现在有三点很后悔:

  1. 他认为32位地址已经够用了(ipv4)
  2. 他没有在安全方面施加更多关注
  3. 他没有注意到万维网的影响

虽然完美常常诞生于不完美之中,但这种不完美也常常催生了许多补丁。例如IPv6、PKI体系、搜索引擎等。他们作为补丁并不完美,但确实构成了我们现在每天都赖以维生的互联网。电子邮件也是一样。

电子邮件在早期设计的时候并没有过多考虑安全。它的工作流程差不多是这个样子:

假如Alice@a.org要给Bob@b.org发送一封邮件,首先Alice要在自己的电脑上使用电子邮件客户端编写邮件,在点击发送之后,这个邮件客户端使用SMTP协议将数据传输给Alice所在组织的邮件服务器。

邮件服务器会看到SMTP协议中的目的地址,即bob@b.org,此时邮件服务器会查询b.org的MX记录来获取该域名对应的邮件服务器地址,我们叫他mx.b.org好了。随后Alice的邮件服务器会使用SMTP协议联络mx.b.org,并将Alice的邮件发送给该服务器。

Bob在他的电子邮件客户端上收信时,客户端使用IMAP协议联络Bob所在组织的邮件服务器,也就是mx.b.org,来获取bob@b.org的邮件,此时服务器会将Alice发给Bob的邮件传送给Bob。

在这个过程中我们可以看出至少三个问题:

  1. mx.b.org可能会产生单点失败
  2. Alice和Bob的邮件是明文的,任何中间人都可以查阅信息
  3. mx.b.org并不验证邮件是否来自Alice

关于第一个问题,可以通过DNS解决。一般在设置MX记录时都会设置多个邮件服务器,也就是一个集群。这样一来,即便其中一个节点失败了,其他人还可以根据MX记录中的冗余节点继续发信。

第二个问题也好解决。在协议层面,我们有曾经的StartTLS和TLS来加密客户端与服务端、服务端与服务端的通信。在内容方面,Alice和Bob可以使用GPG公钥体系来加密和签名邮件内容。

第三个问题比较棘手,因为认证和验证的过程只对客户端-服务器有效,换句话说,Alice要给她组织的邮件服务器发信,必须使用正确的用户名和密码,同时Bob要从他组织的邮件服务器收信,也必须提供正确的用户名和密码。但是Alice的邮件服务器给Bob的邮件服务器发送数据,这之间没有任何验证机制,也就是说,我也可以联络mx.b.org,宣称有一封来自Alice发送给Bob的邮件。本文余下的内容将针对这个问题展开讨论。

我收到的垃圾邮件

我今天收到了这样一封垃圾邮件:

警告

这是一封垃圾邮件,我已经明确告知你了,请不要把以下引用的内容信以为真。此外,以下信息可能已经过时,因此请不要过于纠结于里面提到的联系方式,它们可能已经被重新分配给普通用户,请不要在本文发布后的未来给他们带来困扰。

标题:独家速办学信网永久可查学历学位证书 AD

全国独家权威代办!!

独家全国高校院系优质资源渠道,全国独家权威代办!

高薪工作,优厚职位,提拔晋升,职称评定,户口办理,出国移民 轻松全搞定!!

你是否因为没有大学学历和学位而找不到一份理想工作,或者尽管你在实际工作中积累了丰富经验却因没有学历学位证书而失去提拔晋升的机会? 拥有一个大学学历(学位),确保你在工作事业上的快速成功!

为客户解决发展瓶颈期问题,快速轻松实现职务升迁,职称评定岗位晋升,备受私企外企猎头推崇,投资于学历学位产生的回报和价值之高远超任何投资品种,且一次投资终身受益可持续发展!!既可以立竿见影在职场商场如鱼得水,也可以为今后的报考升迁提供坚实的基础!!

你为没有学历找不到好工作烦恼吗?还因为没有学历无法大幅提高待遇收入而忧虑吗?还为没有正规大学学历学位而无法实现职称评定,提拔重用,晋级加薪而烦恼吗? 学历改变命运创造价值!!本公司可助你成功辉煌!!

代理商加盟待遇优厚回报丰厚!!创造价值远远物超所值,终身受益, 本科升硕士,硕士升博士,职称待遇级别也都相应快速提升!!

学信网首页最底栏一栏“联系我们”上有地图指引地址以及电话邮箱,学信公司发布广告的邮箱是 @chsi.com.cn 域名后缀的学信网服务器,回复协议以及支付宝或银行账号的邮箱是学信公司对外公开的企业邮箱 kefu@chsi.com.cn

全国独家常年办理:

全日制统招名牌重点院校985 211 全国高等院校学历证书,本科学历双证含学士学位(工学学士,理学学士,农学学士,管理学学士,经济学学士,医学学士,教育学学士,文学学士,法学学士学位等),

双证全日制统招硕士/在职硕士研究生(工商管理硕士MBA,金融管理硕士FMBA,法律硕士,法学硕士,公共管理硕士MPA,教育硕士,公共卫生硕士,工程硕士,会计硕士MPAcc,建筑学硕士,临床硕士,艺术硕士MFA,农业推广硕士学位等),

双证博士和在职博士(经济学博士, 管理学博士,会计学博士语言学博士,医学博士工商管理博士,金融学博士心理学博士,社会学博士新闻学博士,法学博士公共管理博士,教育学博士计算机博士,文学博士计算机博士等)自学考试毕业证书以及学位证书(学士,硕士,博士),

均提供完备学籍档案成绩单,大学英语四六级cet4,cet6合格成绩单证明,派遣证,电子注册入学信网数据库,终身永久可查,可经公证处公证,确保顺利通过各种形式的审查验证,可用于报考公务员,各类资格考试,考研,升职,评职称等用途,所办证书由全国各地国立公办院校内部渠道关系办理,欢迎长期代理合作回报丰厚!全国近百家代理机构,业务遍布全国:北京 上海 深圳 天津 杭州 南京 厦门 广州 武汉 成都 郑州 东莞 济南 福州等地区!!资源持续增长!

本公司业务适用于高端白领金领各类高端客户群的学历学位的定向优化整合升级,回报率高,平台资源方向的选择决定了职场商场上的风生水起一马平川!!选择比努力重要,站在巨人肩膀上才能飞得更高,代理商政策优厚返利丰厚,欢迎转发推荐,长期欢迎各界拥有客户资源渠道的代理加盟!!

全套档案学籍学历学位价格:

价位按不同标准普通重点名牌院校三档的差别和专业热度的差别,全带学历学位学籍档案加开通学信网终身永久数据注册查询

undergraduate 本科双证 2万起 根据院校专业的热门程度层次调整 如:北京理工大学-计算机学院-计算机科学与技术本科-工学学士学位,上海同济大学-经济管理学院-物流管理本科-管理学学士学位

graduate 硕士研究生 双证 双证在职研究生有工商管理硕士MBA、公共管理硕士MPA 在职硕士全日制硕士3万起 原始学历根据不同专业招生要求需要本科学士学位 例如:中国人民大学-商学院-工商管理学硕士 MBA,EMBA(在职 全日制), 北京首都经济贸易大学-经济学院- 产业经济学(贸易经济)硕士(在职 全日制),上海复旦大学-新闻学院-新闻学专业硕士(在职 全日制)

Dr 博士双证6万 起 原始学历需有硕士学位 例如:中央财经大学-金融学院-金融工程专业博士(学历学位双证),北京交通大学-电子信息工程学院-电子与信息专业博士(学历学位双证)

办理非常快捷,1-3个工作日即可办好档案证书学位学籍英语证书等原件并注册开通学信网认证数据库查询,终身永久有效查询,本公司手机号微信号长期实名认证,企业邮箱学信网域名服务器@chsi.com.cn 实名备案,对公账号收款,全面支持支付宝微信扫码和网上银行手机银行APP支付,欢迎全国代理商加盟合作!!

办理流程:

备齐申请材料→审核通过→首付20%( 企业账户收费 工商银行北京海淀支行 )→办好发送证书扫描件查询验证满意→支付余款→收取全套证书原件,北京上海深圳地区闪送

北京总部地址:北京市西城区西直门外大街18号金贸大厦C3座 

上海公司地址:上海市浦东新区浦东南路1078号中融大厦608

深圳办公地址:深圳市南山区深圳大学城学苑大道1068号F栋

学信网系教育部指定唯一学历认证查询网 www.chsi.com.cn 学历查询官方电话:010-67410388

办理学历学位请联系北京总部 微信:chsibj 学信宁小华老师 手机:13910108888 微信号:chsibj 邮箱: kefu@chsi.com.cn QQ :668888

客户/代理商遍布全国:北京 上海 深圳 天津 杭州 南京 厦门 广州 武汉 成都 郑州 东莞 济南 福州

添加微信须知:加微信咨询办理前,请先确定客户年龄?意向学历的性质(全日制统招 自考)?院校地区专业? 工作人员会先报价,决定办理的客户请打开学信网登录首页左上角学历查询页面后来电话,给我们办公企业邮箱kefu@chsi.com.cn发送备齐的申办材料邮件后,我们可以给客户查看近期办好的学历样本输入姓名证书编号即可查询验证,欢迎有客户资源实力的机构个人加盟代理大展宏图!!

本公司手机号微信号长期实名认证,企业邮箱学信网域名服务器@chsi.com.cn长期实名备案,实名账号全面支持支付宝银联网银支付,代理商长期合作安全快捷!

最好的口碑和信誉, 独家雄厚资源,已成功为大量海内外客户圆满了梦想, 一、教育部认证网和学校网均可以查询,可供用人单位和有关部门电话咨询和上网调查 二、有完整齐全的档案、学籍、考试成绩单、入学登记表、毕业登记表等。对求职、就业、应聘、晋级、涨薪、职称评定、资格报考、等级认证、出国、留学、移民、学历 公证等都具有效力。 三、保证快捷价优:因为是学校直接出证直接办理,所以保证了出证快速,价格优惠。 市场无可限量,欢迎加盟代理,一次批量提交办理客户,可来本公司面谈签约,代理商加盟待遇优厚回报丰厚!!

近年来假证书早已经彻底被淘汰,无论纸张规格质地防伪水印还是毕业证书的编号学位证书的编号,还有学籍号档案编号,都早已全部联网到教育部学信网的数据库了,无论是报考还是应聘面试或是公证,相关工作人员都是登陆学信网数据库平台来查验学历证书的真伪。

办理学历学位请联系北京总部 微信:chsibj 学信宁小华老师 手机:13910108888 微信号:chsibj 邮箱: kefu@chsi.com.cn QQ : 668888

本处独家的资源权限使得客户不用再辛苦备考耗费时间精力参加漫长繁琐的学历考试,只要你具备一定的专业基础,规划设计最佳的职业方向,为不同客户推荐订制与职业和未来发展高度匹配的学历学位,终身永久学信网查询,本学历学位业务最适合具备较强工作能力有较好从业履历的高端客户,包括指定院系专业的在职统招全日制本科硕士博士研究生私人定制,帮助广大能力出众经济优越的客户实现了职场飞跃商场腾飞仕途平步青云!!选择比努力更重要,与时俱进站在巨人的肩膀上你可以飞得更高!!

附: 申办学历所需材料

1.学历性质(统招 成人教育/在职 自学考试)

院校名称(各地区国立公办院校)

学历层次(专科 本科学士 硕士研究生 博士研究生 如MBA EMBA 各类工程硕士)

毕业时间(自考为每年6月底12月底各毕业登记一次 统招/成教/在职为每年7月)

  1. 蓝色底两寸数码证件彩照(图片文件可压缩后用邮件附件上传发来)

身份证正面扫描件(用邮件附件上传发来)

  1. 简历,原始学历学位发来与否视成人教育/专升本/在职硕士等学历的不同具体要求而定

我平时收到的垃圾邮件不在少数,但是这封邮件十分引人注目。它宣称发件人是来自chsi.com.cn的,但诚如上面所说,邮件服务器并不验证来源。我也曾经遇到过有人使用我的域名给我发邮件,但遗憾的是我的域名只有我一个人使用,我也只买了一个mailbox,不可能有第二个人,假的离谱。

但内容上就显得十分可疑了,邮件提到了学信网官网下方的客服邮件地址,还有学信网官方的通讯地址,这些都是真实信息,但后面的微信号就比较可疑了。假消息之所以是假的,就是因为它全是假的,如果你在里面掺一点点真的,那后面的假消息看起来也不会太假,甚至可能像是真的。这封邮件采用的也是类似的手段。我猜测,当你通过微信联系所谓的学信网之后,对方会给你提供一个完全不一样地址,并给出诸如“通讯地址不是办公地址”之类的理由。关于什么「给我们办公企业邮箱kefu@chsi.com.cn发送备齐的申办材料邮件后」,我猜测他们会给你对应的模板,通过内容的二义性来让官方客服忽略你发送的邮件,同时在微信上告诉你“为了保险起见,把你的资料再通过微信发送一份”。总之就是骗呗。

换句话说,我花了四年时间学习知识,凭本事拿到了我的工学学士学位,而你花几万块钱就想1-3个工作日拿到和我一样的学位,你也不撒泡尿照照自己,你配吗?

当然了,这封邮件也有可能是真的,学信网有可能真的监守自盗,但这一观点我无从判断。我没办法确认它是真的,也没办法确认它是假的。不可证伪的东西不具有科学性,因此我不过度强调这种可能性。

它为什么在技术上是假的

在内容上没有办法确定真伪,但技术上是可以的。为了解决垃圾邮件的问题,人们提出了几种措施。

SPF

在2017年我购买域名邮箱服务器的时候就用到了第一种技术:SPF,全称Sender Policy Framework。它通过DNS记录规定了一套发件人确认机制,用来确定联络者是否真的来自他宣称的域。

例如Alice的组织配置了SPF,并给出了一些一些规则。当Alice的邮件服务器联络mx.b.org时,Bob的邮件服务器同时会查询a.org的DNS记录,并发现Alice的组织配置的SPF规则。这时Bob的邮件服务器就会查看对方是否符合SPF规则。这个规则通常描述了一系列合法的主机,例如合法的ip地址、域名等,并规定如果匹配失败应当如何处理。

此时,如果来自Alice组织的规则允许联络者宣称它是a.org,那么Bob的邮件服务器就会接受该邮件,如果不允许,则取决于Alice组织的策略,Bob的邮件服务器可能会拒收邮件,也可能接受邮件。

SPF规则除了定义允许的源之外,还规定如何处理失败的邮件:

  • +表示通过(PASS),即允许接受该邮件
  • ?表示无规则(NEUTRAL),由接收者决定如何处置邮件
  • ~表示软失败(SOFTFAIL),介于通过和无规则之间,表示邮件应该被接受,但同时应该被标记
  • -表示失败(FAIL),表示邮件应该被拒绝或丢弃

按照道理来说应该使用FAIL来处理SPF失败的邮件。但由于DNS记录更新较慢,如果在修改尚未生效时使用了新的邮件服务器,FAIL操作可能会导致合法的邮件被丢弃,并且和发送失败的退信不同,对方的邮件服务器并不保证总之反馈一封退信邮件。也就是说,使用FAIL时可能会出现悄悄丢信的情况。因此在大部分情况下使用~all来明确对方接受可疑邮件,但要将其标记为垃圾或欺诈。

下面我们来看看我收到的这封邮件的SPF记录:

spf=softfail (asp-relay-pe.jellyfish.systems: 182.97.150.70 is neither permitted nor denied by domain of 【数据删除】@chsi.com.cn) smtp.mailfrom=【数据删除】@chsi.com.cn

为了对比,我找除了曾经学信网给我发的邮件,当时的发件人是appmail.chsi.com.cn

spf=pass (asp-relay-pe.jellyfish.systems: domain of chesicc_noreply@appmail.chsi.com.cn designates 36.110.136.66 as permitted sender) smtp.mailfrom=chesicc_noreply@appmail.chsi.com.cn

由于发件人地址包含了我的用户名,因此这里删掉了。总之可以看到,这封垃圾邮件的SPF验证结果是软失败,而一封合法的邮件是pass。同时经过查询IP,发现182.97.150.70这个IP是江西电信在南昌市的CDMA全省共用出口,竟然是手机用的移动网络。搞不好这就是个专业的诈骗团伙啊。

DKIM

除了基于来源的认证,前人还提出了一套基于公钥和签名的认证机制。DKIM全程DomainKeys Identified Mail,即域名密钥识别邮件。这一机制需要发送方对邮件的部分Header和邮件哈希(Body hash)进行签名,例如邮件的From、To、Subject、Date等。由于使用公钥和签名,这要求邮件服务器必须事先生成密钥对,并提前在DNS记录中公开公钥。还是以Alice和Bob举例:

Alice的组织需要配置DNS来公开其可能使用的公钥。

当Alice的邮件服务器向mx.b.org发送邮件之前,该邮件服务器需要对邮件的头和正文进行摘要和签名。并将签名作为头的一部分一并传送给mx.b.org。

当Bob的邮件服务器收到邮件时,会解析DKIM签名,并根据签名中指定的公钥名称(selector)通过DNS查询对应的公钥。得到公钥后,Bob的邮件服务器将会验证签名是否符合收到的邮件。

对于发布欺诈邮件的人来说,由于无法接触到Alice邮件服务器的私钥,也就无法伪造正确签名的邮件。虽然DKIM常用来保证邮件在传输过程中没有经过篡改,但同时也常用于过滤垃圾邮件和反钓鱼。

下面我们来看看这封垃圾邮件的DKIM记录:

dkim=none

哈哈,这封邮件没有DKIM。我们看看学信网的:

dkim=none;

什么?学信网竟然也没有配置DKIM!当然,学信网这封邮件是2022年7月21日发给我的,现在已经过了快一年了,不知道他们更新了没。总之,我们看看一个合法的dkim长什么样:

dkim=pass header.d=synologynotification.com header.s=7mcmkfkowt3v5pb6ydprcg2px3f4xbyx header.b="WVKl/ykx";
dkim=pass header.d=amazonses.com header.s=qpcfy54xse57bzmyicqs5kisv46vyagl header.b=CKEbHtPT;

这是一封来自群晖的通知邮件,这封邮件有两个dkim签名,分别来自AWS和群晖。我们以第一个群晖的域名为例,selector为7mcmkfkowt3v5pb6ydprcg2px3f4xbyx,我们使用dig来查询一下这个域名:

skyblond@Cinder-Fall:~> dig 7mcmkfkowt3v5pb6ydprcg2px3f4xbyx._domainkey.synologynotification.com

; <<>> DiG 9.16.38 <<>> 7mcmkfkowt3v5pb6ydprcg2px3f4xbyx._domainkey.synologynotification.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 24161
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1408
;; QUESTION SECTION:
;7mcmkfkowt3v5pb6ydprcg2px3f4xbyx._domainkey.synologynotification.com. IN A

;; ANSWER SECTION:
7mcmkfkowt3v5pb6ydprcg2px3f4xbyx._domainkey.synologynotification.com. 575 IN CNAME 7mcmkfkowt3v5pb6ydprcg2px3f4xbyx.dkim.amazonses.com.

;; AUTHORITY SECTION:
dkim.amazonses.com.    575    IN    SOA    ns-386.awsdns-48.com. awsdns-hostmaster.amazon.com. 1 7200 900 1209600 86400

;; Query time: 4 msec
;; SERVER: 100.100.100.100#53(100.100.100.100)
;; WHEN: Fri May 12 17:16:58 CST 2023
;; MSG SIZE  rcvd: 237

可以发现群晖将这个Selector通过CNAME委托给了AWS。我们跟着CNAME走一下:

skyblond@Cinder-Fall:~> dig 7mcmkfkowt3v5pb6ydprcg2px3f4xbyx.dkim.amazonses.com TXT

; <<>> DiG 9.16.38 <<>> 7mcmkfkowt3v5pb6ydprcg2px3f4xbyx.dkim.amazonses.com TXT
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 29050
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;7mcmkfkowt3v5pb6ydprcg2px3f4xbyx.dkim.amazonses.com. IN    TXT

;; ANSWER SECTION:
7mcmkfkowt3v5pb6ydprcg2px3f4xbyx.dkim.amazonses.com. 3477 IN TXT "p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDFEh98sJ0atJod34TNxFwe+TsbC5rDjWPkcNg41nsJZvP1tWdSktCy1QQ/sMpsVK5vy5krfhthf7nrnTiqqNCCsJGnvr7HT8D6038qa2PlkOQxmnD9f6VsFE811wD5q59RmdU9fvFeNUaCNht4sZ8N3i1zH/nOKU6YBC7U9tRaOQIDAQAB"

;; Query time: 12 msec
;; SERVER: 100.100.100.100#53(100.100.100.100)
;; WHEN: Fri May 12 17:21:55 CST 2023
;; MSG SIZE  rcvd: 311

这个MI开头、DAQAB结尾的一大串Base64应该就是用来验证签名的公钥了。

DMARC

不过细心的读者可能发现:你这个DKIM好像没有规定失败了怎么处理啊。之前SPF还规定了什么软失败硬失败。DKIM可能也会出现轮换了密钥但DNS还没来得及更新的情况,这个怎么办啊?都当成硬失败?

诶,我知道你很急,但是你先别急。这个DMARC不就来了嘛。DMARC全称Domain-based Message Authentication, Reporting and Conformance,翻译过来是基于域名的消息认证、报告和一致性。听着名字挺长,但实际上它是前两个协议的协调者。DMARC通过DNS记录宣告本邮件服务器使用的身份认证方法(目前是SPF和DKIM),并告知接收者在认证失败后如何处理邮件,以及如何报告这些邮件。

DMARC首先规定了对齐(Alignment)的检查方式。

  • SPF对齐要求来源IP必须被来自From头的地址的域的SPF规则认可(宣称是alice@a.org的服务器IP必须被来自a.org的SPF规则认可,即给出PASS)
  • DKIM对齐则要求必须出现合法的来自From头的域名的DKIM签名(Alice的邮件必须存在一个来自a.org的DKIM签名)

当然,你也可以宽松的选择不检查对齐。但是这样无助于对抗垃圾邮件和欺诈邮件。

其次,DMARC规定了在失败时如何处理:

  • none表示没有规定处理,全听接收者的
  • quarantine表示邮件应该被接受,但应该被标记为spam
  • reject表示邮件应该被丢弃

最后(当然,这不是DMARC的全部)它还规定了如何报告(report)。

DMARC规定了两种报告,一种是聚合报告(Aggregate reports),其他邮件服务器将定期(通常是每天)向这个地址发送统计数据,例如有多少消息通过了验证,有多少消息失败了、因何而失败等。例如Bob的邮件服务器将每天向a.org设置的邮件地址发送来自a.org的邮件的统计数据,其中会包含SPF、DKIM的验证情况,以及邮件中包含的SPF和DKIM域名,以及来源IP。这种报告常用于监控DMARC策略的表现。

另一种是Forensic Reports,这是一种实时报告。一旦有任何验证失败的邮件产生,邮件服务器将根据来源地址对应的服务器设置的回报地址发送一份详尽的报告,其中包含诸如来源IP、SPF和DKIM验证情况、邮件标题、收发件人、邮件头之类的信息。

当然,这种回报机制可能会被作为一种骚扰手段。在开启了DMARC之后,别人伪造的欺诈邮件发不出去了,但当欺诈邮件被拒绝时,被冒用的邮件服务器将收到一封Forensic Report。如果别人不断使用伪造的欺诈邮件发送给多个服务器,很有可能多个服务器同时回报,对被冒用身份的服务器形成一种类似DDOS的攻击。尤其是作为个人用户,我将自己的邮箱设置成为了catch-all,并没有单独设立应对DMARC的邮箱,这可能会迫使邮件服务器关闭这种回报。

最后我们看看那一封垃圾邮件的DMARC验证:

dmarc=fail reason="No valid SPF, No valid DKIM" header.from=chsi.com.cn (policy=quarantine);

对比之下,来看看学信网的邮件:

dmarc=pass (policy=quarantine) header.from=chsi.com.cn;

虽然学信网没有使用DKIM,但看起来他们的DMARC设置的比较宽松。

再来看看群晖的:

dmarc=pass (policy=reject) header.from=synologynotification.com;

还得是群晖啊,用上了最严格的reject策略。

垃圾邮件总结

总第来说,这一封垃圾邮件虽然内容上很真实,但是在技术上还是没能骗过我的垃圾邮件拦截器。虽然学信网的DMARC策略设置的很宽松,但SPF没有通过检查就足以触发垃圾邮件检测了。此外,我还发现了一个很可笑的邮件头:

X-Mailer: EhooPost 2004b

这个邮件头用来标识邮件客户端的类型,有点类似于浏览器的User Agent,可以随便改,但一般而言用只作标识。对于这封邮件来说,Mailer是EhooPost,这是个什么呢?我上网搜了一下:亿虎邮件群发大师。

笑死大牙了,这真是假的离谱了。

为我的域名配置安全策略

前面说了那么多用来认证邮件身份的技术,但是想想看,好像我自己的邮箱并没有全部配置。我的邮箱从2017年搬到域名邮箱,那个时候还只有SPF。

SPF

SPF可能是最好设置的一个,因为它只认证来源,而我将邮箱服务委托给了第三方,因此我只需要include服务商的规则即可:

skyblond.info.        1231    IN    TXT    "v=spf1 include:spf.privateemail.com ~all"

只需要在一级域名上设置一下就好了。一般来说我比较倾向于使用-all来拒绝所有可疑邮件。但是我看了群晖和谷歌的配置,他们使用的都是~all来接受和标记可疑邮件。我也姑且就学者这么配置了。

理论上来说,我更倾向于使用-all,这个比较像是尽早崩溃的策略。虽然崩溃并不是令人高兴的事情,但是尽早崩溃有助于尽早发现问题。但是邮件系统的问题在于,有些邮件系统在丢信的时候并不会发送退信报告,所以这种时候相当于是悄悄崩溃,并没有什么正向的做用。

DKIM

DKIM应该是我的邮件服务商最近才支持的功能,我看知识库最近更新日期是2023年3月7日。在支持了这个功能之后,只需要点一下就可以生成邮件服务器的DKIM密钥,然后只需要手动配置一下DNS就好了。由于这部分没什么技术含量,主要是复制粘贴,所以这里就不贴配置了。

DMARC

DMARC的配置也需要使用DNS记录:

_dmarc.skyblond.info.    1799    IN    TXT    "v=DMARC1;p=reject;sp=rejec;rua=mailto:【数据删除】;ruf=mailto:【数据删除】;sp=reject;pct=100;ri=86400;aspf=s;adkim=s;fo=1"

我这里写的比较完善。如果比较懒的话,我看了谷歌和群晖的DMARC配置,都比较简单:

_dmarc.google.com.    1    IN    TXT    "v=DMARC1; p=reject; rua=mailto:mailauth-reports@google.com"
_dmarc.synologynotification.com. 600 IN    TXT    "v=DMARC1; p=reject; rua=mailto:postmaster@synologynotification.com"

他们这里就是拒绝所有可疑邮件,并且只留下了聚合报告的地址。我这里提供了两种报告的地址,同时还规定了子域名也要使用reject选项,并且要求SPF和DKIM对齐。如果你需要自定义设置的话,可以使用网上的“DMARC generator”来通过图形化界面生成你想要的配置。

CNAME

我这里除了域名邮箱,还有一个SendGrid用作发信服务。例如网站的评论通知,还有我自己的一些通知服务都将一个二级域名委托给SendGrid使用。如果我刚才设置了子域名也严格执行reject策略,那SendGrid那边我是不是也要配置呢?

我就这个问题仔细查了查,虽然没有查到明确的RFC,但看起来SPF和DKIM规则在遇到CNAME的时候会跟着CNAME走。也就是说我在二级域名下配置了对应的CNAME,那么邮件服务器在查询规则的时候就会顺势查询CNAME目标的规则,于是就由SendGrid来处理SPF和DKIM了。而令人开心的是,SendGrid那边默认是使用SPF和DKIM的,并且不需要手动配置。非常好。

验证

配置好了一切,让我们来简单的验证一下。这里我使用了一个简单的PowerShell脚本来发送邮件:

$mailParams = @{
    SmtpServer                 = '【数据删除】'
    From                       = 'someone@gmail.com'
    To                         = '【数据删除】'
    Subject                    = "Direct Send $(Get-Date -Format g)"
    Body                       = 'This is a test email using Direct Send'
}

Send-MailMessage @mailParams

这里我们需要通过查询DNS的MX记录来找到正确的Smtp服务器,注意我们这里要直接连接到对方的邮件服务器,这和我们平时使用客户端和邮件服务器通讯不一样。收件人是谁都行,但因为要观察结果,所以我们还是填自己的邮箱比较好。这里的From我填写了一个并不属于我控制的Gmail地址,出乎意料的是我真的收到了邮件:

Return-Path: <someone@gmail.com>
Delivered-To: 【数据删除】
Received: from 【我电脑的主机名】 (unknown [【我电脑的公网IP】])
    by 【我的邮件服务商】 (【我的邮件服务商】) with ESMTP id 4QHqML5vLNz9rx4
    for <【数据删除】>; Fri, 12 May 2023 13:27:58 +0000 (UTC)
MIME-Version: 1.0
From: someone@gmail.com
To: 【数据删除】
Date: 12 May 2023 21:27:59 +0800
Subject: Direct Send 2023/5/12 21:27
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: quoted-printable
Authentication-Results: 【我的邮件服务商】;
    dkim=none;
    dmarc=fail reason="No valid SPF, No valid DKIM" header.from=gmail.com (policy=none);
    spf=softfail (【我的邮件服务商】: 【我电脑的公网IP】 is neither permitted nor denied by domain of someone@gmail.com) smtp.mailfrom=someone@gmail.com

但如果把上面的From换成我自己的邮箱,则得到了如下结果:

Send-MailMessage : 事务失败。 服务器响应为:5.7.1 DMARC policy rejected

很好,根据DMARC策略拒绝了我的邮件。但遗憾的是我并没有收到对应的退信请求,看起来好像并不是所有邮件服务器都会严格遵守别人的策略。不过如果是我自己的邮件服务器发信被拒,我的邮件服务器就会给我发退信邮件了。这就和给一个不存在的电子邮件地址发邮件一样。总之我很满意。

总结

今天收到了一封看起来很逼真的垃圾邮件,不过最终还是没有逃过技术的检测。不过归根结底,如果它真的是学信网发出来的邮件,他怎么会不知道我已经本科毕业了呢?总之,还是我文章里那句话:

我花了四年时间学习知识,凭本事拿到了我的工学学士学位,而你花几万块钱就想1-3个工作日拿到和我一样的学位,你也不撒泡尿照照自己,你配吗?

如果文凭花点钱就能办到的话,那只能说这文凭太不值钱了。

此外,借着这个契机,我浅显地入门了一下电子邮件的认证机制,并且给我的域名邮箱也配置了这样一套认证。经过我的测试,发送给Gmail的邮件已经是三个Pass了。希望以后再给别人发邮件,对方的邮件系统不会再把我的邮件标记成垃圾邮件了。

-全文完-


知识共享许可协议
【歪门邪道】从垃圾邮件谈电子邮件的认证机制天空 Blond 采用 知识共享 署名 - 非商业性使用 - 相同方式共享 4.0 国际 许可协议进行许可。
本许可协议授权之外的使用权限可以从 https://skyblond.info/about.html 处获得。

Archives QR Code
QR Code for this page
Tipping QR Code
Leave a Comment

6 Comments
  1. 事实上电子邮件提供商会用上更复杂的垃圾邮件过滤和发件人认证手段,包括SPF、DKIM、DMARC、rDNS、ip/域名黑白名单、邮件内容分析、SpamAssassin得分…

    之前搭建邮件服务器耗费了好久才让mail-tester给出了10分评级(

    1. @Moraxyc确实,但是我觉得个人用没那么讲究。好多商业认证动不动一年就大几千美元,我觉得犯不上。刚才去mail tester测了一下,现在网站的回复邮件是9/10,我感觉还行了(

  2. 好久没有看邮箱了,今天竟然看到垃圾箱里一封和你完全一样的邮件,我还在想他们是怎么伪造的这封像真的一样的邮件内容,看了你的这文章清晰的明白了其中的原理

  3. 已经很久没有正儿八经用过邮件了(乐)但还是看的津津有味

  4. MX MX

    写的好详尽啊,好就没见过这么棒的技术文章了

  5. 文章中并没有提到这个欺诈邮件如何高明。如果不懂技术的话,这种真实的信息和虚假的信息掺杂在一起,真的很容易混淆视听信以为真。而且这个邮件的标题后面还有一个AD。一些有良心的营销邮件会在标题后面加上AD这个标记来表示这是一封广告邮件,因此很可能出现在你的垃圾邮件收件箱。但问题在于,它不是广告邮件,它是欺诈邮件,尽管这二者都会出现在垃圾邮件收件箱里,但很明显,后者的危害性更大