搜索

4.13. 强化 TLS 配置

download PDF
TLS (传输层安全)是用于保护网络通信的加密协议。当通过配置首选 密钥交换协议身份验证方法加密算法 来强化系统安全设置时,需要注意支持的客户端的范围越大,生成的安全性较低。相反,严格的安全设置会导致与客户端的兼容性受限,这可能导致某些用户被锁定在系统之外。请确保以最严格的可用配置为目标,并且仅在出于兼容性原因需要时才放宽配置。
请注意,Red Hat Enterprise Linux 7 中包含的库提供的默认设置对于大多数部署来说都足够安全。TLS 实现尽可能使用安全算法,而不阻止来自或到旧客户端或服务器的连接。在满足严格的安全要求的环境中应用此部分中描述的强化设置,其中不支持安全算法或协议的旧客户端或服务器无法连接或允许连接。

4.13.1. 选择启用算法

需要选择和配置几个组件。以下每个都直接影响生成的配置(以及客户端中的支持级别)或解决方案在系统上拥有的计算需求。

协议版本

TLS 的最新版本提供最佳安全机制。除非有充分的理由包含对旧版本的 TLS (甚至 SSL)的支持,否则允许您的系统只使用最新版本的 TLS 来协商连接。
不允许使用 SSL 版本 2 或 3 协商。两个版本都有严重的安全漏洞。只允许使用 TLS 版本 1.0 或更高版本的协商。当前版本的 TLS 1.2 应始终是首选的。
注意
请注意,当前所有 TLS 版本的安全性取决于使用 TLS 扩展、特定密码(请参阅以下)和其他临时解决方案。所有 TLS 连接对等点都需要实施安全重新协商指示(RFC 5746),且必须对 CBC-mode 密码(Lucky Thirteen 攻击)实施缓解时间攻击。TLS 1.0 客户端还需要额外实施记录分割(针对EAST 攻击的临时解决方案)。TLS 1.2 支持通过关联数据 (AEAD)模式密码进行身份验证加密,如 AES-GCMAES-CCMCamellia-GCM,它们没有已知的问题。所有上述缓解方案均在 Red Hat Enterprise Linux 中包含的加密库中实现。
有关协议版本和推荐使用的快速概述,请参阅 表 4.6 “协议版本”
表 4.6. 协议版本
协议版本使用建议
SSL v2
不要使用。具有严重的安全漏洞。
SSL v3
不要使用。具有严重的安全漏洞。
TLS 1.0
在需要时用于互操作性.已知的无法以保证互操作性的方式缓解的问题,因此不会默认启用缓解方案。不支持现代加密套件。
TLS 1.1
在需要时用于互操作性.没有已知问题,但依赖于 Red Hat Enterprise Linux 中的所有 TLS 实现中包含的协议修复。不支持现代加密套件。
TLS 1.2
推荐的版本。支持现代 AEAD 密码套件。
Red Hat Enterprise Linux 中的一些组件被配置为使用 TLS 1.0,即使它们支持 TLS 1.1 甚至 1.2。这是尝试实现最高级别的互操作性和外部服务(可能不支持最新版本的 TLS )的动机。根据您的互操作性要求,启用最高可用的 TLS 版本。
重要
不建议使用 SSL v3。但是,如果事实上,虽然它被视为不安全且不适合用于常规用途,但绝对必须保持 SSL v3 启用。有关如何使用 stunnel 安全地加密通信的说明,即使使用了不支持加密的服务,或者只能使用过时的、不安全的加密模式。第 4.8 节 “使用 stunnel”

密码套件

现代、更安全 的密码套件应该优先于旧的、不安全的密码套件。一直禁止 eNULL 和 aNULL 密码套件的使用,它们根本不提供任何加密或身份验证。如果可能,基于 RC4HMAC-MD5 的密码套件也应被禁用。这同样适用于所谓的 导出 密码套件,它们被有意较弱,因此很容易中断。
虽然不能立即不安全,但提供超过 128 位安全性的密码套件不应被视为其简短的有用生命周期。使用 128 位或更高安全性的算法可以预期在至少数年内不破坏,因此强烈建议这样做。请注意,虽然 3DES 密码公告使用 168 位,但它们实际上提供了 112 位的安全性。
始终优先选择支持 (完美)转发保密 (PFS)的密码套件,这样可确保在服务器密钥泄露时加密数据的机密性。这个规则排除了快速 RSA 密钥交换,但允许使用 ECDHEDHE。在两者中,ECDHE 速度更快,因此首选。
您还应该在 CBC-mode 密码之前优先使用 AEAD 密码,如 AES-GCM,因为它们不会受到 padding oracle 攻击的影响。另外,在很多情况下,AES-GCMCBC 模式的 AES 快,特别是在硬件具有 AES 加密加速器时。
另请注意,当使用带有 ECDSA 证书的 ECDHE 密钥交换时,事务的速度甚至比纯 RSA 密钥交换要快。要支持旧客户端,您可以在服务器上安装两对证书和密钥:一对带有 ECDSA 密钥(用于新客户端),以及一个带有 RSA 密钥(用于旧密钥)。

公钥长度

当使用 RSA 密钥时,总是首选使用至少由 SHA-256 签名的 3072 位的密钥长度,对于真实的 128 位安全性来说,这个密钥长度足够大。
警告
请记住,您的系统安全性仅与链中最弱的链接一样强大。例如,只是一个强大的密码不能保证良好安全性。密钥和证书以及 认证机构 (CA)用来签署您的密钥的哈希功能和密钥同样重要。

4.13.2. 使用 TLS 的实现

Red Hat Enterprise Linux 7 提供了多个功能全面的 TLS 实现。本节描述了 OpenSSLGnuTLS 的配置。有关如何在独立应用程序中配置 TLS 支持的说明,请参阅 第 4.13.3 节 “配置特定应用程序”
可用的 TLS 实现支持各种 密码套件,用于定义建立和使用 TLS-secured 通信时附带的所有元素。
在考虑 第 4.13.1 节 “选择启用算法” 中概述的建议时,使用不同实现中的工具列出并指定为您的用例提供最佳安全性的密码套件。然后,生成的密码套件可用于配置独立应用程序协商和安全连接的方式。
重要
请确定在每次更新或升级您使用的 TLS 实现或升级使用该实现的应用程序后检查您的设置。新版本可能会引入您不希望启用的新密码套件,并且当前配置没有禁用。

4.13.2.1. 在 OpenSSL 中使用 Cipher Suites

OpenSSL 是一个工具包和一个加密库,它支持 SSLTLS 协议。在 Red Hat Enterprise Linux 7 中,配置文件在 /etc/pki/tls/openssl.cnf 中提供。这个配置文件的格式在 config(1) 中进行了描述。另请参阅 第 4.7.9 节 “配置 OpenSSL”
要获取安装 OpenSSL 支持的所有密码套件的列表,请使用 openssl 命令和 password 子命令,如下所示:
~]$ openssl ciphers -v 'ALL:COMPLEMENTOFALL'
将其他参数(称为 OpenSSL 文档中的 密码字符串和 关键字 )传给 password 子命令,以缩小输出范围。 特殊关键字可用于列出满足特定条件的套件。例如,要只列出定义为 HIGH 组的套件,请使用以下命令:
~]$ openssl ciphers -v 'HIGH'
有关可用关键字和密码字符串的列表,请参阅 ciphers(1) 手册页。
要获得满足 第 4.13.1 节 “选择启用算法” 中推荐的密码套件列表,请使用类似如下的命令:
~]$ openssl ciphers -v 'kEECDH+aECDSA+AES:kEECDH+AES+aRSA:kEDH+aRSA+AES' | column -t
ECDHE-ECDSA-AES256-GCM-SHA384  TLSv1.2  Kx=ECDH  Au=ECDSA  Enc=AESGCM(256)  Mac=AEAD
ECDHE-ECDSA-AES256-SHA384      TLSv1.2  Kx=ECDH  Au=ECDSA  Enc=AES(256)     Mac=SHA384
ECDHE-ECDSA-AES256-SHA         SSLv3    Kx=ECDH  Au=ECDSA  Enc=AES(256)     Mac=SHA1
ECDHE-ECDSA-AES128-GCM-SHA256  TLSv1.2  Kx=ECDH  Au=ECDSA  Enc=AESGCM(128)  Mac=AEAD
ECDHE-ECDSA-AES128-SHA256      TLSv1.2  Kx=ECDH  Au=ECDSA  Enc=AES(128)     Mac=SHA256
ECDHE-ECDSA-AES128-SHA         SSLv3    Kx=ECDH  Au=ECDSA  Enc=AES(128)     Mac=SHA1
ECDHE-RSA-AES256-GCM-SHA384    TLSv1.2  Kx=ECDH  Au=RSA    Enc=AESGCM(256)  Mac=AEAD
ECDHE-RSA-AES256-SHA384        TLSv1.2  Kx=ECDH  Au=RSA    Enc=AES(256)     Mac=SHA384
ECDHE-RSA-AES256-SHA           SSLv3    Kx=ECDH  Au=RSA    Enc=AES(256)     Mac=SHA1
ECDHE-RSA-AES128-GCM-SHA256    TLSv1.2  Kx=ECDH  Au=RSA    Enc=AESGCM(128)  Mac=AEAD
ECDHE-RSA-AES128-SHA256        TLSv1.2  Kx=ECDH  Au=RSA    Enc=AES(128)     Mac=SHA256
ECDHE-RSA-AES128-SHA           SSLv3    Kx=ECDH  Au=RSA    Enc=AES(128)     Mac=SHA1
DHE-RSA-AES256-GCM-SHA384      TLSv1.2  Kx=DH    Au=RSA    Enc=AESGCM(256)  Mac=AEAD
DHE-RSA-AES256-SHA256          TLSv1.2  Kx=DH    Au=RSA    Enc=AES(256)     Mac=SHA256
DHE-RSA-AES256-SHA             SSLv3    Kx=DH    Au=RSA    Enc=AES(256)     Mac=SHA1
DHE-RSA-AES128-GCM-SHA256      TLSv1.2  Kx=DH    Au=RSA    Enc=AESGCM(128)  Mac=AEAD
DHE-RSA-AES128-SHA256          TLSv1.2  Kx=DH    Au=RSA    Enc=AES(128)     Mac=SHA256
DHE-RSA-AES128-SHA             SSLv3    Kx=DH    Au=RSA    Enc=AES(128)     Mac=SHA1
以上命令省略了所有不安全的密码,它提供了 临时的 elliptic curve Diffie-Hellman 密钥交换和 ECDSA 密码,并省略 RSA 密钥交换(确保 完美的转发保密)。
请注意,这是一个严格的配置,可能需要放宽真实场景中的条件,以允许与更广泛的客户端兼容。

4.13.2.2. 在 GnuTLS 中使用 Cipher Suites

gnutls 是一个实现 SSLTLS 协议和相关技术的通信库。
注意
Red Hat Enterprise Linux 7 上的 GnuTLS 安装提供了最佳默认配置值,为大多数用例提供足够的安全性。除非需要满足特殊安全要求,否则建议使用提供的默认值。
使用带有 -l (或 --list)选项的 gnutls-cli 命令列出所有支持的密码套件:
~]$ gnutls-cli -l
要缩小 -l 选项显示的密码套件列表,请将一个或多个参数(称为 GnuTLS 文档中的 优先级字符串关键字 )传给 --priority 选项。有关所有可用优先级字符串的列表,请参阅 http://www.gnutls.org/manual/gnutls.html#Priority-Strings 中的 GnuTLS 文档。例如,运行以下命令来获取提供至少 128 位安全性的密码套件列表:
~]$ gnutls-cli --priority SECURE128 -l
要获得满足 第 4.13.1 节 “选择启用算法” 中推荐的密码套件列表,请使用类似如下的命令:
~]$ gnutls-cli --priority SECURE256:+SECURE128:-VERS-TLS-ALL:+VERS-TLS1.2:-RSA:-DHE-DSS:-CAMELLIA-128-CBC:-CAMELLIA-256-CBC -l
Cipher suites for SECURE256:+SECURE128:-VERS-TLS-ALL:+VERS-TLS1.2:-RSA:-DHE-DSS:-CAMELLIA-128-CBC:-CAMELLIA-256-CBC
TLS_ECDHE_ECDSA_AES_256_GCM_SHA384                      0xc0, 0x2c      TLS1.2
TLS_ECDHE_ECDSA_AES_256_CBC_SHA384                      0xc0, 0x24      TLS1.2
TLS_ECDHE_ECDSA_AES_256_CBC_SHA1                        0xc0, 0x0a      SSL3.0
TLS_ECDHE_ECDSA_AES_128_GCM_SHA256                      0xc0, 0x2b      TLS1.2
TLS_ECDHE_ECDSA_AES_128_CBC_SHA256                      0xc0, 0x23      TLS1.2
TLS_ECDHE_ECDSA_AES_128_CBC_SHA1                        0xc0, 0x09      SSL3.0
TLS_ECDHE_RSA_AES_256_GCM_SHA384                        0xc0, 0x30      TLS1.2
TLS_ECDHE_RSA_AES_256_CBC_SHA1                          0xc0, 0x14      SSL3.0
TLS_ECDHE_RSA_AES_128_GCM_SHA256                        0xc0, 0x2f      TLS1.2
TLS_ECDHE_RSA_AES_128_CBC_SHA256                        0xc0, 0x27      TLS1.2
TLS_ECDHE_RSA_AES_128_CBC_SHA1                          0xc0, 0x13      SSL3.0
TLS_DHE_RSA_AES_256_CBC_SHA256                          0x00, 0x6b      TLS1.2
TLS_DHE_RSA_AES_256_CBC_SHA1                            0x00, 0x39      SSL3.0
TLS_DHE_RSA_AES_128_GCM_SHA256                          0x00, 0x9e      TLS1.2
TLS_DHE_RSA_AES_128_CBC_SHA256                          0x00, 0x67      TLS1.2
TLS_DHE_RSA_AES_128_CBC_SHA1                            0x00, 0x33      SSL3.0

Certificate types: CTYPE-X.509
Protocols: VERS-TLS1.2
Compression: COMP-NULL
Elliptic curves: CURVE-SECP384R1, CURVE-SECP521R1, CURVE-SECP256R1
PK-signatures: SIGN-RSA-SHA384, SIGN-ECDSA-SHA384, SIGN-RSA-SHA512, SIGN-ECDSA-SHA512, SIGN-RSA-SHA256, SIGN-DSA-SHA256, SIGN-ECDSA-SHA256
以上命令将输出限制为至少 128 位安全性的密码,同时优先选择更强大的密码。它还禁止 RSA 密钥交换和 DSS 身份验证。
请注意,这是一个严格的配置,可能需要放宽真实场景中的条件,以允许与更广泛的客户端兼容。

4.13.3. 配置特定应用程序

不同的应用为 TLS 提供自己的配置机制。本节介绍了最常用的服务器应用程序所使用的与 TLS相关的配置文件,并提供典型配置示例。
无论您选择使用什么配置,始终确保您的服务器应用程序强制实施 服务器端密码顺序,以便使用的密码套件由您配置的顺序决定。

4.13.3.1. 配置 Apache HTTP 服务器

Apache HTTP 服务器 可以使用 OpenSSLNSS 库来满足其 TLS 的需求。根据您选择的 TLS 库,您需要安装 mod_sslmod_nss 模块(由 eponymous 软件包提供)。例如,要安装提供 OpenSSL mod_ssl 模块的软件包,请以 root 身份运行以下命令:
~]# yum install mod_ssl
mod_ssl 软件包安装 /etc/httpd/conf.d/ssl.conf 配置文件,该文件可用于修改 Apache HTTP Server 的与 TLS相关的设置。同样,mod_nss 软件包会安装 /etc/httpd/conf.d/nss.conf 配置文件。
安装 httpd-manual 软件包以获取 Apache HTTP 服务器 的完整文档,包括 TLS 配置。/etc/httpd/conf.d/ssl.conf 配置文件中的指令在 /usr/share/httpd/manual/mod_ssl.html 中进行了详细介绍。各种设置示例位于 /usr/share/httpd/manual/ssl/ssl_howto.html
修改 /etc/httpd/conf.d/ssl.conf 配置文件中的设置时,请确保至少考虑以下三个指令:
SSLProtocol
使用这个指令指定您要允许的 TLS 版本(或 SSL)。
SSLCipherSuite
使用这个指令来指定您首选的密码套件或禁用您要禁止的密码套件。
SSLHonorCipherOrder
取消注释并将此指令设置为 on,以确保连接的客户端遵循您指定的密码顺序。
例如:
SSLProtocol all -SSLv2 -SSLv3
SSLCipherSuite HIGH:!aNULL:!MD5
SSLHonorCipherOrder on
请注意,上述配置最小是裸机,可以根据 第 4.13.1 节 “选择启用算法” 中概述的建议来显著强化。
要配置和使用 mod_nss 模块,请修改 /etc/httpd/conf.d/nss.conf 配置文件。mod_nss 模块派生自 mod_ssl,因此它与它共享许多功能,而不用配置文件结构以及可用的指令共享。请注意,mod_nss 指令的前缀为 NSS 而不是 SSL。有关 mod_nss 的信息的概述信息,包括不适用于 mod_nssmod_ssl 配置指令列表。https://git.fedorahosted.org/cgit/mod_nss.git/plain/docs/mod_nss.html

4.13.3.2. 配置 Dovecot 邮件服务器

要将 Dovecot 邮件服务器的安装配置为使用 TLS,请修改 /etc/dovecot/conf.d/10-ssl.conf 配置文件。您可以在 /usr/share/doc/dovecot-2.2.10/wiki/SSL.DovecotConfiguration.txt 中找到该文件中一些基本配置指令的说明(此帮助文件与 Dovecot的标准安装一起安装)。
修改 /etc/dovecot/conf.d/10-ssl.conf 配置文件中的设置时,请确保至少考虑以下三个指令:
ssl_protocols
使用这个指令指定您要允许的 TLS 版本(或 SSL)。
ssl_cipher_list
使用这个指令指定您首选的密码套件或禁用您要禁止的密码套件。
ssl_prefer_server_ciphers
取消注释并将此指令设置为 yes,以确保连接的客户端遵循您指定的密码顺序。
例如:
ssl_protocols = !SSLv2 !SSLv3
ssl_cipher_list = HIGH:!aNULL:!MD5
ssl_prefer_server_ciphers = yes
请注意,上述配置最小是裸机,可以根据 第 4.13.1 节 “选择启用算法” 中概述的建议来显著强化。

4.13.4. 其它信息

有关 TLS 配置和相关主题的更多信息,请参阅以下列出的资源。

安装的文档

在线文档

另请参阅

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.