如何在Ubuntu18.04上使用Apache为您的域配置MTA-STS和TLS报告
作者选择 Electronic Frontier Foundation Inc 作为 Write for DOnations 计划的一部分接受捐赠。
介绍
Mail Transport Agent Strict Transport Security (MTA-STS) 是一种新的互联网标准,允许您为支持的电子邮件提供商之间发送的电子邮件启用严格的强制 TLS。 它类似于 HTTP Strict Transport Security (HSTS),其中设置了强制 TLS 策略,然后缓存指定的时间量,从而降低了中间人或降级攻击的风险.
MTA-STS 与 SMTP TLS 报告 (TLSRPT) 相辅相成,可让您深入了解哪些电子邮件通过 TLS 成功传递,哪些未成功传递。 TLSRPT 类似于 DMARC 报告 ,但用于 TLS。
为您的域实施 MTA-STS 的主要原因是确保发送给您的机密电子邮件通过 TLS 安全传输。 其他鼓励 TLS 进行电子邮件通信的方法,例如 STARTTLS,仍然容易受到中间人攻击,因为初始连接是未加密的。 MTA-STS 有助于确保一旦建立了至少一个安全连接,将从那里默认使用 TLS,这大大降低了这些攻击的风险。
MTA-STS 和 TLS 报告的一个示例用例是帮助为您的企业创建安全的客户服务电子邮件系统。 客户可以通过电子邮件发送包含机密个人信息的支持票,这需要安全的 TLS 连接。 MTA-STS 有助于确保连接的安全性,并且 TLSRPT 将提供每日报告,识别任何未安全发送的电子邮件 - 提供对任何正在进行或以前对您的电子邮件系统的攻击的重要洞察。
在本教程中,您将学习如何为您的域名配置 MTA-STS 和 TLSRPT,然后解读您的第一个 TLS 报告。 虽然本教程介绍了在 Ubuntu 18.04 上使用 Apache 和 Let's Encrypt 证书的步骤,但 MTA-STS/TLSRPT 配置也适用于替代方案,例如 Debian 上的 Nginx。
先决条件
在开始本指南之前,您需要:
- 已配置用于接收电子邮件的域名,使用您自己的邮件服务器或托管邮件服务,例如 G Suite 或 Office 365。 本教程将自始至终使用
your-domain
,但是应该用您自己的域名替换。 作为教程的一部分,您将需要设置一个子域,因此请确保您能够访问您的域的 DNS 设置。 - 按照 Initial Server Setup 和 Ubuntu 18.04 设置一台 Ubuntu 18.04 服务器,包括 sudo 非 root 用户。
- 按照 How to Install the Apache Web Server on Ubuntu 18.04 设置和配置 Apache Web 服务器。
- 通过遵循 How To Secure Apache with Let's Encrypt on Ubuntu 18.04,配置 Certbot 客户端以获取 Let's Encrypt 证书。
准备好这些后,以非 root 用户身份登录到您的服务器即可开始。
注意: 完成 MTA-STS 和 TLSRPT 的实施步骤后,您可能需要等待长达 24 小时才能收到您的第一份 TLS 报告。 这是因为大多数电子邮件提供商每天发送一次报告。 收到第一份报告后,您可以从第 5 步继续教程。
第 1 步 — 创建 MTA-STS 策略文件
使用您在网站上托管的纯文本配置文件启用和配置 MTA-STS。 然后,受支持的邮件服务器将自动连接到您的网站以检索文件,从而启用 MTA-STS。 在第一步中,您将了解此文件的可用选项并选择最适合您的文件的选项。
首先,在你的主目录中打开一个新的文本文件,这样你就可以在某个地方写下你想要的配置:
nano mta-sts.txt
我们将首先介绍一个示例,然后您将编写自己的配置文件。
以下是 MTA-STS 配置文件的示例:
示例 MTA-STS 配置文件
version: STSv1 mode: enforce mx: mail1.your-domain mx: mail2.your-domain max_age: 604800
此示例配置文件指定从受支持的提供商传送到 mail1.your-domain
和 mail2.your-domain
的所有电子邮件必须通过有效的 TLS 连接传送。 如果无法与您的邮件服务器建立有效的 TLS 连接(例如,如果证书已过期或自签名),则不会发送电子邮件。
这将使攻击者在中间人攻击等情况下拦截和窥探/修改您的电子邮件更具挑战性。 这是因为正确启用 MTA-STS 仅允许通过有效的 TLS 连接传输电子邮件,这需要有效的 TLS 证书。 攻击者很难获得这样的证书,因为这样做通常需要对您的域名和/或网站进行特权访问。
如本步骤前面的示例所示,配置文件由许多键/值对组成:
version
:- Purpose:指定要使用的 MTA-STS 规范的版本。
- Accepted Values:目前唯一接受的值是
STSv1
。 - 示例:
version: STSv1
mode
:- Purpose:指定应该在哪种模式下启用 MTA-STS。
- 接受值 : 强制:强制所有来自受支持提供商的传入电子邮件使用有效的 TLS。 测试:仅报告模式。 电子邮件不会被阻止,但仍会发送 TLSRPT 报告。 none:禁用 MTA-STS。
- 示例:
mode: enforce
mx
:- Purpose:指定允许哪些邮件服务器为您的域处理电子邮件。 这应该与您的
mx
记录中指定的服务器匹配。 - 接受值:邮件服务器的完全限定域名,或通配符主机。 必须使用多个
mx:
值来指定多个邮件服务器。 - 示例:
mx: mail1.your-domain
、mx: mail2.your-domain
、mx: *.example.org
- Purpose:指定允许哪些邮件服务器为您的域处理电子邮件。 这应该与您的
max_age
:- Purpose:指定MTA-STS策略的最大生命周期,以秒为单位。
- 接受值:最大为 31557600 的任何正整数。
- 示例:
max_age: 604800
(1周)
您还可以在 MTA-STS RFC 的 第 3.2 节中查看键/值对的官方规范。
警告: 在 enforce
模式下启用 MTA-STS 可能会意外导致某些电子邮件无法发送给您。 相反,建议首先使用 mode: testing
和较低的 max_age:
值,以确保在完全打开 MTA-STS 之前一切正常。
使用该步骤前面的示例文件以及前面的键/值对示例,编写所需的 MTA-STS 策略文件并将其保存到您在步骤开始时创建的文件中。
以下示例文件非常适合测试 MTA-STS,因为它不会导致任何电子邮件被意外阻止,并且 max_age
仅为 1 天,这意味着如果您决定禁用它,配置将很快过期。 请注意,某些电子邮件提供商只会在 max_age
大于 1 天时发送 TLSRPT 报告,这就是为什么 86401 秒是一个不错的选择(1 天和 1 秒)的原因。
示例测试 MTA-STS 配置文件
version: STSv1 mode: testing mx: mail1.your-domain mx: mail2.your-domain max_age: 86401
在此步骤中,您创建了所需的 MTA-STS 配置文件并将其保存到您的家庭区域。 在下一步中,您将配置 Apache Web 服务器以正确格式提供文件。
第 2 步 — 配置 Apache 以服务于您的 MTA-STS 策略文件
在此步骤中,您将配置一个 Apache 虚拟主机来为您的 MTA-STS 配置文件提供服务,然后添加一条 DNS 记录以允许从子域访问该站点。
为了让邮件服务器自动发现您的 MTA-STS 配置文件,它必须在正确的路径上提供:https://mta-sts.your-domain/.well-known/mta-sts.txt
。 您必须通过 HTTPS 使用 mta-sts
子域和 /.well-known/mta-sts.txt
路径,否则您的配置将不起作用。
这可以通过为 mta-sts
子域创建一个新的 Apache 虚拟主机来实现,该主机将为 MTA-STS 策略文件提供服务。 此步骤基于您将在先决条件步骤 如何在 Ubuntu 18.04 上安装 Apache Web 服务器中设置的基本配置。
首先,为您的虚拟主机创建一个目录:
sudo mkdir /var/www/mta-sts
如果您在 Web 服务器上托管多个不同的域,建议为每个域使用不同的 MTA-STS 虚拟主机,例如 /var/www/mta-sts-site1
和 /var/www/mta-sts-site2
。
接下来,您需要创建 .well-known
目录,该目录将存储您的 MTA-STS 配置文件。 .well-known
是“知名”文件的标准化目录,例如 TLS 证书验证文件、security.txt
等。
sudo mkdir /var/www/mta-sts/.well-known
现在您可以将您在步骤 1 中创建的 MTA-STS 策略文件移动到您刚刚创建的 Web 服务器目录中:
sudo mv ~/mta-sts.txt /var/www/mta-sts/.well-known/mta-sts.txt
如果您愿意,可以检查文件是否已正确复制:
cat /var/www/mta-sts/.well-known/mta-sts.txt
这将输出您在步骤 1 中创建的文件的内容。
为了让 Apache 提供文件,您需要配置新的虚拟主机并启用它。 MTA-STS 仅适用于 HTTPS,因此您将仅使用端口 443
(HTTPS),而不是使用端口 80
(HTTP)。
首先,新建一个虚拟主机配置文件:
sudo nano /etc/apache2/sites-available/mta-sts.conf
与虚拟主机目录一样,如果您在同一 Web 服务器上托管多个不同的域,建议为每个域使用不同的虚拟主机名。
然后,将以下示例配置复制到文件中,并在需要的地方填充变量:
~/etc/apache2/sites-available/mta-sts.conf
<IfModule mod_ssl.c> <VirtualHost your-server-ipv4-address:443 [your-server-ipv6-address]:443> ServerName mta-sts.your-domain DocumentRoot /var/www/mta-sts 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." RewriteEngine On RewriteOptions IgnoreInherit RewriteRule !^/.well-known/mta-sts.txt - [L,R=403] SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key Include /etc/letsencrypt/options-ssl-apache.conf </VirtualHost> </IfModule>
此配置将创建 mta-sts
虚拟主机,该主机将在 mta-sts.your-domain
上提供服务。 它还将所有请求(除了对 mta-sts.txt
文件本身的请求之外)重定向到自定义 403 Forbidden
错误页面,并友好地解释子域站点的用途。 这是为了帮助确保任何意外访问您的 MTA-STS 站点的访问者不会无意中混淆。
目前,使用的是自签名 TLS 证书。 这并不理想,因为 MTA-STS 需要完全有效/受信任的证书才能正常工作。 在第 3 步中,您将使用 Let's Encrypt 获取 TLS 证书。
接下来,确保启用了所需的 Apache 模块:
sudo a2enmod rewrite ssl
之后,启用新的虚拟主机:
sudo a2ensite mta-sts
然后,运行 Apache 配置文件的语法检查,以确保没有任何意外错误:
sudo apachectl configtest
当测试通过且没有错误时,您可以重新启动 Apache 以完全启用新的虚拟主机:
sudo service apache2 restart
现在已经设置和配置了 Apache 虚拟主机,您需要创建所需的 DNS 记录以允许使用完全限定的域名 mta-sts.your-domain
访问它。
完成此操作的方式取决于您使用的 DNS 托管服务提供商。 但是,如果您使用 DigitalOcean 作为您的 DNS 提供商,只需导航到您的项目,然后单击您的域。
最后,为 mta-sts
子域添加所需的 DNS 记录。 如果您的 Droplet 仅使用 IPv4,请为 mta-sts
创建一个 A
记录,指向 your-server-ipv4-address。 如果您也使用 IPv6,请创建指向 your-server-ipv6-address 的 AAAA
记录。
在此步骤中,您为 MTA-STS 子域创建并配置了一个新的 Apache 虚拟主机,然后添加了所需的 DNS 记录以使其易于访问。 在下一步中,您将为您的 MTA-STS 子域获取可信的 Let's Encrypt 证书。
第 3 步 — 为您的 MTA-STS 子域获取 Let's Encrypt 证书
在此步骤中,您将从 Let's Encrypt 获取 TLS 证书,以允许您的 mta-sts.your-domain
站点通过 HTTPS 正确提供服务。
为了做到这一点,您将使用 certbot
,它是作为先决条件步骤 How To Secure Apache with Let's Encrypt on Ubuntu 18.04 的一部分设置的。
首先,运行 certbot
使用 Apache 插件验证方法为您的 mta-sts
子域颁发证书:
sudo certbot --apache -d mta-sts.your-domain
这将自动颁发一个受信任的证书并将其安装在您的 Apache Web 服务器上。 当 Certbot 向导询问配置 HTTP -> HTTPS 重定向时,请选择“否”,因为 MTA-STS 不需要这样做。
最后,测试您的新虚拟主机以确保其正常工作。 使用网页浏览器访问https://mta-sts.your-domain/.well-known/mta-sts.txt
,或使用curl
等命令行工具:
curl https://mta-sts.your-domain/.well-known/mta-sts.txt
这将输出您在步骤 1 中创建的 MTA-STS 策略文件:
Outputversion: STSv1 mode: testing mx: mail1.your-domain mx: mail2.your-domain max_age: 86401
如果出现错误,请确保步骤 2 中的虚拟主机配置正确,并且您已为 mta-sts
子域添加了 DNS 记录。
在此步骤中,您为您的 mta-sts
子域颁发了 Let's Encrypt TLS 证书,并测试它是否正常工作。 接下来,您将设置一些 DNS TXT 记录以完全启用 MTA-STS 和 TLSRPT。
第 4 步 — 配置启用 MTA-STS 和 TLSRPT 所需的 DNS 记录
在此步骤中,您将配置两个 DNS TXT 记录,这将完全启用您已创建的 MTA-STS 策略,并启用 TLS 报告 (TLSRPT)。
这些 DNS 记录可以使用任何 DNS 托管提供商进行配置,但在此示例中,DigitalOcean 用作提供商。
首先,登录到您的 DigitalOcean 控制面板并导航到您的项目,然后单击您的域。
然后您需要添加以下两条 TXT 记录:
_mta-sts.your-domain IN TXT "v=STSv1; id=id-value" _smtp._tls.your-domain IN TXT "v=TLSRPTv1; rua=reporting-address"
id-value
是一个字符串,用于标识您的 MTA-STS 策略的版本。 如果您更新您的策略,您还需要更新 id
值,以确保邮件提供商检测到新版本。 建议使用当前日期戳作为 id
,例如 20190811231231
(2019 年 8 月 11 日 23:12:31)。
reporting-address
是您的 TLS 报告将被发送到的地址。 这可以是前缀为 mailto:
的电子邮件地址,也可以是 Web URI,例如用于收集报告的 API。 报告地址不必是 your-domain
上的地址。 如果您愿意,您可以使用完全不同的域。
例如,以下两个示例记录都是有效的:
_mta-sts.your-domain IN TXT "v=STSv1; id=20190811231231" _smtp._tls.your-domain IN TXT "v=TLSRPTv1; rua=mailto:tls-reports@your-domain"
根据需要调整变量,并在您的 DigitalOcean 控制面板(或您使用的任何 DNS 提供商)中设置这些 DNS TXT 记录:
设置并传播这些 DNS 记录后,MTA-STS 将使用您在步骤 1 中创建的策略启用,并将开始在您指定的地址接收 TLSRPT 报告。
在此步骤中,您配置了启用 MTA-STS 所需的 DNS 记录。 接下来,您将收到并解释您的第一份 TLSRPT 报告。
第 5 步 — 解读您的第一份 TLSRPT 报告
现在您已经为您的域启用了 MTA-STS 和 TLSRPT(TLS 报告),您将开始接收来自支持的电子邮件提供商的报告。 这些报告将显示通过 TLS 成功发送或未成功发送的电子邮件数量,以及任何错误的原因。
不同的电子邮件提供商在不同的时间发送他们的报告; 例如,Google Mail 在每天 10:00 UTC 左右发送他们的报告。
根据您在第 5 步中配置 TLSRPT DNS 记录的方式,您将通过电子邮件或 Web API 接收报告。 本教程重点介绍电子邮件方法,因为这是最常见的配置。
如果您刚刚完成了本教程的其余部分,请等到您收到第一份报告,然后您可以继续。
您通过电子邮件发送的每日 TLSRPT 报告的主题行通常类似于以下内容:
Report Domain: your-domain Submitter: google.com Report-ID: <2019.08.10T00.00.00Z+your-domain@google.com>
这封邮件会有一个.gz
格式的附件,是一个Gzip压缩包,文件名类似如下:
google.com!your-domain!1565222400!1565308799!001.json.gz
在本教程的其余部分,此文件将被称为 report.json.gz
。
将此文件保存到本地计算机,然后使用您喜欢的任何工具将其解压缩。
如果您使用的是基于 Debian 的 Linux 系统,您将能够运行 gzip -d
命令来解压缩存档:
gzip -d report.json.gz
这将生成一个名为 report.json
的 JSON 文件。
接下来,您可以直接以原始 JSON 字符串的形式查看报告,也可以使用您最喜欢的 JSON 修饰符将其转换为更易读的格式。 在此示例中,将使用 jq
,但如果您愿意,也可以使用 Python 的 json.tool
。
注意:如果没有安装jq,可以使用apt install jq
安装。 或者,对于其他操作系统,请使用 jq 中必要的 安装说明 。
jq . report.json
这将输出类似于以下内容:
Prettified report.json{ "organization-name": "Google Inc.", "date-range": { "start-datetime": "2019-08-10T00:00:00Z", "end-datetime": "2019-08-10T23:59:59Z" }, "contact-info": "smtp-tls-reporting@google.com", "report-id": "2019-08-10T00:00:00Z_your-domain", "policies": [ { "policy": { "policy-type": "sts", "policy-string": [ "version: STSv1", "mode: testing", "mx: mail1.your-domain", "mx: mail2.your-domain", "max_age: 86401" ], "policy-domain": "your-domain" }, "summary": { "total-successful-session-count": 230, "total-failure-session-count": 0 } } ] }
报告显示生成报告的提供者和报告期间,以及应用的 MTA-STS 策略。 但是,您将感兴趣的主要部分是 summary
,特别是成功和失败的会话计数。
此示例报告显示,生成报告的邮件提供商通过 TLS 成功发送了 230 封电子邮件,其中 0 封电子邮件发送未能建立正确的 TLS 连接。
如果出现故障(例如,如果 TLS 证书过期或网络上有攻击者),则故障模式将记录在报告中。 故障模式的一些示例是:
starttls-not-supported
:如果接收邮件服务器不支持 STARTTLS。certificate-expired
:如果证书已过期。certificate-not-trusted
:如果使用自签名或其他不可信证书。
在这最后一步中,您收到并解释了您的第一个 TLSRPT 报告。
结论
在本文中,您为您的域设置和配置了 MTA-STS 和 TLS 报告,并解释了您的第一个 TLSRPT 报告。
一旦 MTA-STS 启用并稳定工作一段时间,建议调整策略,增加 max_age
值,并在确定所有来自受支持提供商的电子邮件正在通过 TLS 成功传送。
最后,如果您想了解有关 MTA-STS 和 TLSRPT 规范的更多信息,可以查看它们的 RFC: