1. 什么是DMARC
DMARC(Domain-based Message Authentication, Reporting & Conformance)是一种电子邮件验证、报告和合规性标准,旨在解决域名冒充问题,特别是防范那些企图伪装成某个组织或个人进行电子邮件欺诈的行为。DMARC基于已经广泛部署的SPF和DKIM两种邮件身份验证协议,通过增加域名对齐检查和提供详细的报告机制,强化了电子邮件安全和防止钓鱼攻击的能力。
2. DMARC工作原理
- 域名对齐:
DMARC要求SPF和DKIM验证结果与邮件信头中的发信域(即用户直观看到的发信人域名)一致。也就是说,如果邮件信头声称来自example.com,则SPF和DKIM验证也必须与example.com保持一致。
- 策略执行:
DMARC允许域名管理员定义政策,决定邮件服务器在邮件无法通过DMARC验证时应该如何处理,比如“none”(不做任何动作,仅报告)、“quarantine”(隔离邮件,例如放入垃圾邮件文件夹)或“reject”(直接拒收邮件)。
- 报告机制:
DMARC提供了一个标准化的反馈机制,让邮件接收方能够定期向域名管理员发送关于DMARC检查结果的报告。这些报告可以帮助管理员了解其域名下邮件的发送情况,及时发现并阻止未经授权的邮件发送行为。
3. DMARC记录
在DNS中为域名添加一个TXT类型的DMARC记录,以下面的记录举例说明:
_dmarc.mailabc.cn. IN TXT "v=DMARC1; p=reject; pct=100; rua=mailto:dmarcreports@mailabc.cn; ruf=mailto:abuse@mailabc.cn;"
这个记录中包含了DMARC策略及其参数:
- _dmarc 固定的域名前缀,表示这条TXT类型的记录是用于dmarc检查。
- v=DMARC1 表示DMARC版本为1。
- p=reject 表示对不符合策略的邮件采取拒绝策略。
- pct=100 表示对100%的邮件执行此策略(如果不设定,则默认为100%)。
- rua=mailto:dmarcreports@mailabc.cn 设置了授权收件人邮箱地址,用于接收汇总政策执行报告。
- ruf=mailto:abuse@mailabc.cn 设置了故障报告的接收邮箱地址,用于接收详尽的错误分析报告。
注意:组织在首次实施DMARC时,通常会先设置为“监控”模式(policy of “none”),收集一段时间的报告,了解正常邮件和潜在欺诈邮件的情况,之后逐步加强策略至“隔离”或“拒绝”。
_dmarc.163.com. 462 IN TXT "v=DMARC1; p=none;"
163.com设置的DMARC策略
4. DMARC配置示例
再次强调:DMARC功能依赖SPF和DKIM,在设置DMARC之前需要确保SPF和DKIM已正确设置。
DMARC记录需要在配置DNS TXT类型记录,以mailabc.cn域名为例,在阿里云的域名控制台添加TXT类型的记录,记录值配置如下:
阿里云域名管理中设置DMARC记录
5. 为什么要启用DMARC
为什么已经配置了SPF和DKIM,还需要DMARC?让我们试着分析一下。
- SPF存在的问题
在电子邮件中有两个 from 地址:信封上的 from 地址,由 SMTP 会话中的 mail from 命令指定,以及头域中的 from 地址,由 SMTP data 命令指定(关于SMTP协议,可以参考往期文章SMTP协议及常见指令介绍 | MailABC邮件知识百科)。SPF 的设计使得它只验证信封上的 from 地址,而它并不检查信头中的 from 地址。这意味着攻击者仍然能够从白名单上面的服务器来使用假冒的信头from 地址发送邮件。换句话说,用户在邮件终端中看到的 from 域可能和 SPF 验证过的值不同。
- DKIM存在的问题
DKIM 仅仅验证 DKIM 签名中的 d= 值,该值可能和头域 from 地址中的域名值不同。结果是显然的:用户在邮件终端中看到的 from 域可能和 DKIM 验证过的值不同。DMARC为了解决SPF和DKIM的漏洞,选择邮件信头中的域名作为发信域名作为检查依据,这样就可以防止邮件伪造。
参考资料:https://dmarcly.com/blog/zh-CN/what-is-dmarc-identifier-alignment-domain-alignment#
6. 启用DMARC可能带来哪些问题?
让我们来看一下163.com、qq.com的DMARC启用情况:
[root@localhost tmp]# dig +short 163.com _dmarc.163.com txt
"v=DMARC1; p=none;"
[root@localhost tmp]# dig +short qq.com _dmarc.163.com txt
"v=DMARC1; p=none;"
从上面检查结果可以看出,尽管两大邮件提供商都启用了DMARC,但是声明的p操作为none(不做任何操作),也没有声明报告接收邮箱。这就说明运营类的邮箱采用的是相对宽松的检查策略。
为什么不启用相对严格的策略呢,比如p=reject?总结原因大致如下:
- 在邮件的实际使用场景中可能会存在mail from与信头中的from不一致的场景,如直接转发、自动转发的场景,一旦启用严格检查策略,可能会影响此类邮件发送。
- 另一种场景是邮件群发业务,如账单投递、业务推广,这种邮件都是通过第三方业务系统组信之后交给专业的邮件投递系统进行投递,实际的发件人与信头中的发件人大概率是不同的。
综上所述,是否启用DMARC,以及采用什么样的策略,取决于企业和组织的实际情况。