4.13. 强化 TLS 配置
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-GCM
、AES-CCM
或 Camellia-GCM
,它们没有已知的问题。所有上述缓解方案均在 Red Hat Enterprise Linux 中包含的加密库中实现。
有关协议版本和推荐使用的快速概述,请参阅 表 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 密码套件的使用,它们根本不提供任何加密或身份验证。如果可能,基于
RC4
或 HMAC-MD5
的密码套件也应被禁用。这同样适用于所谓的 导出 密码套件,它们被有意较弱,因此很容易中断。
虽然不能立即不安全,但提供超过 128 位安全性的密码套件不应被视为其简短的有用生命周期。使用 128 位或更高安全性的算法可以预期在至少数年内不破坏,因此强烈建议这样做。请注意,虽然
3DES
密码公告使用 168 位,但它们实际上提供了 112 位的安全性。
始终优先选择支持 (完美)转发保密 (PFS)的密码套件,这样可确保在服务器密钥泄露时加密数据的机密性。这个规则排除了快速
RSA
密钥交换,但允许使用 ECDHE
和 DHE
。在两者中,ECDHE
速度更快,因此首选。
您还应该在
CBC
-mode 密码之前优先使用 AEAD
密码,如 AES-GCM
,因为它们不会受到 padding oracle 攻击的影响。另外,在很多情况下,AES-GCM
比 CBC
模式的 AES
快,特别是在硬件具有 AES
加密加速器时。
另请注意,当使用带有
ECDSA
证书的 ECDHE
密钥交换时,事务的速度甚至比纯 RSA
密钥交换要快。要支持旧客户端,您可以在服务器上安装两对证书和密钥:一对带有 ECDSA
密钥(用于新客户端),以及一个带有 RSA
密钥(用于旧密钥)。
公钥长度
当使用
RSA
密钥时,总是首选使用至少由 SHA-256 签名的 3072 位的密钥长度,对于真实的 128 位安全性来说,这个密钥长度足够大。
警告
请记住,您的系统安全性仅与链中最弱的链接一样强大。例如,只是一个强大的密码不能保证良好安全性。密钥和证书以及 认证机构 (CA)用来签署您的密钥的哈希功能和密钥同样重要。
4.13.2. 使用 TLS 的实现
Red Hat Enterprise Linux 7 提供了多个功能全面的
TLS
实现。本节描述了 OpenSSL 和 GnuTLS 的配置。有关如何在独立应用程序中配置 TLS
支持的说明,请参阅 第 4.13.3 节 “配置特定应用程序”。
可用的
TLS
实现支持各种 密码套件,用于定义建立和使用 TLS
-secured 通信时附带的所有元素。
在考虑 第 4.13.1 节 “选择启用算法” 中概述的建议时,使用不同实现中的工具列出并指定为您的用例提供最佳安全性的密码套件。然后,生成的密码套件可用于配置独立应用程序协商和安全连接的方式。
重要
请确定在每次更新或升级您使用的
TLS
实现或升级使用该实现的应用程序后检查您的设置。新版本可能会引入您不希望启用的新密码套件,并且当前配置没有禁用。
4.13.2.1. 在 OpenSSL 中使用 Cipher Suites
OpenSSL 是一个工具包和一个加密库,它支持
SSL
和 TLS
协议。在 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 是一个实现
SSL
和 TLS
协议和相关技术的通信库。
注意
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 服务器 可以使用 OpenSSL 和 NSS 库来满足其
TLS
的需求。根据您选择的 TLS
库,您需要安装 mod_ssl 或 mod_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_nss 的 mod_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 配置和相关主题的更多信息,请参阅以下列出的资源。
安装的文档
- config(1) - 描述
/etc/ssl/openssl.conf
配置文件的格式。 - ciphers(1) - 包含可用 OpenSSL 关键字和密码字符串的列表。
/usr/share/httpd/manual/mod_ssl.html
- 包含对 Apache HTTP 服务器 使用的 mod_ssl
模块使用的 /etc/httpd/conf.d/ ssl.conf 配置文件中提供的指令的详细描述。/usr/share/httpd/manual/ssl/ssl_howto.html
- 在 Apache HTTP 服务器的 mod_ssl
/conf.d/ ssl.conf 配置文件中包含实际设置的实际示例。/usr/share/doc/dovecot-2.2.10/wiki/SSL.DovecotConfiguration.txt
- 解释 Dovecot 邮件服务器使用的/etc/dovecot/conf.d/10-ssl.conf
配置文件中提供的一些基本配置指令。
在线文档
- Red Hat Enterprise Linux 7 SELinux 用户和管理员指南 - Red Hat Enterprise Linux 7 的 SELinux 用户和管理员指南 介绍了 SELinux 的基本原则,以及如何配置和使用各种服务的 SELinux,如 Apache HTTP 服务器。
另请参阅
- 第 4.7 节 “使用 OpenSSL” 除其他方面,如何使用 OpenSSL 创建和管理密钥、生成证书以及加密和解密文件。