MTA-STS for Postfix

MTA-STS是拟议的RFC8461标准,已过时,已于2018年9月26日正式发布。 该标准提供了一种机制,用于通过数据加密和服务器身份验证来检测在邮件服务器之间使用完整TLS的可能性。 即,该标准几乎完全防止服务器之间的邮件通信受到干扰。

简化后,该标准的实质如下:

  1. 支持邮件服务发布策略(每个域1条TXT记录和1条HTTPS资源)。
  2. 将邮件发送到其他域时,邮件服务会检测收件人域策略。
  3. 邮件服务连接到收件人域的邮件服务器,并应用由检测到的策略设置的TLS限制(如果有)。

有好文章( 例如 )讨论了该标准本身以及为何需要该标准,将MTA-STS与其他类似计划进行了比较,甚至展示了如何编写和发布策略。 但是,找到超越第一步的方法并不是那么简单。

重新开始


在实施MTA-STS之前,您需要整理邮件服务器证书。 否则,考虑您的STS策略的邮件服务器将拒绝与您服务器的连接。 必须满足以下条件:

  • 服务器证书由公认的证书颁发机构颁发(Let's Encrypt很好)。
  • 服务器发送的证书链包括中间证书颁发机构的所有必要证书。
  • 证书的“使用者备用名称”字段带有MX服务器的DNS名称。

您可以使用以下命令使用证书来验证配置的服务器:

[ "$(LANG=C openssl s_client -connect MX.EXAMPLE.COM:25 -starttls smtp -verify_hostname MX.EXAMPLE.COM < /dev/null 2>&1 | fgrep 'error')" = "" ] && echo OK || echo FAIL 

其中MX.EXAMPLE.COM是MX服务器的域名。 为了完全符合该标准,建议不仅在证书的公用名中而且至少在主题备用名中验证所需的域名。

政策发布


为了将您的域指定为支持与其建立安全连接,您需要发布MTA-STS策略。 为此,请以指定的顺序执行以下简单步骤(给出了example.com域的示例)。

1.放置在

  https://mta-sts.example.com/.well-known/mta-sts.txt 

格式的文本文件:

版本:STSv1
模式:强制
 MX:mail.example.com
 mx:* .example.net
 MX:backupmx.example.com
最高年龄:604800

该文件必须使用Content-Type:text / plain。 不允许重定向。 换行符必须为LF或CRLF。 不允许使用空行。 最后一行可能以换行结尾,也可能不以换行结尾-允许两个选项。 冒号之前和行首不允许有空格。 冒号后的空白空间是任意数量的。 每行末尾的空白(空格,制表符等)将被忽略。

栏位值:

version :格式版本。 它应始终等于“ STSv1”。
模式 :策略模式。 可能的选项:无,测试,强制执行。 强制模式与标准的正常功能相对应-在连接到服务器时需要正确的证书和稳定的TLS连接。 测试模式要求您尝试使用安全连接,但是如果出现错误,无论如何都要通过TLSRPT机制通过管理员通知发送邮件。 “无”模式对应于这种情况,就好像根本没有发布该策略一样。 此模式对于正确禁用策略很有用。
mx :一个或多个字段,其中包含所有允许的MX域服务器的名称。 从示例中可以看到,模板是允许的,但只能作为较低级别的域。
max_age :可以缓存该策略的时间(以秒为单位),并且在该策略不再可用时,发件人可以继续使用该时间。 由于标准的这一功能,通过发布无模式新策略可以更快地禁用STS。

2.创建具有以下内容的TXT记录_mta-sts.example.com:

  v = STSv1;  id = 20160831085700Z; 

分号周围的空格可以任意设置。 在其他地方,不允许使用空格。 最后一个分号可以存在或不存在。

栏位值:

v :格式版本。 它必须始终是第一个字段,必须始终等于STSv1。
id :已发布策略的唯一标识符。 它可以是长度为1-32个字符的字符串,由寄存器和数字的字母组成。 更改id值向发件人发出信号,表明策略已更新。 因此,您需要通过首先发布新的策略文件,然后更改TXT记录中的ID来更新策略。

从现在开始,支持MTA-STS的邮件服务器将仅通过安全的证书身份验证连接将邮件发送到您的域。 那是大多数手册的结尾,但是最有趣的部分是在发送邮件时从您自己的服务器获取MTA-STS策略。

最有趣


主要困难是邮件服务器(包括Postfix)不支持此标准。 但是,这种不愉快的事情不应阻止我们。

寻找解决方案后,我进入了postfix-users邮件列表归档文件,讨论了该标准的时机。 在一篇文章中,Postfix的作者Witsa Venema指出了实现此功能的首选方向-使用外部服务器搜索TLS策略。 建议使用以下形式的配置指令:

  smtp_policy_maps =套接字映射:inet:主机:端口:名称 

我实现了这样的服务器来获取MTA-STS策略。

源代码
打包在PyPI中

该应用程序缺少RFC8461规定的某些功能,例如:主动策略检索,报告和限制策略请求的频率。 但是,它执行的主要功能是检测TLS策略并对其进行缓存。

该应用程序需要Python 3.5.3+。 可以使用以下步骤完成安装和配置该守护程序。

软件包安装


运行命令就足够了:

 pip3 install postfix-mta-sts-resolver 

替代安装方法在此处编写。

创建配置文件


如果您对默认设置感到满意,那么该命令就足够了

 touch /etc/postfix/mta-sts-daemon.yml 

否则,可以从示例中获取配置,并根据您的需求进行定制。

我认为最重要的参数是strict_testing参数。 如果将其设置为true(默认情况下为false),则即使对于具有处于测试模式的策略的域,应用程序也将返回安全策略。 此行为违背标准,但出于实际原因建议这样做:如果域所有者即使在测试模式下也已发布了STS策略,则他可能已经准备好了。 也就是说,今天gmail.com邮件将通过可靠的连接发送。

创业组织


在systemd的情况下,只需在/etc/systemd/system/mta-sts-daemon.service中放置一个简单的单元文件就足够了

之后,仍然需要重新读取systemd配置,启用守护程序的自动运行并启动它:

 systemctl daemon-reload systemctl enable mta-sts-daemon.service systemctl start mta-sts-daemon.service 

健康检查


假设使用默认端口,该命令

 /usr/sbin/postmap -q dismail.de socketmap:inet:127.0.0.1:8461:postfix 

应该带来

 安全匹配= mx1.dismail.de 

连接到Postfix


在main.cf中添加一行:

 smtp_policy_maps = socketmap:inet:127.0.0.1:8461:postfix 

重新启动后缀:

 systemctl reload postfix.service 

如果一切都正确完成,则在/var/log/mail.info日志中进行STS连接

 建立信任的TLS连接 

记录开始出现

 已建立验证的TLS连接 


结论


如果您到达这个地方,则最有可能意味着:

  • 您阅读文章时没有任何图像。
  • 随着其他邮件服务实施新标准,您的域中拦截邮件的可能性每天都会下降。

Source: https://habr.com/ru/post/zh-CN424961/


All Articles