热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

DKIM、DMARC和SPF:设置电子邮件安全

DKIM、DMARC和SPF是维护电子邮件安全的三种主要机制。相关协议可让您防止未经授权的服务器作为您的域发送,并为收件人提供一种验证电子邮件确实来自您的方法。在本

在这里插入图片描述
DKIM、DMARC 和 SPF 是维护电子邮件安全的三种主要机制。相关协议可让您防止未经授权的服务器作为您的域发送,并为收件人提供一种验证电子邮件确实来自您的方法。

在本指南中,我们将探讨每种技术的作用、为什么需要它以及您应该如何设置它。您将需要所有三个部分来最大限度地提高电子邮件服务器的可传递性和声誉。

防晒指数

我们将首先采用 SPF,因为它是列表中最简单和最古老的项目。SPF 使用 DNS 记录来定义可以将电子邮件作为域发送的服务器 IP 地址。

SPF 记录通常如下所示:

v=spf1 ip4:123.123.123.123 ~all

如果此记录设置为example.com,则只有 的服务器123.123.123.123才能发送带有FROM: user@example.com标题的电子邮件。在~all不包括除列表中的所有其他IP地址。

SPF 由接收电子邮件服务器强制执行。它将检查发送服务器的 IP 地址、电子邮件FROM标题中的域以及该域的 SPF DNS 记录中允许的发件人列表。如果发送服务器的 IP 不在列表中,则传递将失败。

SPF 区分“软”和“硬”失败。~all在您的标题中写入表示遇到未经授权的发件人时软失败;-all指示接收服务器使用硬故障。

在硬故障情况下,电子邮件将被完全丢弃。软失败可能允许将电子邮件传送到收件人的垃圾文件夹。现在 DMARC 已广泛使用,我们将在下面看到,通常建议使用~all(软失败)。这避免了对合法电子邮件的误报,将更多控制权交给 DMARC,并有助于在后期验证阶段进行调试。

设置 SPF

为您的域配置 SPF 很容易。前往您域的控制面板,找到设置 DNS 记录的部分,然后添加新TXT记录。写入一个有效的 SPF 字符串作为值并保存您的记录。

SPF 记录支持多种白名单令牌:

  • ip4:123.123.123.123 – 允许指定的 IPv4 地址。
  • ip6🔡1234:90ab:cdef:5678:90de:fabc – 允许指定的 IPv6 地址。
  • a:example.com– 允许 DNSA记录给出的 IP 地址example.com。
  • mx:example.com– 允许由 DNSMX记录之一给出的 IP 地址example.com。
  • include:example.com– 查询该域的 SPF 记录,除直接定义外,还使用其白名单。简化流行的第三方电子邮件服务的集成。
  • redirect:example.com– 忽略其他令牌并使用example.com.

您可以通过向标头添加多个令牌来组合多个来源:

v=spf1 ip4:123.123.123.123 include:example.com ~all

DKIM

DKIM 代表“域密钥识别邮件”。SPF 指示服务器是否可以作为您的域发送,而 DKIM 会查看电子邮件本身。这是一个签名系统,可让接收服务器跟踪电子邮件的来源。

DKIM 帮助接收电子邮件服务器回答以下问题:

  • 离开发件人后,电子邮件的标题是否被修改过?
  • 离开发件人后,电子邮件的正文是否被篡改过?
  • 发送服务器是否被授权作为这个域发送?(与 SPF 重叠)

DKIM 系统提供了一种方法来验证电子邮件是真实的、未经修改的并且是由您的服务器实际发送的。当 DKIM 检查失败时,接收服务器会将电子邮件视为不可信。由服务器决定如何处理电子邮件。它很可能最终会出现在收件人的垃圾邮件文件夹中,但可以完全删除。

设置 DKIM

DKIM 使用加密来启用服务器身份验证。设置 DKIM 需要生成公钥和私钥对。公钥会添加到您域的 DNS 记录中。

私钥保密并成为邮件服务器配置的一部分。该软件将使用此密钥对其发送的每封电子邮件进行签名。当接收服务器收到新邮件时,它会查询域的 DKIM DNS 记录并使用公钥来检查电子邮件是否被篡改。

设置 DKIM 的确切步骤将因您使用的邮件传输代理而异。这是一个如何让它与 Postfix 一起工作的例子:

# Install OpenDKIM implementation
sudo apt install opendkim opendkim-tools# Add the Postfix user to the OpenDKIM group
sudo gpasswd -a postfix opendkim

打开/etc/opendkim.conf并取消注释或添加以下行:

Canonicalization relaxed/simple
Mode sv
AutoRestart yes
AutoRestartRate 5/1H
SignatureAlgorithm rsa-sha256
UserID opendkim

这将 OpenDKIM 配置为用作传出邮件的签名者和传入消息的验证者。这是您要设置的内容:

Canonicalization– 定义 OpenDKIM 在验证传入电子邮件是否已被篡改时的严格程度。默认是simple不允许修改。这通常会导致合法电子邮件丢失,因为中间邮件服务器稍微修改过的消息(例如通过调整空格或行长度)将被丢弃。relaxed/simple允许更多非关键差异。

Mode– 启用签名 ( s) 和验证 ( v) 模式。

AutoRestart以及AutoRestartRate– 失败时重新启动,前提是一小时内重新启动次数不超过五次。

SignatureAlgorithm – 对传出消息进行签名时使用的加密算法。

接下来将以下额外行添加到文件中:

# Maps domains to the keys used to sign emails
KeyTable refile:/etc/opendkim/key.table
SigningTable refile:/etc/opendkim/signing.table# Ignore these hosts when verifying incoming signatures
ExternalIgnoreList /etc/opendkim/trusted.hosts# Internal hosts to enable outgoing mail signing for
InternalHosts /etc/opendkim/trusted.hosts

保存并关闭配置文件。接下来创建上面引用的映射文件:

sudo mkdir /etc/opendkim
sudo mkdir /etc/opendkim/keys
sudo chown -R opendkim:opendkim /etc/opendkim
sudo chmod go-rw /etc/opendkim/keys

/etc/opendkim/trusted.hosts先创建:

127.0.0.1
localhost*.example.com

这指定来自本地地址或您的域的电子邮件已经受信任。

打开/etc/opendkim/signing.table并添加以下内容:

*@example.com default._domainkey.example.com

这会指示 OpenDKIM 从任何example.com地址发送的消息都应使用default._domainkey.example.com密钥进行签名。

现在打开/etc/opendkim/key.table并添加以下内容:

default._domainkey.example.com example.com:default:/etc/opendkim/keys/example.com/default.private

default._domainkey.example.com上面定义的选择器被配置为使用在 的私钥/etc/opendkim/keys/example.com/default.private。接下来我们将生成这个密钥。

sudo opendkim-genkey -d example.com -D /etc/opendkim/keys/example.com -s default -v
sudo chown opendkim:opendkim /etc/opendkim/keys/example.com/default.private
sudo chmod 600 /etc/opendkim/keys/example.com/default.private

密钥生成命令将生成您的公钥和私钥。

接下来,您需要将公钥添加为域上的 DNS 记录。打开/etc/opendkim/keys/example.com/default.txt。复制之后的所有内容TXT并将其粘贴为您的 DNS 记录的值。使用default._domainkey,因为这是在整个上面的命令中使用的选择器的名称作为DNS主机名。

最后一步是将 OpenDKIM 连接到 Postfix。再次打开您的 OpenDKIM 配置文件并添加以下行(如果尚不存在):

Socket inet:8891@localhost

这将创建一个 TCP 套接字,Postfix 将使用该套接字将电子邮件传递给 OpenDKIM 以进行签名和验证。接下来打开你的 Postfix 配置文件,/etc/postfix/main.cf:

milter_protocol = 2
milter_default_action = accept
smtpd_milters = inet:localhost:8891
non_smtpd_milters = inet:localhost:8891

如果最后两行已经存在以逗号分隔的值,那么您已经使用了一些 Postfix 过滤器。将 OpenDKIM 过滤器添加到现有列表的末尾,而不是创建一个新行。这将确保 OpenDKIM 除了您现有的过滤器外也适用。

现在您可以重新启动 Postfix ( service postfix restart) 并从 DKIM 签名的消息中受益。您可以使用以下opendkim-testkey命令检查您的密钥配置是否正确:

sudo opendkim-testkey -d example.com -s default -vvv
opendkim-testkey: using default configfile /etc/opendkim.conf
opendkim-testkey: checking key 'default._domainkey.example.com'
opendkim-testkey: key secure
opendkim-testkey: key OK

要测试实际的电子邮件,请将消息发送到check-auth@verifier.port25.com。DKIM check: pass在结果中寻找。如果指示失败,请检查 Postfix 日志/etc/var/mail.log以查找签名错误。

==========================================================
Summary of Results
==========================================================
SPF check: pass
DomainKeys check: neutral
DKIM check: pass
DMARC

DMARC 是“基于域的消息身份验证、报告和一致性”。它是另一种通过发送电子邮件服务器来防止未经授权使用域名的协议。

与 SPF 和 DKIM 不同,DMARC 为域所有者提供了一种方法来指定当电子邮件服务器收到未经适当身份验证的消息时会发生什么。支持三种操作:

  • none – 服务器可以继续传递消息。
  • quarantine – 将邮件发送到垃圾邮件或垃圾邮件。
  • reject – 拒绝并退回邮件。

DMARC 还提供报告机制。您可以指定接收邮件服务器在收到声称来自您的域的电子邮件时调用的服务器端点。这为您提供了作为您的域发送的服务器的跨 Internet 视图。

这是一个示例 DMARC DNS 记录。它应该添加为针对_dmarc.example.com主机名的 TXT 记录。

v=DMARC1; p=none; rua=mailto:user@example.com

p=none–p标签告诉邮件服务器在未经身份验证的邮件到达时要做什么。它的值必须是上面指定的操作之一。

rua=mailto…–rua标签指示服务器将报告数据发送到何处。在这种情况下,它会通过电子邮件发送给您。报告通常每天发送一次,让您可以监控未经授权的发送活动。

还有其他受支持的DMARC 标签。这些使您可以为子域定义单独的策略操作,改变 SPF 和 DKIM 检查的执行严格性,并配置 DMARC 将应用于的电子邮件的百分比。

概括

SPF、DKIM 和 DMARC 是增强电子邮件生态系统安全性和信任度的三种技术。如果您从自己的服务器发送电子邮件,则应同时使用这三个地址,以便收件人可以验证您是否有权将您的域用作发件人地址。这将降低您出现可交付性问题的风险。

SPF 和 DMARC 是简单的 DNS 记录。DKIM 将公共 DNS 记录与由您的电子邮件服务器处理的私钥相结合。SPF 用于限制可以作为您的域发送的服务器;DKIM 是一种较新的替代方案,包括验证消息完整性。

DMARC 提供了一种方法来定义当其他检查失败时会发生什么。它还添加了以前缺少的报告机制,以便域所有者可以监控身份验证失败。它仍然相对年轻,不会被所有电子邮件服务器支持。尽管如此,它仍被主要供应商接受,值得设置为另一层保护。


推荐阅读
author-avatar
萧海豚泳_756
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有