如何使用 SSL/TLS 保护您的 Linux 电子邮件服务

通过了解安全证书来保护您的 Linux 电子邮件服务。
106 位读者喜欢这篇文章。

传统上,电子邮件服务以未受保护的方式发送数据——无论您是通过 SMTP 发送电子邮件还是通过 IMAP 或 POP 接收电子邮件,默认设置都是明文。随着越来越多的在线应用程序强制执行加密以及保护数据的普遍共识,最好使用安全套接字层/传输层安全 (SSL/TLS) 安全证书来保护您的电子邮件服务。

首先,快速回顾一下电子邮件服务和协议。电子邮件通过名为简单邮件传输协议 (SMTP) 的服务使用 TCP 端口 25 发送。此协议基于 DNS 邮件交换器 (MX) 记录查找将电子邮件从服务器发送到服务器。一旦电子邮件到达电子邮件服务器,它将使用以下两种服务之一检索:互联网消息访问协议 (IMAP),使用 TCP 端口 143;或邮局协议 (POP3),使用 TCP 端口 110。默认情况下,所有这些服务都以纯文本形式将您的电子邮件和身份验证发送到/从这些服务发送——因此,它是非常不安全的!

为了保护电子邮件数据和身份验证,这些服务添加了一项安全功能,它们可以利用 SSL/TLS 证书来包装数据流并使用加密进行通信。SSL/TLS 加密如何保护信息超出了本文的范围,但 Bryant Son 的互联网安全文章 对此进行了非常详细的介绍。从高层次来看,SSL/TLS 加密是一种公钥/私钥加密算法。

通过在服务中添加这些安全功能,它们可以监听新的 TCP 端口

服务 默认 TCP 端口 SSL/TLS 端口
SMTP 25 587
IMAP 143 993
POP3 110 995

生成 SSL/TLS 证书

可以使用 OpenSSL 等工具免费生成 SSL/TLS 证书,也可以从公共证书颁发机构 (CA) 购买,价格各不相同。过去,生成自己的证书很容易,并且在大多数情况下都有效,但随着对更高安全性的需求不断增长,大多数电子邮件客户端不信任自生成的 SSL/TLS 证书,除非手动添加例外。

如果您的用例是私有的或用于测试,那么使用自生成证书来省钱是有意义的。但是,如果您要将其推广到大型群体或拥有付费客户,那么最好从销售证书的受信任的公共公司购买证书。

在任何一种情况下,开始请求新证书的过程都是在您的 Linux 系统上使用 OpenSSL 工具来创建证书签名请求 (CSR)

$ openssl req -new -newkey rsa:2048 -nodes -keyout mail.mydomain.key -out mail.mydomain.csr

此命令将同时为您要保护的服务创建一个新的 CSR 和私钥。此过程将询问您一些与证书相关的问题:位置详细信息、服务器完全限定域名 (FQDN)、电子邮件联系信息等。填写完信息后,将生成密钥和 CSR。

如果您生成自己的证书

如果您想生成自己的证书,则必须在发出上述 CSR 命令之前创建自己的 根 CA。您可以使用以下命令创建自己的根 CA:

$ openssl genrsa -des3 -out myCA.key 2048

它将提示您添加密码。请为其设置安全密码,并且不要丢失它——这是您的私有根 CA 密钥,顾名思义,它是您证书中所有信任的根源。

接下来,生成根 CA 证书

$ openssl req -x509 -new -nodes -key myCA.key -sha256 -days 1825 -out myCA.pem

回答完更多问题后,您将生成一个有效期为五年的根 CA 证书。

使用上述步骤中的 CSR 文件,您可以请求生成一个新证书,并由您刚刚创建的根 CA 对其进行签名

$ openssl x509 -req -in mail.mydomain.csr -CA myCA.pem -CAkey myCA.key -CAcreateserial -out mail.mydomain.pem -days 1825 -sha256

输入您的私有根 CA 密钥密码以创建和签署证书。

现在您有了两个文件,用于配置您的电子邮件服务以增强安全性:私钥文件 mail.mydomain.key 和公钥证书文件 mail.mydomain.pem

如果您购买证书

如果您从供应商处购买证书,它会要求您将该 CSR 上传到其系统,因为它用作生成 SSL/TLS 证书的输入。该证书将作为文件(例如 mail.mydomain.pem)访问。许多 SSL 供应商还要求您下载中间证书。如果是这种情况,您必须将两个证书文件合并为一个,以便电子邮件服务可以组合处理它们。您可以使用以下命令将您的证书与第三方中间证书合并:

$ cat mail.mydomain.pem gd_bundle-g2-g1.crt > mail.mydomain.pem

请注意,输出文件的扩展名为 .pem,它代表 Privacy-Enhanced Mail(隐私增强邮件)。

现在您有了两个文件,用于配置您的电子邮件服务以增强安全性:私钥文件 mail.mydomain.key 和公钥组合证书文件 mail.mydomain.pem

为您的文件创建一个安全目录

无论您是创建了自己的密钥还是从供应商处购买了密钥,都为上面创建的两个文件创建一个安全的、root 拥有的目录。创建安全位置的工作流程示例是

$ mkdir /etc/pki/tls
$ chown root:root /etc/pki/tls
$ chmod 700 /etc/pki/tls

确保在将文件复制到 /etc/pki/tls 后,使用以下命令设置文件的权限

$ chmod 600 /etc/pki/tls/*

配置您的 SMTP 和 IMAP 服务

接下来,配置 SMTP 和 IMAP 服务以使用新的安全证书。本示例中用于 SMTP 和 IMAP 的程序是 postfixdovecot

在您喜欢的文本编辑器中编辑 /etc/postfix/main.cf。添加以下行

smtpd_use_tls = yes
smtpd_tls_cert_file = /etc/pki/tls/mail.mydomain.pem
smtpd_tls_key_file = /etc/pki/tls/mail.mydomain.key

自定义您的配置

以下选项允许您禁用/启用不同的密码、协议等。

smtpd_tls_eecdh_grade = strong
smtpd_tls_protocols= !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtpd_tls_mandatory_protocols= !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtpd_tls_mandatory_ciphers = high
smtpd_tls_security_level=may
smtpd_tls_ciphers = high
tls_preempt_cipherlist = yes
smtpd_tls_mandatory_exclude_ciphers = aNULL, MD5 , DES, ADH, RC4, PSD, SRP, 3DES, eNULL
smtpd_tls_exclude_ciphers = aNULL, MD5 , DES, ADH, RC4, PSD, SRP, 3DES, eNULL
smtp_tls_mandatory_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1 
smtp_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1

通过添加以下三行来编辑 /etc/dovecot/dovecot.conf

ssl = required
ssl_cert = </etc/pki/tls/mail.mydomain.pem
ssl_key = </etc/pki/tls/mail.mydomain.key

添加以下选项以禁用/启用不同的密码、协议等(我将理解和考虑这些留给您自己)

ssl_cipher_list = EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH+aRSA+RC4:EECDH:EDH+aRSA:ALL:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS:!RC4:!SSLv2
ssl_prefer_server_ciphers = yes
ssl_protocols = !SSLv2 !SSLv3 !TLSv1 !TLSv1.1
ssl_min_protocol = TLSv1.2

为 SELinux 设置上下文

如果您的 Linux 发行版启用了 SELinux,请为您的新证书文件设置正确的 SELinux 上下文。

对于 Postfix SELinux

$ chcon -u system_u -t cert_t mail.mydomain.*

对于 Dovecot SELinux

$ chcon -u system_u -t dovecot_cert_t mail.mydomain.*

重新启动这两项服务,并使用您更新的电子邮件客户端配置进行连接。某些电子邮件客户端会自动检测新的端口号;其他客户端将需要您更新它们。

测试您的设置

使用 openssls_client 插件从命令行快速测试

$ openssl s_client -connect mail.mydomain.com:993
$ openssl s_client -starttls imap -connect mail.mydomain.com:143
$ openssl s_client -starttls smtp -connect mail.mydomain.com:587

这些测试命令将显示有关您正在使用的连接、证书、密码、会话和协议的大量数据。这不仅是验证新配置是否正常工作的好方法,而且还可以确认您正在使用在 postfixdovecot 配置文件中定义的适当的证书和安全设置。

保持安全!

接下来阅读什么
User profile image.
Marc 是一位首席解决方案架构师,致力于帮助客户使用 Red Hat 的开源软件解决复杂问题。凭借在 Linux、安全和网络领域超过 20 年的经验,Marc 可以成功且知识渊博地帮助他的客户。

5 条评论

文章不错,但我不明白为什么没有提到 Let’s Encrypt 和 ACME 协议,恕我直言,如果提到它们文章会更精彩。

很棒的文章,Marc!

我只想指出,“smtpd_tls_security_level=may” 不会强制执行 TLS 加密。

遗憾的是,仍然无法保证我们消息传递所经过的所有服务器都是安全的(即使它们使用了加密),因此目前保持机密的唯一方法是端到端加密(例如 GPG、S/MIME 等)。

此外,对于个人用户,我建议使用 Let's Encrypt 免费证书,如今大多数客户端都信任这些证书。

请注意,用于创建组合 .pem 文件的命令将破坏 mail.mydomain.pem。

$ cat mail.mydomain.pem gd_bundle-g2-g1.crt > mail.mydomain.pem

Shell 将首先打开并截断 mail.mydomain.pem,然后再执行 cat 命令。因此,最终结果将与您只是将 gd_bundle-g2-g1.crt 复制到 .pem 文件上相同——mail.mydomain.pem 的原始内容将丢失。

解决方案是为输出文件使用不同的名称。 :-)

你好,Marc!
绝对是一篇信息丰富的文章!我终于找到了在 SSL 的帮助下保护 Linux 电子邮件服务的正确解决方案。
非常感谢。继续加油

Creative Commons License本作品根据知识共享署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.