最终编辑:我似乎对 DKIM 完全错误,签名域不必与发件人域相同,因此我的问题的整个前提是有缺陷的。非常感谢保罗指出我的错误!
下面的原始问题:
我已尝试阅读 SPF 和 DKIM,但我不明白同时使用两者的意义,至少在打击垃圾邮件的情况下(伪造的发件人地址,这可能导致我的电子邮件服务器/域被列入黑名单)。据我所知,仅 DKIM 就应该完成 SPF 应该完成的工作。
到目前为止,我的理解如下:
- 发送电子邮件时,发件人可以声明他们想要的任何内容(例如虚假发件人地址)
- DKIM 允许检测伪造的发件人电子邮件地址,因为您可以根据 DNS TXT 记录中的公钥验证 DKIM 签名。
- SPF 允许您验证电子邮件是从有权为给定发件人地址发送电子邮件的邮件服务器发送的。
我不明白的是:除非 DKIM 私钥以某种方式受到损害,否则仅 DKIM 验证就足以验证电子邮件是从授权的电子邮件服务器发送的,否则电子邮件服务器将不会用于签署电子邮件的私钥。
我在这里看到了一个非常相似的问题的答案:https ://serverfault.com/a/780248/154775 ,其中作者声称 DKIM 无法防止重放攻击。我会承认这一点,但我发现这是一个极端情况,我认为迄今为止最大的问题是带有虚假发件人地址的垃圾邮件 - DKIM 应该可以自己轻松地防止这种情况。
与仅 DKIM 相比,是否存在 SPF 提供额外保护的重放攻击以外的场景?
编辑:我用粗体标记了我的问题的核心,以澄清我到底想要回答什么。
SPF 和 DKIM 完全保护不同的东西:SPF 保护信封发件人,而 DKIM 保护电子邮件标题和正文的完整性和真实性。此外,DKIM 只能验证现有签名,但没有方法来判断是否应接受没有签名的消息。因此,除了 SPF 和 DKIM 之外,还需要DMARC 。
此外,这些方法都不是针对垃圾邮件问题的,而是针对电子邮件伪造的。请记住,垃圾邮件发送者也可以并且确实会设置它们。但如果没有 DMARC、DKIM 和 SPF,他们可以自由地使用您的域来实现他们的目的。
虽然 Esa Jokinen 的回答是正确的,但我发现这种语言令人困惑。
简单地说:
DKIM 是加密通过/失败,如果邮件服务器将签名添加到内容中可能会破坏它(它可能像服务器或中继添加额外的回车一样无辜),简单与轻松(涵盖常见修改),其中一些修改是允许的,但以削弱保护为代价。总的来说,我发现 DKIM 太复杂,太容易让邮件意外丢失。
相比之下,我认为 SPF 相当容易设置,并且只要您不经常更改邮件服务器的地址,就需要较少的调试。您还可以指定在 SPF 中更加谨慎地对待未列出的服务器(“软失败”),这将进一步提高与列表匹配的服务器的可信度,而不会惩罚那些不太严厉的服务器。
DKIM 很容易出错。由于 DKIM 未正确验证(如我的邮件服务器的标题和日志所示),我收到了相当多的合法电子邮件,这些电子邮件已进入我的垃圾邮件文件夹。然而,它确实为您的信息提供了进一步的可信度。
总的来说,如果您不知道您的邮件服务器中继地址是什么和/或它们经常更改,并且您只想将签名密钥提供给某个主机上的应用程序以代表您从您的域地址发送邮件,那么 DKIM 可能很有用.
分配点数和阈值来判断垃圾邮件/非垃圾邮件的垃圾邮件检查服务器通常会为通过 SPF 和 DKIM 的邮件奖励额外的点数。从字面上看,您可以同时获得奖励积分。
另请参阅:SPF 与 DKIM - 确切的用例和差异
我认为这很难令人满意地回答的原因之一是因为您的核心论点似乎是基于理论上的理想情况,而不是基于现实世界。
原则上,DKIM 还不够吗?是的,当然,如果您的 DKIM 始终有效,并且没有邮件服务器以破坏您的 DKIM 签名的方式重写您的邮件,如果您不关心任何人重新发送您的电子邮件,并且如果您的每个潜在收件人也实施 DKIM 验证,那么 DKIM 原则上对你来说就足够了。(不过,您可能仍需要添加 DMARC 策略以使收件人拒绝根本没有 DKIM 签名的邮件。)
但是,人们还需要关心 SPF 吗?是的,出于实际原因,他们这样做了。SPF 和 DKIM 在很大程度上是独立的标准,但 SPF 总是比 DKIM 更容易实施,许多管理员似乎对使用它感到满意。因此,DKIM 仍然没有完全覆盖。因此,如果您的邮件服务器没有 SPF 记录,那么更有可能有人通过欺骗您的域向只有 SPF 的收件人发送垃圾邮件。因此,您自己的合法邮件被这些相同收件人标记为垃圾邮件的可能性也会更高。
仅使用 DKIM,接收服务器无法知道在哪里可以找到您的域的 DKIM 密钥,因为电子邮件的签名包含选择器 DNS 记录位置,该位置由每个邮件服务器管理员分配。因此,从其他服务器接收电子邮件的邮件服务器将无法使用它来评估消息。
如果您有 example.com 并且配置了 DKIM 而没有其他配置,并且我从我的服务器 example.net 发送了一封电子邮件,但是我的服务器“欺骗”了来自 example.com 的电子邮件,并且我配置了一个例如.net 的 DKIM 记录,电子邮件将通过 DKIM 测试,接收服务器将更难确定邮件不是来自 example.com 所有者批准的服务器。这是因为 DKIM 测试是使用发送服务器记录来验证电子邮件完整性的,仅此而已。
使用电子邮件签名中的信息执行验证。换句话说,DKIM 测试的开始是电子邮件本身,其中包括发送服务器的 DKIM 公钥的位置。DKIM 标准仅用于验证服务器发送的电子邮件完整性,因此服务器的域不需要与其他标头信息有任何关系,例如
smtp.mailfrom
. 这就是为什么我可以“欺骗”example.com 并使用 example.net 的密钥通过 DKIM 测试这就是为什么这里的每个人都说 DKIM 仅用于消息完整性的目的,而不是经过批准的发件人验证。DKIM 只能用作防止垃圾邮件的“工作证明”,除非与配置了 SPF 的 DMARC 一起使用,因为没有人知道您的域的密钥所在的位置。
绝对没有办法使用域或发件人身份验证来防止垃圾邮件。这些技术都不是为了对抗垃圾邮件而设计的,但它们可以提供帮助。
DKIM、DMARC 和 SPF 保护收件人免受电子邮件伪造或发件人欺骗(第 1 点)。就单词的含义和使用而言,这对于打击网络钓鱼比打击垃圾邮件尤为重要。也就是说,垃圾邮件通常是无害的,只是骚扰。
相反,网络钓鱼和鱼叉式网络钓鱼本质上是恶意的,并且在没有 DKIM 的情况下,可以利用与发件人地址的信任关系。当网络犯罪分子想要通过将 IBAN/SWIFT 代码更改为流氓代码来向公司客户发送伪造发票时尤其如此。
对于庞大的商业电子邮件,这些技术完全没有帮助。我甚至可以批量购买大量新鲜的刻录机域名,并使用一点 DevOps 自动化来设置 SPF、DKIM、DMARC,并开始从不可避免地未知的发件人地址发送大量垃圾邮件活动。我每天都会在我的垃圾邮件收件箱中找到这个(如果有人要求提供证据,我可以在这个答案上粘贴一些标题)。
作为与网络钓鱼相关的另一个反例。如果网络钓鱼者想要攻击 ACME 银行 (
acme.com
) 的客户,他们无法发送看起来确实来自 的电子邮件[email protected]
,但他们可以购买(因为他们做到了!!)acme-confirm-credentials.com
并发送电子邮件。受过教育的收件人会注意到电子邮件不是来自官方
acme.com
并变得可疑,尽管人们应该对“凭据确认”的请求产生怀疑。