我正在运行 Ubuntu 20.04 LEMP(Linux、Nginx、MariaDb、PHP)电子邮件/Web 服务器。我还在从我的 MacOS 客户端机器上进行一些 nmap 漏洞测试。在 MacOS 上,我使用启用了 nmap 插件的 Oh My Zsh!为了从我的 MacOS 客户端机器上对我的 Ubuntu 服务器进行一些漏洞测试,我发出了以下命令:
nmap_check_for_vulns my.server.ip.address
这是
nmap --script=vuln
在使用我的服务器的 IP 地址发出命令后,nmap 报告了以下漏洞:
465/tcp open smtps
| ssl-dh-params:
| VULNERABLE:
| Anonymous Diffie-Hellman Key Exchange MitM Vulnerability
| State: VULNERABLE
| Transport Layer Security (TLS) services that use anonymous
| Diffie-Hellman key exchange only provide protection against passive
| eavesdropping, and are vulnerable to active man-in-the-middle attacks
| which could completely compromise the confidentiality and integrity
| of any data exchanged over the resulting session.
| Check results:
| ANONYMOUS DH GROUP 1
| Cipher Suite: TLS_DH_anon_WITH_AES_128_CBC_SHA
| Modulus Type: Safe prime
| Modulus Source: Unknown/Custom-generated
| Modulus Length: 2048
| Generator Length: 8
| Public Key Length: 2048
| References:
|_ https://www.ietf.org/rfc/rfc2246.txt
在服务器上,输出为sudo -ss lnpt
:
LISTEN 0 100 0.0.0.0:465 0.0.0.0:* users:(("smtpd",pid=586529,fd=6),("master",pid=2078,fd=29))
提供的 nmap 链接https://www.ietf.org/rfc/rfc2246.txt,没有提供我能找到的关于这个特定漏洞的参考。
我的问题是,这个漏洞意味着什么,哪个进程正在使用它,以及如何在不禁用端口 456 的情况下缓解 Ubuntu 20.04 服务器上的这个漏洞?我是否需要修复 postfix/dovecot SMTP 服务器中的 Diffie Hellman 问题?如果需要,我该怎么做?
答案1
匿名 TLS 是一种也称为“无证书 TLS”的配置。服务器的密钥对没有信任链,因此绝对无法防范中间人攻击。证书就是为了解决这个问题而发明的。
相关的 Postfix 文档页面是TLS_README。
Postfix smtp 服务器(在 TCP 端口 465 上运行的服务)支持无证书操作,但是仅适用于内部主机:
对于非公共 Internet MX 主机的服务器,Postfix 支持无证书的配置。
首先,这是设置时启用的唯一模式smtpd_tls_cert_file = none
,但您不能将其用于面向公众的服务器。相反,请使用适当的全局受信任证书和密钥对。来自 Let's Encrypt 的证书和密钥对就可以了。可以按以下方式设置:
smtpd_tls_chain_files = /.../rsachain.pem
smtpd_tls_cert_file =
smtpd_tls_key_file =
该rsachain.pem
文件应按以下顺序包含以下内容:私钥、服务器证书、证书链。
请注意,TLS 1.3 不支持无证书操作。因此,消除警告的一种方式(实际上是一种好方法)是禁用所有较旧的版本:
smtpd_tls_protocols = >=TLSv1.3
问题在于,一些旧的或不符合标准的客户端(旧到不支持 TLS v1.3)将无法建立 TLS 连接。
另一种方法是直接禁用无证书操作:
smtpd_tls_exclude_ciphers = aNULL
无论如何,如果仅仅是因为 Postfix 没有排除这个 aNULL 而引发 nmap 警报,那么根据 Postfix 手册,这是一个误报:
无法强制远程 SMTP 客户端检查服务器证书,因此通常不需要排除匿名密码。
这样做的理由如下。
即使在服务器上禁用此功能,也很容易受到降级攻击,即仅发布此 aNULL 套件和 TLS v1.2(或更低版本)的 MitM 代理。完全避免此问题的唯一方法是配置客户不使用匿名密码和/或易受攻击的协议并检查服务器证书。您必须在每个客户端上单独配置此功能,因此没有必要在服务器上禁用它。
答案2
最高版本的Ubuntu 20.04 服务器中的 Postfix目前是 Postfixv3.4.13。 这Postfix 的最高稳定版本是 Postfix v3.6,因此缓解这些漏洞取决于您的 postfix 版本。
对于任一版本的 postfix,为了缓解这些漏洞,你需要禁用以下任何内容TLSv1.3在 Postfix 中。
在 Postfix 3.6 版本以下您可以通过编辑文件来实现这一点/etc/postfix/main.cf
。
sudo nano /etc/postfix/main.cf
并添加!SSLv2, !SSLv3, !TLSv1, !TLSv1.1 !TLSv1.2
以下几行:
smtpd_tls_mandatory_protocols =
smtpd_tls_protocols =
smtp_tls_mandatory_protocols =
smtp_tls_protocols =
在我的情况下,我只需要!TLSv1.2
通过更改以下几行来添加
smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtpd_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtp_tls_mandatory_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtp_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
到
smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1, !TLSv1.2
smtpd_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1, !TLSv1.2
smtp_tls_mandatory_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1, !TLSv1.2
smtp_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1, !TLSv1.2
在 Postfix 3.6 版本以下,上述更改应该有效地导致 postfix“仅”接受 TLSv1.3 及更高版本的连接,从而成功缓解此漏洞。
在 Postfix 大于或等于 v3.6 中您可以通过编辑文件来实现这一点/etc/postfix/main.cf
。
sudo nano /etc/postfix/main.cf
并添加>=TLSv1.3
以下几行:
smtpd_tls_mandatory_protocols =
smtpd_tls_protocols =
smtp_tls_mandatory_protocols =
smtp_tls_protocols =
因此您的配置/etc/postfix/main.cf
应如下所示:
smtpd_tls_mandatory_protocols = >=TLSv1.3
smtpd_tls_protocols = >=TLSv1.3
smtp_tls_mandatory_protocols = >=TLSv1.3
smtp_tls_protocols = >=TLSv1.3
在 Postfix 3.6 以上版本中,上述更改应该有效地导致 postfix“仅”接受 TLSv1.3 及更高版本的连接,从而成功缓解此漏洞。
答案3
smtps
是使用 TLS 加密发送电子邮件的端口。此端口由您的 SMTP 服务器使用。
要修复此漏洞,您需要更改 SMTP 服务器配置。有两种选择:
- 禁用端口 465。您仍然可以使用其他 SMTP 端口发送电子邮件。
- 修复 SMTP 服务器中的 DH 问题。
另一种方法是使用防火墙阻止端口 465。