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

邮件传输代理严格传输安全,MTA-STS,是一种新的Internet标准,允许您为支持的电子邮件提供商之间发送的电子邮件启用严格强制TLS。在本教程中,您将学习如何为您的域名配置MTA-STS和TLSRPT,然后解释您的第一个TLS报告。

作者选择了Electronic Frontier Foundation Inc作为Write for DOnations计划的一部分进行捐赠。

介绍

邮件传输代理严格传输安全(MTA-STS)是一种新的Internet标准,允许您为支持的电子邮件提供商之间发送的电子邮件启用严格强制TLS。 它类似于HTTP严格传输安全性(HSTS) ,其中设置了force-TLS策略,然后缓存了指定的时间,从而降低了中间人或降级攻击的风险。

MTA-STS由SMTP TLS报告(TLSRPT)补充,可以让您深入了解哪些电子邮件通过TLS成功传送,哪些不是。 TLSRPT类似于DMARC报告 ,但对于TLS。

为您的域实施MTA-STS的主要原因是确保发送给您的机密电子邮件通过TLS安全传输。 其他需要TLS进行电子邮件通信的方法仍然容易受到中间人攻击,因为初始连接是未加密的。 MTA-STS确保默认情况下初始传入连接使用TLS,这大大降低了这些攻击的风险。

MTA-STS和TLS报告的示例用例是帮助您的企业创建安全的客户服务电子邮件系统。 客户可以通过电子邮件发送支持票,其中包含需要安全TLS连接的机密个人信息。 MTA-STS提供安全连接,TLSRPT将提供每日报告,识别未安全发送的任何电子邮件,从而对任何正在进行或以前针对您的电子邮件系统的攻击提供重要信息。

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

先决条件

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

准备好后,以非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所有电子邮件mail1. your-domain mail1. your-domainmail2. your-domain 必须通过有效的TLS连接提供来自受支持的提供商的mail2. your-domain 如果无法与邮件服务器建立有效的TLS连接(例如,如果证书已过期或已自签名),则不会传递电子邮件。

这将使攻击者在类似中间人攻击的情况下拦截和窥探/修改您的电子邮件变得更具挑战性。 这是因为正确启用MTA-STS只允许通过有效的TLS连接传输电子邮件,这需要有效的TLS证书。 攻击者很难获得这样的证书,因为这样做通常需要特权访问您的域名和/或网站。

如此步骤前面的示例所示,配置文件由许多键/值对组成:

  • version

    • 目的 :指定要使用的MTA-STS规范的版本。
    • 接受的值 :目前唯一可接受的值是STSv1
    • 示例version: STSv1
  • mode

    • 目的 :指定应启用MTA-STS的模式。
    • 接受的价值观
      • enforce :强制所有来自受支持提供商的传入电子邮件使用有效的TLS。
      • testing :仅报告模式。 电子邮件不会被阻止,但仍会发送TLSRPT报告。
      • none :禁用MTA-STS。
    • 示例mode: enforce
  • mx

    • 目的 :指定允许哪些邮件服务器处理您的域的电子邮件。 这应该与mx记录中指定的服务器匹配。
    • 接受的值 :邮件服务器或通配符主机的完全限定域名。 必须使用多个mx:值来指定多个邮件服务器。
    • 示例mx: mail1. your-domain mx: mail1. your-domainmx: mail2. your-domain mx: mail2. your-domainmx: *.example.org
  • max_age

    • 目的 :指定MTA-STS策略的最长生存期,以秒为单位。
    • 接受的值 :任何正整数,最大为31557600。
    • 示例max_age: 604800 (1周)

您还可以在MTA-STS RFC的第3.2节中查看键/值对的官方规范。

警告:enforce模式下启用MTA-STS可能会意外导致某些电子邮件无法发送给您。 相反,建议首先使用mode: testing和low max_age: value,以确保在完全打开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. your-domain /.well-known/mta-sts.txt 您必须通过HTTPS和/.well-known/mta-sts.txt路径使用mta-sts子域,否则您的配置将无法正常工作。

这可以通过为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的/网站可用/ 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. 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访问它mta-sts. your-domain mta-sts. your-domain

这样做的方式取决于您使用的DNS托管服务提供商。 但是,如果您使用DigitalOcean作为DNS提供商,只需导航到您的项目,然后单击您的域。

最后,为mta-sts子域添加所需的DNS记录。 如果您的Droplet仅使用IPv4,请为mta-sts创建A记录,指向您的 mta-sts -ipv4-address 如果您也使用IPv6,请创建指向您的-server-ipv6-addressAAAA记录。

DigitalOcean DNS控制面板的屏幕截图,显示指向IPv4地址的mta-sts的示例DNS记录。

在此步骤中,您为MTA-STS子域创建并配置了新的Apache虚拟主机,然后添加了所需的DNS记录以便轻松访问它。 在下一步中,您将获得MTA-STS子域的受信任的Let's Encrypt证书。

第3步 - 为您的MTA-STS子域获取Let的加密证书

在此步骤中,您将从Let's Encrypt获取TLS证书,以允许您的mta-sts. your-domain mta-sts. your-domain网站可通过HTTPS正确投放。

为此,您将使用certbot ,它是您在Ubuntu 18.04上如何使用Let的加密来保护Apache的先决条件步骤的一部分。

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

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

这将自动颁发受信任的证书并将其安装在Apache Web服务器上。 当Certbot向导询问有关配置HTTP - > HTTPS重定向时,请选择“否”,因为MTA-STS不需要这样做。

要完成,请测试新的虚拟主机以确保其正常运行。 使用Web浏览器访问https://mta-sts. your-domain /.well-known/mta-sts.txt 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策略文件:

version: 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记录:

DigitalOcean控制面板的屏幕截图,显示正在设置的_mta-sts DNS TXT记录。

DigitalOcean控制面板的屏幕截图,显示正在设置的_smtp._tls DNS TXT记录。

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

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

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

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

不同的电子邮件提供商在不同时间发送报告; 例如,Google Mail每天10:00左右发送报告。

根据您在第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

这将输出类似于以下内容:

{
    "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成功传送来自支持的提供商的所有电子邮件后,最终将其切换为enforce模式。

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