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


推荐阅读
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • RouterOS 5.16软路由安装图解教程
    本文介绍了如何安装RouterOS 5.16软路由系统,包括系统要求、安装步骤和登录方式。同时提供了详细的图解教程,方便读者进行操作。 ... [详细]
  • 安装mysqlclient失败解决办法
    本文介绍了在MAC系统中,使用django使用mysql数据库报错的解决办法。通过源码安装mysqlclient或将mysql_config添加到系统环境变量中,可以解决安装mysqlclient失败的问题。同时,还介绍了查看mysql安装路径和使配置文件生效的方法。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • 在CentOS/RHEL 7/6,Fedora 27/26/25上安装JAVA 9的步骤和方法
    本文介绍了在CentOS/RHEL 7/6,Fedora 27/26/25上安装JAVA 9的详细步骤和方法。首先需要下载最新的Java SE Development Kit 9发行版,然后按照给出的Shell命令行方式进行安装。详细的步骤和方法请参考正文内容。 ... [详细]
  • 本文讨论了如何在codeigniter中识别来自angularjs的请求,并提供了两种方法的代码示例。作者尝试了$this->input->is_ajax_request()和自定义函数is_ajax(),但都没有成功。最后,作者展示了一个ajax请求的示例代码。 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • 本文介绍了在MacOS系统上安装MySQL的步骤,并详细说明了如何设置MySQL服务的开机启动和如何修改MySQL的密码。通过下载MySQL的macos版本并按照提示一步一步安装,在系统偏好设置中可以找到MySQL的图标进行设置。同时,还介绍了通过终端命令来修改MySQL的密码的具体操作步骤。 ... [详细]
  • 本文介绍了在MFC下利用C++和MFC的特性动态创建窗口的方法,包括继承现有的MFC类并加以改造、插入工具栏和状态栏对象的声明等。同时还提到了窗口销毁的处理方法。本文详细介绍了实现方法并给出了相关注意事项。 ... [详细]
  • 本文介绍了RxJava在Android开发中的广泛应用以及其在事件总线(Event Bus)实现中的使用方法。RxJava是一种基于观察者模式的异步java库,可以提高开发效率、降低维护成本。通过RxJava,开发者可以实现事件的异步处理和链式操作。对于已经具备RxJava基础的开发者来说,本文将详细介绍如何利用RxJava实现事件总线,并提供了使用建议。 ... [详细]
  • Postgresql备份和恢复的方法及命令行操作步骤
    本文介绍了使用Postgresql进行备份和恢复的方法及命令行操作步骤。通过使用pg_dump命令进行备份,pg_restore命令进行恢复,并设置-h localhost选项,可以完成数据的备份和恢复操作。此外,本文还提供了参考链接以获取更多详细信息。 ... [详细]
  • 本文讨论了在使用PHP cURL发送POST请求时,请求体在node.js中没有定义的问题。作者尝试了多种解决方案,但仍然无法解决该问题。同时提供了当前PHP代码示例。 ... [详细]
  • 本文介绍了在RHEL 7中的系统日志管理和网络管理。系统日志管理包括rsyslog和systemd-journal两种日志服务,分别介绍了它们的特点、配置文件和日志查询方式。网络管理主要介绍了使用nmcli命令查看和配置网络接口的方法,包括查看网卡信息、添加、修改和删除配置文件等操作。 ... [详细]
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社区 版权所有