当主机系统上提供受支持的 OpenSSL 库和 FIPS 对象模块时,MySQL 支持 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,确切的 FIPS 行为取决于 OpenSSL 版本。
为了使 MySQL 支持 FIPS 模式,必须满足以下系统要求:
必须使用经过认证可与 FIPS 一起使用的 OpenSSL 版本编译 MySQL。OpenSSL 1.0.2 和 OpenSSL 3.0 已通过认证,但 OpenSSL 1.1.1 未通过认证。最近版本的 MySQL 的二进制发行版是在某些平台上使用 OpenSSL 3.0 编译的,这意味着它们未针对 FIPS 进行认证。这意味着您有以下选项,具体取决于系统和 MySQL 配置:
使用具有 OpenSSL 3.0 和所需 FIPS 对象模块的系统。在这种情况下,如果您使用使用 OpenSSL 3.0 编译的二进制发行版,或者使用 OpenSSL 3.0 从源代码编译 MySQL,则可以为 MySQL 启用 FIPS 模式。
有关升级到 OpenSSL 3.0 的一般信息,请参阅OpenSSL 3.0 迁移指南。
使用具有 OpenSSL 1.1.1 或更高版本的系统。在这种情况下,您可以使用二进制包安装 MySQL,并且除了其他已支持的 TLS 协议之外,您还可以使用 TLS v1.3 协议和密码套件。但是,您不能为 MySQL 启用 FIPS 模式。
使用具有 OpenSSL 1.0.2 和所需 FIPS 对象模块的系统。在这种情况下,如果您使用使用 OpenSSL 1.0.2 编译的二进制发行版,或者使用 OpenSSL 1.0.2 从源代码编译 MySQL,则可以为 MySQL 启用 FIPS 模式。在这种情况下,您不能使用 TLS v1.3 协议或密码套件,它们需要 OpenSSL 1.1.1 或 3.0。此外,您应该注意,OpenSSL 1.0.2 在 2019 年已达到生命周期终止状态,并且所有嵌入 OpenSSL 1.1.1 的操作系统平台将在 2024 年达到生命周期终止状态。
在运行时,OpenSSL 库和 OpenSSL FIPS 对象模块必须作为共享(动态链接)对象可用。
要确定 MySQL 是否在启用了 FIPS 模式的系统上运行,请使用 SQL 语句(例如 SHOW VARIABLES LIKE '%fips%'
或 SELECT @@ssl_fips_mode
)检查 ssl_fips_mode
服务器系统变量的值。如果此变量的值为 1 (ON
) 或 2 (STRICT
),则为 OpenSSL 启用了 FIPS 模式;如果为 0 (OFF
),则 FIPS 模式不可用。
通常,STRICT
比 ON
强制执行更多限制,但除了向 OpenSSL 指定 FIPS 模式值外,MySQL 本身没有其他特定于 FIPS 的代码。ON
或 STRICT
的 FIPS 模式的确切行为取决于 OpenSSL 版本。有关详细信息,请参阅 fips_module
联机帮助页(请参阅FIPS 概述)。
服务器端的 FIPS 模式适用于服务器执行的加密操作,包括 MySQL Replication(包括组复制)和在服务器内运行的 X Plugin 执行的操作。
FIPS 模式也适用于客户端尝试连接到服务器的操作。在客户端或服务器端启用 FIPS 模式后,它会限制可以选择哪些受支持的加密密码。但是,启用 FIPS 模式并不要求必须使用加密连接,也不要求必须对用户凭据进行加密。例如,如果启用了 FIPS 模式,则需要更强的加密算法。特别是,MD5 受限,因此尝试使用 RC4-MD5
等加密密码建立加密连接将不起作用。但是 FIPS 模式并没有阻止建立未加密连接。(为此,您可以对特定用户帐户使用 CREATE USER
或 ALTER USER
的 REQUIRE
子句,或者设置 require_secure_transport
系统变量来影响所有帐户。)
如果需要 FIPS 模式,建议使用包含该模式的操作系统平台;如果包含,则可以(并且应该)使用它。如果您的平台不包含 FIPS,则您有两个选择
迁移到支持 FIPS OpenSSL 的平台。
使用
fips_module
联机帮助页(请参阅 FIPS 概述)中的说明,从源代码构建 OpenSSL 库和 FIPS 对象模块。
如果 OpenSSL FIPS 对象模块不可用,则 ssl_fips_mode
和 --ssl-fips-mode
唯一允许的值为 OFF
。尝试将 FIPS 模式设置为其他值时会发生错误。
如果需要 FIPS 模式,建议使用包含该模式的操作系统平台;如果包含,则可以(并且应该)使用它。如果您的平台不包含 FIPS,则您有两个选择
迁移到支持 FIPS OpenSSL 的平台。
使用
fips_module
联机帮助页(请参阅 FIPS 概述)中的说明,从源代码构建 OpenSSL 库和 FIPS 对象模块。