如何在 Ubuntu 18.04 上使用 Apache 为您的域配置 MTA-STS 和 TLS 报告

_ 作者选择了 Electronic Frontier Foundation Inc作为 写给捐赠计划的一部分,接受捐赠。

介绍

Mail Transport Agent Strict Transport Security (MTA-STS)是一个新的互联网标准,允许您在支持的电子邮件提供商之间发送电子邮件时启用严格的强力TLS。 它类似于HTTP Strict Transport Security (HSTS)(https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security),其中设置了强力TLS政策,然后在指定时间内缓存,减少了中间人或降级攻击的风险。

MTA-STS 是由 SMTP TLS 报告(TLSRPT)补充的,它为您提供了哪些电子邮件通过 TLS 成功交付的见解,哪些电子邮件不是。

为您域实施 MTA- STS 的主要原因是要确保发送到您的机密邮件在 TLS 上安全传输 。 其他鼓励TLS进行电子邮件通信的方法,如STARTLS,仍然容易受到中层人攻击,因为初始连接没有加密. MTA-STS帮助确保至少一个安全连接建立后,TLS将默认从那里开始被使用,这极大地降低了这些攻击的风险.

MTA-STS 和 TLS 报告的一个例子是帮助为您的业务创建一个安全的客户服务电子邮件系统。客户可以通过电子邮件发送包含机密个人信息的支持门票,这需要一个安全的 TLS 连接。

在本教程中,您将学习如何为您的域名配置 MTA-STS 和 TLSRPT,然后解释您的第一个 TLS 报告. 虽然本教程涵盖了在 Ubuntu 18.04 上使用 Apache 使用 Let's Encrypt 证书的步骤,但 MTA-STS/TLSRPT 配置也将适用于替代方案,例如 Debian 上的 Nginx。

前提条件

在您开始本指南之前,您将需要:

  • 已配置用于接收电子邮件的域名,使用您自己的邮件服务器或主机邮件服务,如G SuiteOffice 365等. 此教程将始终使用您的域名 , 但是它应该取而代之 。 您需要设置一个子域作为教程的一部分, 以确保您能够访问您的域的 DNS 设置 。
  • 1个Ubuntu 18.04服务器通过跟随与Ubuntu 18.04的初始服务器设置而设置,包括一个sudo非root用户.
  • Apache网络服务器的设置和配置遵循[如何在Ubuntu 18.04上安装Apache网络服务器 (https://andsky.com/tech/tutorials/how-to-install-the-apache-web-server-on-ubuntu-18-04).
  • 一个已配置的 Certbot 客户端,通过跟随如何用Ubuntu 18.04加密方式保护Apache,获取Let's加密证书。 .

一旦你已经准备好了,登录你的服务器作为你的非根用户开始。

注意:**完成 MTA-STS 和 TLSRPT 的实施步骤后,您可能需要等到 24 小时才能收到您的第一个 TLS 报告。

步骤 1 — 创建MTA-STS策略文件

MTA-STS 使用您在您的网站上托管的简单文本配置文件启用和配置,然后支持的邮件服务器将自动连接到您的网站以获取该文件,从而启用 MTA-STS。

首先,在您的主目录中打开一个新的文本文件,以便您有地方写下您想要的配置:

1nano mta-sts.txt

我们首先将讨论一个例子,然后你会写自己的配置文件。

以下是 MTA-STS 配置文件的示例:

1[label Example MTA-STS Configuration File]
2version: STSv1
3mode: enforce
4mx: mail1.your-domain
5mx: mail2.your-domain
6max_age: 604800

此示例配置文件规定,从受支持的提供商发送到mail1.your-domainmail2.your-domain的所有电子邮件必须通过有效的 TLS 连接发送。

这将使攻击者在中间人攻击的情况下拦截和修改您的电子邮件变得更具挑战性,因为正确启用MTA-STS只允许通过有效的TLS连接传输电子邮件,这需要有效的TLS证书。

正如本步前面的示例所示,配置文件由几个密钥/值对组成:

  • `版本':
  • 目的 :指定要使用的MTA-STS规格版本。
  • 公认价值 : 目前唯一公认的价值是`STSv1'。
  • 实例 :`版本:STSv1'
  • `模式':
  • 目的 :指定应启用哪种模式的MTA-STS。
  • 公认价值 :
  • " 强制 " :强迫所有来自受支持提供者的电子邮件使用有效的TLS。
  • `试验': 只报告模式 。 电子邮件不会被屏蔽, 但是 TLSRPT 报告仍然被发送 。
  • :禁用MTA-STS。
  • 实例 :模式:强制执行' , `
  • `mx':
  • 目的 :指定允许哪些邮件服务器为您的域处理电子邮件 。 这将与您 mx 记录中指定的服务器相匹配。
  • 被接受值 :邮件服务器的完全合格域名,或通配符主机. 多 mx: 值必须用于指定多个邮件服务器。
  • 示例 :mx:mail1. your-domain'、mx:mail2. your-domain'、mx: * .example.org ' , `
  • 最大年龄:
  • 目的 :以秒表示MTA-STS政策的最大寿命。
  • 公认价值 : 任何正整数可达31557600.
  • 例子 :`最大年龄:604800'(1周)

您还可以在MTA-STS RFC(https://tools.ietf.org/html/rfc8461# section-3.2)中查看密钥/值对的官方规格。

<$>[警告] 警告:执行模式下启用MTA-STS可能会意外导致某些电子邮件无法交付给您.相反,建议先使用模式:测试和低的max_age:值,以确保一切都正常工作,然后完全启用MTA-STS。

使用步骤早些时候的示例文件,以及之前的密钥/值对示例,写下所需的 MTA-STS 策略文件,并将其保存到您在步骤开始时创建的文件中。

下面的示例文件非常适合测试 MTA-STS,因为它不会导致任何电子邮件被意外阻止,并且具有max_age仅为1天,这意味着如果您决定禁用它,配置将很快过期。

1[label Example Test MTA-STS Configuration File]
2version: STSv1
3mode: testing
4mx: mail1.your-domain
5mx: mail2.your-domain
6max_age: 86401

在此步骤中,您创建了所需的 MTA-STS 配置文件,并将其保存到您的家庭区域。

步骤 2 — 配置 Apache 以服务您的 MTA-STS 策略文件

在此步骤中,您将配置一个 Apache 虚拟主机来服务您的 MTA-STS 配置文件,然后添加 DNS 记录以允许从子域访问该网站。

为了让您的 MTA-STS 配置文件自动被邮件服务器发现,它必须在正确的路径上提供: https://mta-sts.your-domain/.well-known/mta-sts.txt. 您必须在 HTTPS 和 /.well-known/mta-sts.txt 路径上使用 mta-sts 子域,否则您的配置将无法工作。

这可以通过为)。

首先,为您的虚拟主机创建一个目录:

1sudo mkdir /var/www/mta-sts

如果您在您的 Web 服务器上托管多个不同域,建议为每个域使用不同的 MTA-STS 虚拟主机,例如 /var/www/mta-sts-site1/var/www/mta-sts-site2

接下来,您需要创建已知目录,这是您的 MTA-STS 配置文件将存储在那里。已知目录是已知文件的标准化目录,如 TLS 证书验证文件,security.txt等。

1sudo mkdir /var/www/mta-sts/.well-known

现在,您可以将您在步骤 1 中创建的 MTA-STS 策略文件移动到您刚刚创建的 Web 服务器目录:

1sudo mv ~/mta-sts.txt /var/www/mta-sts/.well-known/mta-sts.txt

您可以检查文件是否被正确复制,如果您希望:

1cat /var/www/mta-sts/.well-known/mta-sts.txt

这将输出您在步骤 1 中创建的文件的内容。

MTA-STS只在 HTTPS 上工作,所以您将使用端口 443' (HTTPS) 专属,而不是使用端口 80' (HTTP) 也。

首先,创建一个新的虚拟主机配置文件:

1sudo nano /etc/apache2/sites-available/mta-sts.conf

与虚拟主机目录一样,如果您在同一网页服务器上托管多个不同域,建议为每个域使用不同的虚拟主机名称。

然后,将以下样本配置复制到文件中,并在需要时填充变量:

 1[label ~/etc/apache2/sites-available/mta-sts.conf]
 2<IfModule mod_ssl.c>
 3<VirtualHost your-server-ipv4-address:443 [your-server-ipv6-address]:443>
 4    ServerName mta-sts.your-domain
 5    DocumentRoot /var/www/mta-sts
 6
 7    ErrorDocument 403 "403 Forbidden - This site is used to specify the MTA-STS policy for this domain, please see '/.well-known/mta-sts.txt'. If you were not expecting to see this, please use <a href=\"https://your-domain\" rel=\"noopener\">https://your-domain</a> instead."
 8
 9    RewriteEngine On
10    RewriteOptions IgnoreInherit
11    RewriteRule !^/.well-known/mta-sts.txt - [L,R=403]
12
13    SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
14    SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
15    Include /etc/letsencrypt/options-ssl-apache.conf
16</VirtualHost>
17</IfModule>

此配置将创建mta-sts虚拟主机,该虚拟主机将在mta-sts.your-domain上提供服务,并将所有请求,除了对mta-sts.txt文件本身的请求,重定向到自定义的403 Forbidden错误页面,并友好的解释子域网站的用途。

目前,正在使用自签名的 TLS 证书,这并不理想,因为MTA-STS 需要一个完全有效/值得信赖的证书才能正常工作。

接下来,确保所需的Apache模块启用:

1sudo a2enmod rewrite ssl

然后,启用新的虚拟主机:

1sudo a2ensite mta-sts

然后,运行对Apache配置文件的语法检查,以确保没有任何意想不到的错误:

1sudo apachectl configtest

当测试没有错误时,您可以重新启动Apache,以完全启用新的虚拟主机:

1sudo service apache2 restart

现在,Apache虚拟主机已设置和配置,您需要创建所需的DNS记录(s),以允许使用完全合格的域名mta-sts.your-domain访问它。

如何做到这一点取决于您使用的 DNS 托管提供商,但是,如果您使用 DigitalOcean 作为您的 DNS 提供商,只需导航到您的项目,然后点击您的域。

最后,为mta-sts子域添加所需的 DNS 记录。如果您的 Droplet 仅使用 IPv4,创建mta-stsA记录,指向您的服务器-ipv4 地址。

A screenshot of the DigitalOcean DNS control panel, showing an example DNS record for mta-sts pointing to an IPv4 address.

在此步骤中,您为您的 MTA-STS 子域创建并配置了新的 Apache 虚拟主机,然后添加了所需的 DNS 记录(s),以便您可以轻松访问它。

步骤 3 — 获取您的 MTA-STS 子域的 Let's Encrypt 证书

在此步骤中,您将从 Let’s Encrypt 获得 TLS 证书,以便您的mta-sts.your-domain网站通过 HTTPS 进行正确的服务。

要做到这一点,您将使用)(https://andsky.com/tech/tutorials/how-to-secure-apache-with-let-s-encrypt-on-ubuntu-18-04)。

首先,运行certbot以使用Apache插件验证方法为您的mta-sts子域发行证书:

1sudo certbot --apache -d mta-sts.your-domain

当Certbot向您询问如何配置HTTP -> HTTPS重定向时,请选择,因为这不需要MTA-STS。

最后,测试你的新的虚拟主机,以确保它正常工作. 使用一个网页浏览器访问 https://mta-sts.your-domain/.well-known/mta-sts.txt,或使用一个命令行工具,如 curl:

1curl https://mta-sts.your-domain/.well-known/mta-sts.txt

这将输出您在步骤 1 中创建的 MTA-STS 策略文件:

1[secondary_label Output]
2version: STSv1
3mode: testing
4mx: mail1.your-domain
5mx: mail2.your-domain
6max_age: 86401

如果出现错误,请确保第 2 步的虚拟主机配置正确,并为mta-sts子域添加了 DNS 记录。

在此步骤中,您为您的mta-sts子域发行了 Let’s Encrypt TLS 证书,并测试了它是否有效。

步骤4 — 配置启用MTA-STS和TLSRPT所需的DNS记录

在此步骤中,您将配置两个 DNS TXT 记录,这将完全启用您已经创建的 MTA-STS 策略,并启用 TLS 报告(TLSRPT)。

这些 DNS 记录可以使用任何 DNS 托管提供商进行配置,但在本示例中,DigitalOcean 被用作提供商。

首先,登录您的 DigitalOcean 控制面板并导航到您的项目,然后点击您的域。

然后您需要添加以下两个 TXT 记录:

1_mta-sts.your-domain IN TXT "v=STSv1; id=id-value"
2_smtp._tls.your-domain IN TXT "v=TLSRPTv1; rua=reporting-address"

「id-value」是用来识别您MTA-STS政策的版本的字符串。如果您更新您的策略,您还需要更新「id」值,以确保新版本被邮件提供商检测到。

报告地址是将您的TLS报告发送给的地址,可以是以mailto:为前缀的电子邮件地址,也可以是用于收集报告的API的Web URI。

例如,以下两个样本记录都是有效的:

1_mta-sts.your-domain IN TXT "v=STSv1; id=20190811231231"
2_smtp._tls.your-domain IN TXT "v=TLSRPTv1; rua=mailto:tls-reports@your-domain"

根据需要调整变量,并在您的 DigitalOcean 控制面板(或您正在使用的 DNS 提供商)中设置这些 DNS TXT 记录:

A screenshot of the DigitalOcean control panel, showing the _mta-sts DNS TXT record being set.

A screenshot of the DigitalOcean control panel, showing the _smtp._tls DNS TXT record being set.

一旦这些 DNS 记录已设置并传播,MTA-STS 将启用您在步骤 1 中创建的策略,并在您指定的地址开始接收 TLSRPT 报告。

在此步骤中,您配置了启用 MTA-STS 所需的 DNS 记录,然后您将收到并解释您的第一个 TLSRPT 报告。

步骤5 - 解释您的第一个TLSRPT报告

现在您已启用了 MTA-STS 和 TLSRPT (TLS 报告) 用于您的域名,您将开始收到支持的电子邮件提供商的报告,这些报告将显示通过 TLS 成功发送的电子邮件数量或未成功发送的电子邮件,以及任何错误的原因。

不同的电子邮件提供商在不同的时间发送报告;例如,谷歌邮件每天上午10点左右发送报告。

根据您在步骤 5 中如何配置 TLSRPT DNS 记录,您将通过电子邮件或 Web API 接收报告,本教程专注于电子邮件方法,因为这是最常见的配置。

如果您刚刚完成了本教程的其余部分,请等到您收到第一个报告,然后您可以恢复。

您的每日 TLSRPT 报告通过电子邮件通常会有一个类似于以下的主题行:

1Report Domain: your-domain Submitter: google.com Report-ID: <[email protected]>

此电子邮件将具有.gz 格式的附件,这是一个 Gzip 压缩档案,文件名类似于以下:

1google.com!your-domain!1565222400!1565308799!001.json.gz

对于本教程的剩余部分,这个文件将被称为report.json.gz

将此文件保存到本地机器,并使用您喜欢的任何工具提取它。

如果您正在使用基于 Debian 的 Linux 系统,您将能够运行 gzip -d 命令来解压缩档案:

1gzip -d report.json.gz

这将导致一个名为report.json的JSON文件。

接下来,您可以直接将报告视为原始 JSON 字符串,或者使用您最喜欢的 JSON 预示符将其放入更易于阅读的格式。

注意: 如果您没有安装 jq,您可以使用)从 jq. <$>

1jq . report.json

这将产生类似于以下的东西:

 1[secondary_label Prettified report.json]
 2{
 3    "organization-name": "Google Inc.",
 4    "date-range": {
 5        "start-datetime": "2019-08-10T00:00:00Z",
 6        "end-datetime": "2019-08-10T23:59:59Z"
 7    },
 8    "contact-info": "[email protected]",
 9    "report-id": "2019-08-10T00:00:00Z_your-domain",
10    "policies": [
11        {
12            "policy": {
13                "policy-type": "sts",
14                "policy-string": [
15                    "version: STSv1",
16                    "mode: testing",
17                    "mx: mail1.your-domain",
18                    "mx: mail2.your-domain",
19                    "max_age: 86401"
20                ],
21                "policy-domain": "your-domain"
22            },
23            "summary": {
24                "total-successful-session-count": 230,
25                "total-failure-session-count": 0
26            }
27        }
28    ]
29}

该报告显示了生成报告的供应商和报告期,以及应用的MTA-STS政策,但您将感兴趣的主要部分是总结,具体来说是成功和失败的会话数。

此示例报告显示,来自生成报告的邮件提供商通过 TLS 成功发送了 230 封电子邮件,0 封电子邮件发送未能建立正确的 TLS 连接。

如果出现故障 - 例如,如果 TLS 证书到期或网络上有攻击者 - 故障模式将被记录在报告中。

  • starttls-not-supported:如果接收邮件服务器不支持 STARTTLS. * 证书过期:如果证书过期. * 证书未受信任:如果使用自签名或其他非受信任证书。

在这最后一步中,您接收并解释了您的第一个 TLSRPT 报告。

结论

在本文中,您为您的域设置并配置了 MTA-STS 和 TLS 报告,并解释了您的第一个 TLSRPT 报告。

一旦 MTA-STS 已启用并稳定工作一段时间,建议调整策略,增加max_age值,并最终切换到强制执行模式,一旦您确定所有支持提供商的电子邮件都通过 TLS 成功交付。

最后,如果您想了解更多有关MTA-STS和TLSRPT规格的信息,您可以查看两者的RFC:

Published At
Categories with 技术
comments powered by Disqus