DMARC 在子域名上面如何工作 (DMARC sp 标签)?

DMARC Subdomain sp

在本文中,我们来看一下一个比较少讨论到的问题:在子域名的情形下,DMARC 如何工作?

确切地,讨论以下问题:

  • DMARC 策略发现如何工作?
  • DMARC 策略继承如何工作? 应该使用 sp 标签来保护子域名吗?

在深入下面的 DMARC/子域名情形之前,我们先来介绍组织域名 (organizational domain)。

DMARC 中的组织域名是什么?

组织域名是一个域名的"根域名/顶层域名"。下面是几个域名与它们的组织域名:

域名 组织域名
example.com example.com
sales.example.com example.com
mail.sales.example.com example.com
sales.example.co.us example.co.us

组织域名可以通过这个办法获得:将域名分段,然后将它跟包含顶层域名 (TLD) 的公共后缀列表 (PSL) 匹配,包括国家顶层域名,比如在美国的 ".co.us",在英国的 ".co.uk"。

这里是一个 Mozilla 基金会维护的 PSL

DMARC 策略发现如何工作

当一封邮件抵达接收服务器时,服务器需要对该邮件应用 DMARC。要这样做的话,服务器要先尝试找到 DMARC 策略。该过程被称为 DMARC 策略发现。

DMARC 策略发现执行以下步骤来找到邮件的 DMARC 策略:

  1. 找到邮件的 RFC5322.From 域名;
  2. 查询 DNS,以寻找第 1 步中的 RFC5322.From 域名上面的 DMARC 记录;并根据结果:
    • 如果只找到 1 个 DMARC 记录,那么返回该记录中的策略;
    • 如果找到多个 DMARC 记录,策略发现过程终止,并且不对该邮件做 DMARC 处理;
    • 如果没有找到 DMARC 记录,执行第 3 步;
  3. 查询 DNS,以寻找 RFC5322.From 域名的组织域名上面的 DMARC 记录,如果这两个域名并不相同的话;并根据结果:
    • 如果只找到 1 个 DMARC 记录,那么返回该记录中的策略;
    • 如果没有找到 DMARC 记录,或者找到多条 DMARC 记录,策略发现过程终止,并且不对该邮件做 DMARC 处理;
  4. 如果找到的策略中并不包含合法的 p 标签:
    • 如果有 1 个 rua 标签,并且其包含至少 1 个合法的报告 URI,邮件服务器将 p=none 应用到邮件上面;
    • 否则,策略发现过程终止,并且不对该邮件做 DMARC 处理;

每个 DMARC 策略发现过程顶多发起 2 次 DNS 查询。一次是 RFC5322.From 域名,另外一次是组织域名(如果和 RFC5322.From 域名不同的话)。

如果有多层子域名的话,该过程不会对中间层的子域名发起 DNS 查询。原因是为了减轻 DNS 的负担。

例如,如果 RFC5322.From 域名是 it.sales.example.com,只会对 it.sales.example.com 执行 1 次 DNS 查询,可能还对 example.com 执行 1 次 DNS 查询。不会对 sales.example.com 执行 DNS 查询,因为这是一个中间子域名。

DMARC 策略继承如何工作

DMARC 策略继承机制允许域名管理者在子域名上面灵活地设置 DMARC 策略。

DMARC 策略继承规则如下所述。

情形:子域名继承组织域名上面的 DMARC 策略

如果组织域名上面有 DMARC 记录,并且该记录中有 1 个策略 (p 标签),但是没有子域名策略 (sp 标签);子域名上面没有发布 DMARC 记录,该子域名继承组织域名上面的 p 策略。

比如,如果在 example.com 上面发布了一个 DMARC 记录如下:

example.com     "v=DMARC1; p=reject;"

既然 example.com 的策略为 reject,任何没有发布 DMARC 记录的 example.com 的子域名都会继承 reject 策略。

情形:子域名继承组织域名的 sp 策略

如果组织域名发布了一个 DMARC 记录,该记录包含了一个策略 (p 标签) 和一个子域名策略 (sp 标签),而子域名没有发布 DMARC 记录,该子域名会继承组织域名的子域名策略。

例如,如果 example.com 上面发布了一个 DMARC 记录如下:

example.com     "v=DMARC1; p=reject; sp=quarantine;"

既然 example.com 的 sp 策略被显式地设置成 quarantine,任何没有发布 DMARC 记录的 example.com 的子域名将会继承 quarantine 策略。

情形:子域名覆盖组织域名的策略

如果组织域名发布了一个 DMARC 记录,该记录包含了一个策略 (p 标签) 和一个子域名策略 (sp 标签),而子域名有自己的策略 (sp 标签),子域名会用自己的策略覆盖组织域名的子域名策略。

例如,如果 example.com 上面发布了一个 DMARC 记录如下:

example.com     "v=DMARC1; p=reject; sp=reject;"

sales.example.com 上面发布了这样一个 DMARC 记录:

sales.example.com     "v=DMARC1; p=quarantine;"

在这个情况下,sales.example.com 的策略将会覆盖 example.com 的策略。因此 p=quarantine 会应用到 sales.example.com。

情形:子域名上面发布了子域名策略

当子域名上面发布了一个包含了 sp 标签的 DMARC 记录,由于 DMARC 策略发现过程的作用,该 sp 标签会被忽略。

比如,如果在子域名上面有一个 DMARC 记录:

sales.example.com     "v=DMARC1; p=reject; sp=quarantine;"

该 sp 标签不会在 sales.example.com 或者其任何子域名上面产生效果。

DMARC 与子域名的最佳实践

在组织域名上面实现了 p=reject 以后,您应该使用 p=reject 保护您的子域名。这是因为哪怕子域名上面的 DMARC 策略是 p=none 或者 p=quarantine,攻击者仍然能够使用您的子域名投递邮件。

通过把组织域名上面的策略设置成 p=reject,并且不要在子域名上面覆盖它,您可以轻松做到这一点。这样,所有该组织域名下面的子域名都会有 p=reject,攻击者将无法使用您的子域名投递邮件!

相关文章:

Previous Post Next Post

 Protect Business Email & Improve Email Deliverability

Get a 14 day trial. No credit card required.

Create Account