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

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

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

首先,快速回顾一下电子邮件服务和协议。电子邮件通过名为简单邮件传输协议 (SMTP) 的服务使用 TCP 端口 25 发送。 此协议根据 DNS 邮件交换器 (MX) 记录查找将电子邮件从服务器发送到服务器。 电子邮件到达电子邮件服务器后,会使用以下两种服务之一进行检索:Internet 消息访问协议 (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 的原始内容将丢失。

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

好发现! 是的,它应该是您的 vendor.pem 文件与中间证书文件连接/组合。

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

回复 Bjarni (未验证)

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

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© . All rights reserved.