第十五章:技术边缘慢速传输涓流传输传输表仅发送服务器Postfix作为SMTP客户端直接发件人配置OpenDKIM MilterDKIM密钥生成配置Postfixnolisting使用 MTA-STS 进行证书验证提供MTA-STS通过TLS-RPT接收报告MTA-STS政策MTA-STS DNS记录阅读报告正在验证 MTA-STSpostfix-mta-sts-resolver将Postfix连接到MTA-STS解析器
这本书包含了每个人都必须知道的内容,而不是每个人都应该知道的主题。在查看不常用的想法时要小心。电子邮件的挑战-响应(challenge-response)身份验证等工具可能对你来说很方便,但它会产生反向散射,并将你的系统添加到DNSBL中。电子邮件不是一个聪明的地方。电子邮件是一个无聊的地方。
考虑到这一点,这里有一些常见的技术问题,你们中的许多人会需要或发现它们很有用。
有时,你确实需要通过微软或谷歌的邮件联系200人,但突然大量发送电子邮件是可能感染垃圾邮件机器人的主要指标。我每天给电子邮件帝国的人发邮件,但一次一个。然而,当我写完这本书时,我必须通过电子邮件通知我的赞助商。大约三分之一的赞助商拥有Gmail或微软支持的电子邮件地址。如果我突然在这两个网站上都发了几十条信息,帝国会振作起来,仔细看看我的主人。躲避注意是最好的防御,所以随意飞行。
Postfix通常会在系统支持的情况下尽可能快地发送电子邮件,但您可以故意限制它发送到选定网站的速度。也许同时向30个收件人发送相同的消息会唤醒Gmail的垃圾邮件守护者,但这些相同的消息一次发送一条,相隔几秒甚至一分钟,都会被忽视。电子邮件不是实时协议,因此这些消息可以等待几分钟甚至一个小时。Postfix通过队列管理器和传输映射控制交付速度。
transport map 告诉Postfix如何将邮件发送到目的地。到目前为止,我们还不需要它,因为几乎每个人的MTA都使用SMTP。如果特定目的地的消息需要通过UUCP、信鸽或走私到机器人内部,您可以使用 transport map 来配置目的地和交付程序。
队列管理器 qmgr(8)
是处理Postfix所有各种队列的服务,包括出站消息队列。它安排投递重试,并在队列之间移动邮件。我们将定义一个传输,它说“使用超级限制设置调用队列管理器”,然后构建一个将目标域附加到该传输的映射。
队列管理器是Postfix中最复杂的部分。经过多年的实际测试和评估,它的默认设置发生了变化。不要轻玩它。试图“优化”它以获得“更好的性能”,无论这意味着什么,几乎总是不明智的。
在 /etc/postfix/master.cf 中定义传输。我们将在第3章讨论 master.cf 。这里有一个名为 trickle (涓流)的故意限制传出SMTP传输的示例:
xxxxxxxxxx
trickle unix - - n - - smtp
-o syslog_name=postfix-trickle
-o trickle_destination_concurrency_limit=1
-o trickle_destination_rate_delay=1m
-o trickle_destination_recipient_limit=5
-o trickle_destination_concurrency_failed_cohort_limit=10
-o smtp_tls_security_level=encrypt
trickle
传输在Unix套接字上监听。这是一项没有特权的公共服务,不能 chrooted。它根据需要运行尽可能多的进程,并且不按计划调用。最后,它使用给定的选项运行 smtp(8)
命令。
第一个选项 syslog_name
告诉Postfix如何记录来自此传输的消息。在系统日志中使用单独的名称有助于进行故障排除,并验证特定消息是否通过此传输离开了我们的服务器。
以下所有选项的名称都以 trickle
开头,用于将选项附加到传输。它们在手册中使用“transport(传输)”一词而不是传输名称进行记录。例如, trickle_destination_concurrency_limit
被记录为 transport_destination_concurrency_limit
。
选项 trickle_destination_concurrency_limit
设置Postfix将并行向单个域发送的数量。我已将其设置为1,因此Postfix将尝试一次向每个域传递一条消息。如果我向Gmail的一群人和微软的一群人发送消息,这个设置会将这些消息分成两个单独的流。
使用 trickle_destination_rate_delay
,我设置了Postfix在尝试传递到单个域之间等待的时间。如果不指定时间单位,则默认为秒。在这里,我把它设置为一分钟。结合并发限制,我们将一次发送一条消息,并为每个域的每条消息等待一分钟。
trickle_destination_recipient_limit
设置一个事务中域的收件人数量。也许我在Gmail上复制了50个人的这封邮件,但收件人限制为5人意味着这封邮件最多只能同时发送给5个收件人。
使用 trickle_destination_concurrency_failed_cohort_limit
控制容错。如果Postfix连续多次尝试向域传递失败,它会将目标域放置在临时的“dead domain(死域)”列表中,并稍后尝试。
最后,我还在这个连接上添加了对TLS的要求。任何规模如此之大,以至于他们坚持让我放慢速度的公司肯定都在使用TLS。
使用传输表 /etc/postfix/transport 将域路由到特定的传输。这是一个通用的键值表,域在左边,传输在右边:
xxxxxxxxxx
gmail.com trickle:
每次更新传输表时,都要更新哈希文件:
xxxxxxxxxx
# postmap transport
现在你已经有了涓流传输和一个可以告诉Postfix哪些域要涓流的映射,添加一个 main.cf 条目来通知Postfix它们存在。
xxxxxxxxxx
transport_maps = hash:/etc/postfix/transport
重新启动Postfix并向涓滴目标发送测试邮件。邮件日志应显示一条使用您自定义日志名称的消息。
xxxxxxxxxx
Feb 12 15:42:20 mail postfix-trickle/smtp[98708]: 9A1AEA578: to=…
你的电子邮件系统已经爬行到足以让电子邮件帝国接受它的程度。恭喜你。我猜。
我已经配置了多个应用程序,这些应用程序应该在用户的帐户更新、寄存(deposit)或签发新权证时通知用户。这些应用程序经常使用不完整的SMTP实现,这些实现不符合当前标准,不理解TLS,或者缺乏文档和调试。与其与这些客户端抗争,通常更容易在服务器上安装Postfix,并告诉应用程序通过本地主机或 sendmail(8)
发送邮件。
您可以让这样的服务器将所有内容直接发送到其目的地,也可以让它通过智能主机中继。让主机向世界发送自己的消息是一种更简单的Postfix配置,但需要编辑您的SPF和DKIM DNS记录。使用智能主机是一个稍微复杂的Postfix配置,它增加了出站邮件对MTA的依赖性,但不会改变DNS。你有很多烦恼!
然而,这两种配置共享一些 main.cf 设置。仅发送服务器(send-only servers)只接受来自本地主机的连接,因此将Postfix绑定到 localhost
:
xxxxxxxxxx
inet_interfaces = 127.0.0.1
您可能会有一些本地别名,将消息路由到 root
、 www
等,并发送给应该阅读它们的人。激活别名文件:
xxxxxxxxxx
alias_maps = hash:/etc/aliases
所有其他配置取决于您希望系统如何工作。
您可以将MTA配置为接受来自已知主机的邮件,对其进行签名,然后将其发送到世界各地。这有助于减少您必须支持的SPF记录和DKIM密钥的数量,但会使这些主机依赖于您的MTA来发送邮件。
在MTA上,验证您是否拥有将通过服务器中继邮件的所有域的DKIM密钥。客户端地址必须列在 mynetworks
中。对于rspamd,请在 /etc/rspamd/local.d/options.inc 中的 local_addrs
中列出相同的源地址。重新启动rspamd和Postfix。
在客户端上,按照本章前面的内容设置 inet_interface
和 alias_maps
。同时,将 relayhost
设置为指向您的MTA:
xxxxxxxxxx
inet_interfaces = 127.0.0.1
alias_maps = hash:/etc/aliases
relayhost = mail.ratoperatedvehicle.com
重新启动客户端的Postfix。
现在,您应该能够通过MTA将邮件从客户端计算机发送到世界各地。MTA应添加DKIM签名。像往常一样,测试一下,看看会发生什么。当你遇到问题时,仔细阅读你的日志。
让您的web服务器直接向互联网发送邮件很容易在Postfix中设置,但需要配置DKIM签名者并编辑SPF和DKIM记录。在这里,我正在配置我的主机 www.ratoperatedvehicle.com
,以便直接向外部MTA发送邮件。此主机未在MX记录中列出,因此答复将发送到实际的MTA。
发件人需要DKIM签名者。Rspamd对于不接收邮件的主机来说是多余的。我推荐OpenDKIM。几乎每个Unix都有一个OpenDKIM包。虽然它支持数据库后端和为特定用户使用特定签名密钥等功能,但对于小型服务器来说,这些功能也是多余的。如果您需要支持数百个域,请调查这些功能。
从操作系统的软件包中安装OpenDKIM。一些操作系统,如Debian,假设您将在milter模式下运行OpenDKIM,并为您创建一个无特权的用户和套接字目录。其他人,比如FreeBSD,认为你不会,让你创建套接字目录和一个无特权的opendkim用户和组来拥有它们。向 opendkim
组添加 postfix
,以便它可以访问 run 目录和套接字。
在 /etc/mail/opendikm.conf 中配置OpenDKIM。哈希标记表示注释,但您不需要等号来为变量赋值。
OpenDKIM使用模式设置来确定它是在验证消息,还是在验证和签名。 s
表示签名, v
表示验证:
xxxxxxxxxx
Mode s
Socket
设置告诉OpenDKIM将 milter 套接字放置在何处。OpenDKIM可以监听网络,但除非你有太多的邮件负载,需要一个专用的主机来处理DKIM,否则请使用本地套接字。类似地,PidFile告诉密耳计在哪里记录PID。
xxxxxxxxxx
Socket local:/var/run/opendkim/opendkim.sock
PidFile /var/run/opendkim/opendkim.pid
定义无特权用户和用户在启动milter时将使用的umask。umask为 007
意味着用户opendkim
和组中的其他人可以使用套接字,但其他人不能。
xxxxxxxxxx
UserID opendkim
UMask 007
OpenDKIM的权限可能很棘手。如果 opendkim
组有 opendkim
以外的任何用户,则某些OpenDKIM软件包将不会对消息进行签名。但是,postfix
用户需要访问milter套接字。解决方案是将套接字目录归用户 root
和组 postfix
所有。这样,就创建了具有该所有权的milter套接字,Postfix可以调用milter。
我们还必须告诉OpenDKIM在哪里可以找到密钥和签名表。签名表有通配符,因此将其标识为使用带有 refile
关键字的正则表达式:
xxxxxxxxxx
KeyTable /etc/mail/opendkim.keytable
SigningTable refile:/etc/mail/opendkim.signingtable
有了这个,您可以配置milter进程在系统启动时启动。检查您的邮件日志,确保它正确启动并继续运行。
DKIM密钥需要与任何公钥/私钥相同的处理。必须保护秘密私钥。虽然公钥将通过DNS与全世界共享,但您不需要将密钥文件放置在可公开访问的目录中。创建一个目录来拥有这些密钥,并使除 root
和 opendkim
之外的任何人都无法访问它。我使用的是 /var/db/opendkim 。
xxxxxxxxxx
# install -d -m 0750 -o opendkim -g opendkim /var/db/opendkim
为了清楚起见,我建议为每个您签名的域提供自己的密钥目录。所有目录必须归 opendkim
所有。如果您在新密钥上出现权限错误,请检查 root
是否拥有目录或文件。
在域目录中,使用 opendkim-genkey(8)
创建密钥对。它需要两条信息,选择器和域名。同样,选择器只是一个名称。您可以使用任何文本字符串。选择器出现在签名中,因此请尽量避免使用淫秽内容。为每个域使用不同的选择器。使用 -d
表示域名,使用 -s
表示所选的选择器。 -b
标志允许您设置比特数,2048
是目前的建议。在这里,我添加了 -v
用于详细输出:
xxxxxxxxxx
# opendkim-genkey -d ratoperatedvehicle.com -s wookie -b 2048 -v
opendkim-genkey: generating private key
opendkim-genkey: private key written to wookie.private
opendkim-genkey: extracting public key
opendkim-genkey: DNS TXT record written to wookie.txt
你会得到两个文件, wookie.txt 和 wookie.private 。 wookie.private 文件是私钥,而 wookie.txt 是包含正确编码的公钥的DKIM DNS记录。
如果没有每个域的目录,请为这些文件命名,其中包括选择器和域名。不过,当需要轮换DKIM密钥时,您会希望每个域使用一个目录。
创建一个密钥表和一个签名表,就像我们在第10章中使用rspamd一样。这将您的密钥连接到域。现在更新您的DKIM和SPF记录并配置Postfix。
来自此主机的邮件不应显示为来自主机名。我希望它显示为纯域,以便回复到MX记录中列出的实际MTA。在 main.cf 中,将 myhostname
和 mydomain
设置为所需的域。还要将Postfix锁定到环回接口并设置任何别名。
xxxxxxxxxx
inet_interfaces = 127.0.0.1
alias_maps = hash:/etc/aliases
myhostname = ratoperatedvehicle.com
mydomain = ratoperatedvehicle.com
本地应用程序可能通过端口25上的SMTP提交邮件。他们可能会通过 sendmail(8)
提交邮件。通过在两条路径上启用DKIM milter来允许两条路径。
xxxxxxxxxx
smtpd_milters=unix:/var/run/opendkim/opendkim.sock
non_smtpd_milters=unix:/var/run/opendkim/opendkim.sock
运行 tail -f /var/log/maillog
以观察问题,然后重新启动Postfix。它应该会干净地重新启动,但在Postfix尝试处理电子邮件之前,许多问题都不会出现。保持日志打开,让你的主机发送一封电子邮件。
如果OpenDKIM以您不期望的方式运行,例如不使用密钥对域的消息进行签名,请使用milter的 -l
选项启用详细的日志记录。如果该日志无法解释您所看到的内容,请使用 -W
启用Why?! 日志。此日志解释了OpenDKIM以更大的日志为代价做出的决定。您还可以使用 opendkim.conf 选项启用完整日志记录。
xxxxxxxxxx
Syslog yes
LogResults yes
LogWhy yes
让服务器直接发送还是通过MTA中继所有内容更好?这取决于您的环境、连接性和要求。做出最好的猜测,并接受它。
垃圾邮件机器人都选择快捷方式。Postscreen捕捉到了其中的许多。灰名单与其他人对抗。许多垃圾邮件机器人选择的一个流行快捷方式是忽略备份MX记录。这些垃圾邮件机器人试图联系目标的主要MX,但如果失败,它们会继续联系下一个受害者。
记住,SMTP协议起源于“高可用性”意味着购买昂贵的机器,“虚拟化”意味着在一台机器上托管多个域。当硬件发生故障时,它可能会离线几天,直到30吨重的替换品从几个州以外的18轮拖拉机拖车上运来。合法的MTA必须与备份MX通信。
如果大多数垃圾邮件发送者忽略备份MX,但合法发送者尊重它……如果你关闭主MX中列出的MTA怎么办?如果它甚至不运行MTA怎么办?合法发件人退回备份,优化的垃圾邮件发送者放弃。这就是 nolisting 背后的想法。
考虑这些MX记录:
xxxxxxxxxx
ratoperatedvehicle.com 3600 IN MX 10 www.ratoperatedvehicle.com.
ratoperatedvehicle.com 3600 IN MX 20 mail.ratoperatedvehicle.com.
主MX是web服务器,而备份是MTA?一个人会看着这些并说“哇,这有点奇怪,但没关系。”这里的诀窍是,网络服务器不接受端口25上的连接。如果有人错误配置了该主机上的MTA,它有一个数据包过滤器来阻止端口25上的所有连接。如果该组织的监控系统检测到端口25打开,它会发出警报。
Spambots立即放弃。合法的MTA会立即打开与备份MX的连接并传递其邮件。它对外部MTA施加的负载比灰名单少。
Nolisting需要技术能力。主MX必须位于具有您控制的真实IP地址的真实主机上,并且您必须能够保证它永远不会接受SMTP连接。你不能列出私有地址、本地主机或任何类似的聪明东西。管理不善意味着电子邮件丢失。
Nolisting的争议性比灰名单小,但这只是因为它不太为人所知。有些人发誓这是他们最好的反垃圾邮件防御。其他人则宣称它毫无用处。它对你有用吗?这完全取决于你吸引的垃圾邮件机器人的类型。
服务器到服务器SMTP历史上接受自签名证书。是的,用户看到的所有东西都有一个漂亮的安全封条,但用户看不到的一切都是用废纸屑和腐烂的胶带和幼儿园贴纸粘在一起的。全球有效的证书越来越少,但仍然是少数。在没有被告知这样做是安全的情况下,您无法验证证书的真实性。DANE是做出声明的一种方式。邮件传输代理严格传输安全(Mail Transfer Agent Strict Transport Security —— MTA-STS)是另一种。
使用MTA-STS通知兼容的外部MTA,您的MTA具有全局有效的X.509证书,他们应该验证其有效性并使用它。配套协议TLS报告(TLS Reporting —— TLS-RPT)允许外部MTA告诉您MTA的TLS和/或DANE配置存在问题。MTA-STS需要具有有效证书或有效DANE的web服务器。
为什么MTA-STS和DANE都有?DANE是一个有着几十年历史的社区项目,现已发展成为一个标准,并与证书颁发机构分开存在。MTA-STS由谷歌、微软和Verizon创建,需要证书颁发机构。DANE的传播范围要广得多,但MTA-STS增加了对大型航空公司进行中间人(man-in-the-middle)攻击的难度。
当支持MTA-STS的MTA连接到域的SMTP服务器时,它首先检查区域中的 _mta-sts
TXT记录。如果该记录存在并且格式正确,则MTA会在域网站上的标准位置查找策略文件。该策略文件告诉MTA收件人域所需的TLS强制类型。如果MTA能够遵守,它就会发送消息。如果MTA不符合要求,它将使用TLS-RPT通知远程服务器存在问题。对受MTA-STS保护的站点执行中间人攻击需要多个伪造的X.509证书,并使用两种不同的协议拦截到多个主机的流量。
你今天需要MTA-TS吗?这取决于你的环境。如果你正在为自己和几个朋友或一个小组织运行电子邮件,也许不需要。如果你想传输机密信息,你应该使用SMTP以外的协议。然而,你无法控制其他人会选择向你发送什么信息,如果他们可能会发送他们的病史或密码,甚至我把偷来的计划藏在矮胖的机器人里,也许你应该使用MTA-TLS来降低风险。
为您的域设置MTA-STS告诉外部MTA在邮寄您时使用正确的DNS。它需要设置一个用于接收报告的通道、网站上的策略文件和DNS记录。DNS记录是最简单的,但一旦它存在,外部人员就会开始寻找另外两个,所以最后再做。
如果您有多个域使用单个MTA,请从MTA所在的域开始。我的所有域都将 mail.ratooperatedvehicle.com
列为它们的MX,所以我会先这样做。
仅仅因为你的TLS对你来说很好,并不意味着它对其他人都有效。MTA-STS是一种罕见的情况,如果电子邮件帝国发现问题,他们会告诉你。在配置MTA-STS之前,请设置TLS-RPT,以便外部人员可以报告问题。
您可以通过HTTPS或电子邮件接收报告。运行大型电子邮件系统的人可能想设置基于网络的报告仪表板,但目前还没有免费的版本。使用电子邮件。TLS故障报告被特别允许忽略SMTP TLS错误,即使这意味着它们是通过2000年代风格的草率TLS发送的,甚至是未加密的。毕竟,你无法解决你不知道的问题。您还可以使用域外的报告地址,该地址可能仍具有可用的TLS。
使用TLS-RPT DNS记录声明收件人地址。
_smtp._tls.domain TXT "v=TLSRPTv1;rua=reportaddress"
_smtp._tls
记录是域内TLS-RPT记录的标准。这是一个文本记录。该值始终以版本号开头;忽略以 v=TLSRPTv1
以外的任何内容开头的TLS-RPT记录。之后,使用 rua=
给出应报告的电子邮件地址错误。这是我的域名 mwl.io
的完整记录:
xxxxxxxxxx
_smtp._tls.mwl.io. TXT "v=TLSRPTv1;rua=mailto:mwl@mwl.io"
重新加载区域告诉世界在哪里通知我的错误。现在,我们来制定一项政策。
策略文件声明了您希望MTA的当前TLS配置如何工作,以及应如何严格执行该策略。它必须通过HTTPS在您的域内的主机 mta-sts
上可用,网址为 well-known/mta-ts.txt 。如果我想在我的域名 ratoperatedvehicle.com
上激活MTA-STS,我必须将策略放在 https://mta-sts.ratoperatedvehicle.com/.well-known/mta-sts.txt
。向Gmail和微软等提供商询问他们的政策。
策略最关键的部分是 mode ,告诉外部MTA如何使用该策略。 testing 模式意味着您还不信任您的TLS配置,并且您希望外部MTA从您那里传递消息,但报告任何错误。 enforce 模式意味着您希望外部MTA在从您的系统收到TLS错误时拒绝传递邮件,并报告该错误。最后一种模式, none ,意味着这项政策正在被放弃——可能是因为你正在重新构建一切。每项政策都应该从测试模式开始,只有在几周内没有问题后才能进入enforcing 模式。
简单的需要四个字段:版本、模式、mx
语句列表和 max_age
。
策略版本始终为 STSv1
,因为不存在其他版本。
mode 式是 enforce
、 testing
或 none
之一。始终从 testing
开始。
xxxxxxxxxx
version: STSv1
mode: testing
列出此策略适用的MTA。我的域 ratoperatedvehicle.com
的主传入MTA为 mail.ratooperatedvehcle.com
,但假设我在 mail.solveamurder.org
上也有一个备份MTA,可能还有一个在 mwl.io
域中。在 mx
语句中分别列出每个。使用星号表示“此域中的任何主机”。域的 mx
列表应包括该区域mx DNS记录中的每个条目。
xxxxxxxxxx
mx: mail.ratoperatedvehicle.com
mx: mail.solveamurder.org
mx: *.mwl.io
最后, max_age
给出了外部MTA应该缓存此策略的时间(秒)。根据标准,一旦您的策略是 enforcing
,外部MTA应该能够缓存此策略数周。在测试时,您可能希望将其设置得更低。然而,许多网站拒绝时间低于86000秒。最大 max_age
为一年,但一到两周的生产策略被认为是合适的。
xxxxxxxxxx
max_age: 86400
MTA-STS缓存策略由 max_age
决定。策略是通过DNS记录发现的,这些记录以自己的过期时间独立缓存。在进行故障排除时,您必须留出足够的时间让旧DNS条目和旧策略从客户端缓存中过期。
在标准URL上提供此策略,您就可以告诉全世界了。
现在你有了报告地址和政策,你可以要求人们尊重他们。MTA-STS记录看起来像这样:
_mta-sts.domain IN TXT "v=STSv1; id=string;"
_mta-sts
记录告诉外部MTA在标准定义的位置存在策略,他们应该尊重该策略。v
给出的版本始终是 STSv1
,必须首先出现。如果其他内容首先出现,则记录将被拒绝。最后, id
是标识此特定策略的文本字符串。当外部MTA缓存策略时,它会记录标识符。如果标识符没有更改,则外部MTA知道策略没有更改。更改策略时,必须更新标识符。我分配标识符的方式与分配区域序列号的方式相同,即使用日期和增量。这是 ratoperatedvehicle.com
的记录。
xxxxxxxxxx
_mta-sts TXT "v=STSv1; id=2024022901;"
有了此记录,支持MTA-STS的外部主机将开始更好地关注您的X.509证书。
证明否定是困难的。我强烈建议使用外部TLS-RPT和MTA-STS检查器,如 mxtoolbox.com
上的检查器,来验证您的记录和策略是否解析有效。现在让我们看看如何在其他主机上检查MTA-STS和TLS-RPT。
一旦您的MTA-STS记录在DNS中可用,外部MTA-STS验证器将查询您的策略。每天,通过邮件发送系统的外部MTA-STS验证器都会向您的TLS-RPT记录中的地址发送摘要报告。该消息将有一个主题,声明一个报告域、一个提交者和一个报告ID。
xxxxxxxxxx
Subject: Report Domain: ratoperatedvehicle.com Submitter: google.com Report-ID: <2024.03.06T00.00.00Z+ratoperatedvehicle.com@google.com>
报告将以指定文件名格式的JSON文件(可能已压缩)附加。
source!policy-domain!start-time!end-time!unique-ID.json
source 是发送报告的域。policy domain 是报告涵盖的域。开始和结束时间是划时代的日期。可选的 unique identifier 是用于区分报告的字母数字代码。微软关于我2024年3月4日的域名 mwl.io
的报告文件,文件名类似于 Microsoft.com!mwl.io!1709596800!1709683199!133542271575453541.json 。微软使用长唯一ID,而谷歌使用类似 001
的ID。
不幸的是,目前还没有一个开源的报告聚合器。您必须使用 jq(1)
或您最喜欢的JSON转换器,使其易于阅读。
xxxxxxxxxx
$ jq . /tmp/microsoft.com\!mwl.io\!1709596800…
报告以标识组织的基本信息开头:
xxxxxxxxxx
{
"organization-name": "Microsoft Corporation",
"date-range": {
"start-datetime": "2024-03-05T00:00:00Z",
"end-datetime": "2024-03-05T23:59:59Z"
},
"contact-info": "tlsrpt-noreply@microsoft.com",
"report-id": "133542271517543541+mwl.io",
该报告包括其缓存的MTA-STS策略版本。如果您最近更改了政策,这一点很重要:
xxxxxxxxxx
"policies": [
{
"policy": {
"policy-type": "sts",
"policy-string": [
"version: STSv1",
"mode: testing",
"mx: mail.ratoperatedvehicle.com",
"mx: www.mwl.io",
"max_age: 86400"
],
"policy-domain": "mwl.io"
},
最后,我们总结了结果:
xxxxxxxxxx
"summary": {
"total-successful-session-count": 6,
"total-failure-session-count": 0
}
在强制模式下,失败的会话表示发送方不会传输的消息,因为它无法验证您的X.509证书。那是退回的邮件。在测试模式下,这些消息无论如何都会被传递。总体而言,这意味着微软可以接受我要求他们验证我的服务器证书。
同一天,谷歌发布了一份报告,其中包含了这一趣闻:
xxxxxxxxxx
…
"policy": {
"policy-type": "no-policy-found",
"policy-domain": "mwl.io"
…
no-policy-found 的策略类型?微软发现了我的政策,各种在线验证器找到了我的策略,为什么谷歌没有呢?这个错误具有误导性。他们找到了该政策,但拒绝了。要弄清楚他们拒绝的原因,需要仔细阅读他们的MTA-STS要求页面,并将其与我的政策进行比较。
一旦您的所有每日报告都表明您的MTA X.509证书定期进行例行验证,您就可以将策略更改为 enforcing
。
MTA-STS和DANE在电子邮件生态系统中占据了类似的空间,Postfix只能为每个目的地验证其中一个。DANE要广泛得多,因此Postfix开发人员建议默认验证DANE,并且只将已知使用MTA-STS的选定目标引导到它。
首先安装并测试postfix-mta-sts-resolver,然后告诉Postfix使用它。
postfix-mta-sts-resolver包包含 mta-sts-daemon
,用于检查、验证和缓存MTA-STS策略。它用Python编写,用YAML配置。默认情况下,守护进程侦听 localhost
端口8461。您可以在配置文件 /etc/mta-sts-daemon.yml 中更改它。虽然你可以调整配置以支持sqlite或Redis中的数据,但默认配置对于这些小用途来说是完美的。
附带的 mta-sts-query
实用程序要求 mta-sts-daemon
检索域的MTA-STS策略。使用它来检查域是否不仅配置了 _mta-sts
DNS记录,还配置了可解析策略。
xxxxxxxxxx
$ mta-sts-query solveamurder.org
(<STSFetchResult.NONE: 0>, None)
此域没有MTA-STS,但正如您所料,Microsoft的托管Outlook有。
xxxxxxxxxx
$ mta-sts-query outlook.com
(<STSFetchResult.VALID: 1>, ('20190225000000Z', {'mx': ['*.olc.protection.outlook.com'], 'version': 'STSv1', 'mode': 'enforce', 'max_age': 604800}))
这是一个Python对象转储(object-dump)。它几乎是JSON,但不完全是JSON。您可以看到,我们获得了一个接收此域邮件的有效MTA列表,并且正在执行该策略。Postfix将进行自己的MX记录查找,但如果MTA-STS策略中未列出MTA,Postfix将不会使用它。
现在我们可以指示Postfix使用MTA-STS而不是DANE。
Postfix支持TLS策略映射(TLS policy map),通过选项 smtp_tls_policy_map
设置它应该如何连接到外部MTA。这很像本章前面演示的用于限制出站邮件的传输策略映射。
在 /etc/postfix/master.cf 中,创建一个使用:
xxxxxxxxxx
mta-sts unix - - n - - smtp
-o syslog_name=postfix-mta-sts
-o smtp_tls_security_level=secure
-o smtp_tls_policy_maps=socketmap:inet:127.0.0.1:8461:postfix
此传输名为 mta-sts
,看起来像我们的常规出站SMTP服务,但有一些额外的选项。
syslog_name
选项在日志中为传输提供了自己的名称,因此我们可以轻松验证哪些电子邮件使用它,并可以很容易地跟踪问题。
通过将 smtp_tls_security_level
设置为 secure
,我们告诉Postfix完全验证外部MTA的X.509证书。
使用 smtp_tls_policy_maps
将mta-sts-daemon集成到此传输中。 socketmap
关键字告诉Postfix这是一个套接字,而不是一个文件。这是一个网络套接字,位于 localhost
端口 8461
上。Postfix将通过名称 Postfix
来标识自己。
现在转到传输映射 /etc/postfix/transport,并将收件人域定向到该传输。
xxxxxxxxxx
outlook.com mta-sts:
运行 postmap /etc/postfix/transport
。重新启动Postfix。发送测试消息。日志应显示使用该传输的电子邮件。如果启用了TLS日志记录,您还将收到X.509证书已验证的提示。
您想使用MTA-STS但发送速度较慢的目的地呢?如果您发送邮件的每个人都支持MTA-STS,请将 smtp_tls_security_level
和 smtp_tls_policy_maps
添加到该传输中。否则,创建一个将两者结合起来的新传输。
您现在正在验证MTA-STS,但报告呢?使用该协议的主要实体是大型提供商。他们有自己的监控系统,他们不仅对日常的TLS-RPT消息不感兴趣,而且可能会将其归类为垃圾邮件。他们是电子邮件帝国。TLS(和其他所有协议)按照它们声明的方式工作,而你的定义是错误的。这就是为什么没有开源的MTA-STS报告实现。
Postfix和Dovecot的功能远远超过了这种大小的书所能涵盖的功能,但你现在有了一个坚实的知识基础。这两个项目都有详尽的文档,并将指导你添加可能需要的其他功能。
祝你好运。