8.8 FIPS 支持
如果使用 OpenSSL 3.0 或 OpenSSL 1.0.2 编译 MySQL,并且在运行时提供 OpenSSL 库和 FIPS 对象模块,MySQL 就支持 FIPS 模式。
服务器端的 FIPS 模式适用于服务器执行的加密操作,这包括复制(源/副本和 Group Replication)和 X 插件,客户端也不能连接到服务器时的尝试。
以下部分描述了 FIPS 模式和如何在 MySQL 中使用它:
Federal Information Processing Standards 140-2(FIPS 140-2)描述了一种安全标准,联邦机构(美国政府)可以要求用于保护敏感或贵重信息的加密模块。要被认为是联邦使用可接受,一个加密模块必须获得 FIPS 140-2 证书。如果一系统用于保护敏感数据缺少合适的 FIPS 140-2 证书,联邦机构不能购买它。
产品如 OpenSSL 可以在 FIPS 模式下使用,但是 OpenSSL 库本身并没有被验证为 FIPS。相反,OpenSSL 库与 OpenSSL FIPS 对象模块一起使用,以便 OpenSSL 基于应用程序在 FIPS 模式下运行。
关于FIPS和OpenSSL的实现,以下参考可能有帮助:
FIPS模式对加密操作施加条件,如限制可接受的加密算法或要求更长的密钥长度。OpenSSL的确切FIPS行为取决于OpenSSL版本。
为了使MySQL支持FIPS模式,必须满足以下系统要求:
-
在编译时,MySQL必须使用OpenSSL。FIPS模式不能在使用非OpenSSL SSL库的MySQL中使用。
此外,MySQL还必须编译使用已获得FIPS认证的OpenSSL版本。OpenSSL 1.0.2和OpenSSL 3.0已经获得认证,但OpenSSL 1.1.1没有。最新版本的MySQL二进制分布在某些平台上编译使用OpenSSL 1.1.1,这意味着它们不具备FIPS认证。这将导致系统和MySQL配置中的权衡,取决于系统和MySQL配置:
-
使用具有OpenSSL 1.0.2和所需FIPS对象模块的系统。在这种情况下,您可以使用OpenSSL 1.0.2编译的二进制分布或从源代码编译MySQL,但是您不能使用TLSv1.3协议或加密套件(需要OpenSSL 1.1.1)。此外,您正在使用一个已经在2019年底达到末期生命周期的 OpenSSL 版本。
-
使用具有OpenSSL 1.1.1或更高版本的系统。在这种情况下,您可以安装MySQL使用二进制包,并且可以使用TLSv1.3协议和加密套件,除此之外,还可以使用其他已经支持的TLS协议。然而,您不能启用MySQL的FIPS模式。
-
使用具有OpenSSL 3.0和所需FIPS对象模块的系统。在这种情况下,您可以使用OpenSSL 3.0编译的二进制分布或从源代码编译MySQL。可以直接通过OpenSSL 3.0配置文件来处理FIPS模式,而不是使用服务器端系统变量和客户端选项,虽然这些已经弃用,并且在未来版本中将被删除。在使用OpenSSL 3.0编译的MySQL时,如果 OpenSSL 库和FIPS对象模块可用,那么服务器读取OpenSSL配置文件并尊重设置的FIPS提供商,如果有一个。
OpenSSL 3.0 Migration Guide中有关于升级到OpenSSL 3.0的总体信息。
-
-
在运行时,OpenSSL库和OpenSSL FIPS对象模块必须作为共享对象可用。可以编译静态链接 OpenSSL 对象,但是MySQL不能使用它们。
FIPS模式已经在EL7上测试过,但可能也可以在其他系统上工作。
如果您的平台或操作系统提供了OpenSSL FIPS对象模块,您可以使用它。否则,可以从源代码中构建OpenSSL库和FIPS对象模块,按照fips_module
手册页(见FIPS概述)中的说明进行。
本节中描述的服务器端和客户端选项已经弃用。
MySQL 在服务器端和客户端控制FIPS模式:
-
服务器端系统变量
ssl_fips_mode
控制是否在FIPS模式下运行。 -
客户端选项
--ssl-fips-mode
控制某个MySQL客户端是否在FIPS模式下运行。
服务器端系统变量ssl_fips_mode
和客户端选项--ssl-fips-mode
允许这些值:
-
OFF
: 禁用FIPS模式。 -
ON
: 启用FIPS模式。 -
STRICT
: 启用“严格”FIPS模式。
在服务器端,数字ssl_fips_mode
值0、1和2等同于OFF
、ON
和STRICT
,分别。
一般来说,STRICT
比 ON
更加严格,但是 MySQL 自身没有 FIPS-特定的代码,只是将 FIPS 模式值指定给 OpenSSL。FIPS 模式对 ON
或 STRICT
的确切行为取决于 OpenSSL 版本。详细信息,请参阅 FIPS 概述。
如果 OpenSSL FIPS 对象模块不可用,那么唯一允许的值为 ssl_fips_mode
和 --ssl-fips-mode
的值是 OFF
。尝试将 FIPS 模式设置为不同值时会出现错误。
服务器端的 FIPS 模式适用于服务器执行的加密操作,这包括复制(源/副本和 Group Replication)和 X 插件,都是在服务器内部运行。
FIPS 模式也适用于客户端尝试连接到服务器。启用 FIPS 模式时,在客户端或服务器端,它限制了支持的加密算法可以选择的范围。然而,启用 FIPS 模式并不要求必须使用加密连接,也不要求用户凭证必须加密。例如,如果启用 FIPS 模式,强大的加密算法是必需的。在特定情况下,MD5 是受限制的,所以尝试使用如 RC4-MD5
的加密算法建立加密连接不起作用。但是,没有什么关于 FIPS 模式可以防止建立未加密连接。(要做到这点,可以使用CREATE USER
或 ALTER USER
对特定用户账户,或者将require_secure_transport
系统变量设置为影响所有账户。)