MySQL 支持 FIPS 模式,如果使用 OpenSSL 3.0 或 OpenSSL 1.0.2 编译,并且在运行时有可用的 OpenSSL 库和 FIPS 对象模块。
服务器端的 FIPS 模式适用于服务器执行的加密操作,包括复制(源/副本和组复制)和 X 插件,这些都在服务器内部运行。FIPS 模式还适用于客户端尝试连接到服务器。
以下部分描述了 FIPS 模式及其在 MySQL 中的使用方法:
联邦信息处理标准 140-2(FIPS 140-2)描述了一个安全标准,该标准可以由美国联邦机构用于保护敏感或有价值的信息。为了被认为适合联邦使用,一个加密模块必须获得 FIPS 140-2 认证。如果一个系统旨在保护敏感数据却缺乏适当的 FIPS 140-2 认证,联邦机构无法购买它。
产品如 OpenSSL 可以在 FIPS 模式下使用,尽管 OpenSSL 库本身不是 FIPS 认证的。相反,OpenSSL 库与 OpenSSL FIPS 对象模块一起使用,以使基于 OpenSSL 的应用程序能够在 FIPS 模式下运行。
关于 FIPS 及其在 OpenSSL 中的实现的常规信息,可以查看以下参考资料:
FIPS 模式对加密操作施加了条件,如加密算法的限制或更长的密钥长度。对于 OpenSSL,exact FIPS 行为取决于 OpenSSL 版本。
为了使 MySQL 支持 FIPS 模式,必须满足以下系统要求:
-
在编译时,MySQL 必须使用 OpenSSL 编译。FIPS 模式不能在 MySQL 中使用,如果编译使用的是不同于 OpenSSL 的 SSL 库。
此外,MySQL 必须使用 FIPS 认证的 OpenSSL 版本编译。OpenSSL 1.0.2 和 OpenSSL 3.0 是认证的,但 OpenSSL 1.1.1 不是。最近版本的 MySQL 二进制分布在某些平台上使用 OpenSSL 1.1.1 编译,这意味着它们不适合 FIPS 认证。这导致了根据系统和 MySQL 配置的可用功能的权衡:
-
使用一个具有 OpenSSL 1.0.2 和所需 FIPS 对象模块的系统。在这种情况下,如果您使用 OpenSSL 1.0.2 编译的二进制分布或从源代码编译 MySQL,可以启用 FIPS 模式。但是,在这种情况下,您不能使用 TLSv1.3 协议或密码套件(需要 OpenSSL 1.1.1)。此外,您正在使用一个已经于 2019 年底达到生命周期结束的 OpenSSL 版本。
-
使用一个具有 OpenSSL 1.1.1 或更高版本的系统。在这种情况下,您可以使用二进制包安装 MySQL,并且可以使用 TLSv1.3 协议和密码套件,另外还支持其他已经支持的 TLS 协议。然而,您不能启用 FIPS 模式。
-
使用一个具有 OpenSSL 3.0 和所需 FIPS 对象模块的系统。在这种情况下,如果您使用 OpenSSL 3.0 编译的二进制分布或从源代码编译 MySQL,可以启用 FIPS 模式。当 MySQL 使用 OpenSSL 3.0 编译,并且在运行时有可用的 OpenSSL 库和 FIPS 对象模块时,服务器将读取 OpenSSL 配置文件,并尊重 FIPS 提供商的首选项,如果设置了的话。
关于升级到 OpenSSL 3.0 的常规信息,请查看 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 特定的代码,除了指定 OpenSSL 的 FIPS 模式值。FIPS 模式的确切行为取决于 OpenSSL 的版本。详细信息,请参阅 fips_module
手册页(见 FIPS 概述)。
如果 OpenSSL FIPS 对象模块不可用,则 ssl_fips_mode
和 --ssl-fips-mode
的唯一允许值是 OFF
。尝试将 FIPS 模式设置为其他值将导致错误。
服务器端的 FIPS 模式适用于服务器执行的加密操作,包括复制(源/副本和组复制)和 X 插件,这些插件在服务器内部运行。
FIPS 模式还适用于客户端尝试连接到服务器的尝试。当启用 FIPS 模式时,无论是在客户端还是服务器端,它都会限制可以选择的加密算法。但是,启用 FIPS 模式并不要求必须使用加密连接,或者用户凭证必须加密。例如,如果启用 FIPS 模式,需要使用更强的加密算法。特别是,MD5 被限制,因此尝试使用加密算法如 RC4-MD5
建立加密连接将不起作用。但是,FIPS 模式并没有阻止建立非加密连接。(要做到这一点,可以使用 REQUIRE
子句为 CREATE USER
或 ALTER USER
对特定用户账户,或者设置 require_secure_transport
系统变量以影响所有账户。)