## 6.8 FIPS 支持

[](<>)[](<>)[](<>)

MySQL 支持 FIPS 模式，如果使用 OpenSSL 1.0.2 编译，并且 OpenSSL 库和 FIPS 对象模块在运行时可用。

服务器端的 FIPS 模式适用于服务器执行的加密操作。这包括在服务器中运行的复制（源/副本和组复制）和 X 插件。FIPS 模式也适用于客户端连接到服务器的尝试。

以下部分描述了 FIPS 模式以及如何在 MySQL 中利用它：

-   [FIPS 概述](fips-mode.html#fips-overview)

-   [MySQL 中 FIPS 模式的系统要求](fips-mode.html#fips-system-requirements)

-   [在 MySQL 中配置 FIPS 模式](fips-mode.html#fips-configuration)

### FIPS 概述

联邦信息处理标准 140-2 (FIPS 140-2) 描述了联邦（美国政府）机构可能要求的用于保护敏感或有价值信息的加密模块的安全标准。要被认为可以接受此类联邦使用，加密模块必须经过 FIPS 140-2 认证。如果旨在保护敏感数据的系统缺少适当的 FIPS 140-2 证书，联邦机构将无法购买。

OpenSSL 等产品可以在 FIPS 模式下使用，尽管 OpenSSL 库本身并未针对 FIPS 进行验证。相反，OpenSSL 库与 OpenSSL FIPS 对象模块一起使用，以使基于 OpenSSL 的应用程序能够在 FIPS 模式下运行。

有关 FIPS 及其在 OpenSSL 中的实施的一般信息，这些参考资料可能会有所帮助：

-   [美国国家标准与技术研究院 FIPS PUB 140-2](https://doi.org/10.6028/NIST.FIPS.140-2)

-   [OpenSSL FIPS 140-2 安全策略](https://www.openssl.org/docs/fips/)

-   [OpenSSL FIPS 对象模块 v2.0 用户指南](https://www.openssl.org/docs/fips/UserGuide-2.0.pdf)

重要的

FIPS 模式对加密操作施加条件，例如对可接受的加密算法的限制或对更长密钥长度的要求。对于 OpenSSL，确切的 FIPS 行为取决于 OpenSSL 版本。有关详细信息，请参阅 OpenSSL FIPS 用户指南。

### MySQL 中 FIPS 模式的系统要求

MySQL 要支持 FIPS 模式，必须满足以下系统要求：

-   在构建时，必须使用 OpenSSL 编译 MySQL。如果编译使用与 OpenSSL 不同的 SSL 库，则无法在 MySQL 中使用 FIPS 模式。

    此外，MySQL 必须使用经过 FIPS 认证的 OpenSSL 版本进行编译。OpenSSL 1.0.2 已通过认证，但 OpenSSL 1.1.1 未通过认证。MySQL 最新版本的二进制发行版在某些平台上使用 OpenSSL 1.1.1 编译，这意味着它们未通过 FIPS 认证。这会导致可用 MySQL 功能的权衡，具体取决于系统和 MySQL 配置：

    -   使用具有 OpenSSL 1.0.2 和所需 FIPS 对象模块的系统。在这种情况下，如果您使用使用 OpenSSL 1.0.2 编译的二进制发行版，或者使用 OpenSSL 1.0.2 从源代码编译 MySQL，则可以为 MySQL 启用 FIPS 模式。但是，在这种情况下，您不能使用 TLSv1.3 协议或密码套件（需要 OpenSSL 1.1.1）。此外，您使用的 OpenSSL 版本已在 2019 年底达到生命周期结束状态。

    -   使用具有 OpenSSL 1.1.1 或更高版本的系统。在这种情况下，您可以使用二进制包安装 MySQL，并且您可以使用 TLSv1.3 协议和密码套件，以及其他已经支持的 TLS 协议。但是，您不能为 MySQL 启用 FIPS 模式。

-   在运行时，OpenSSL 库和 OpenSSL FIPS 对象模块必须作为共享（动态链接）对象提供。可以构建静态链接的 OpenSSL 对象，但 MySQL 不能使用它们。

    FIPS 模式已在 EL7 上针对 MySQL 进行了测试，但可能适用于其他系统。

    如果您的平台或操作系统提供 OpenSSL FIPS 对象模块，您可以使用它。否则，您可以从源代码构建 OpenSSL 库和 FIPS 对象模块。使用 OpenSSL FIPS 用户指南中的说明（请参阅[FIPS 概述](fips-mode.html#fips-overview)）。

### 在 MySQL 中配置 FIPS 模式

MySQL 在服务器端和客户端启用 FIPS 模式的控制：

-   这[`ssl_fips_mode`](server-system-variables.html#sysvar_ssl_fips_mode)系统变量控制服务器是否在 FIPS 模式下运行。

-   这[`--ssl-fips-模式`](connection-options.html#option_general_ssl-fips-mode)client 选项控制给定的 MySQL 客户端是否在 FIPS 模式下运行。

    这[`ssl_fips_mode`](server-system-variables.html#sysvar_ssl_fips_mode)系统变量和[`--ssl-fips-模式`](connection-options.html#option_general_ssl-fips-mode)客户端选项允许这些值：

-   `离开`：禁用 FIPS 模式。

-   `在`：启用 FIPS 模式。

-   `严格的`：启用“严格”FIPS 模式。

    在服务器端，数字[`ssl_fips_mode`](server-system-variables.html#sysvar_ssl_fips_mode)值 0、1 和 2 等价于`离开`, `在`， 和`严格的`, 分别。

重要的

一般来说，`严格的`施加的限制比`在`，但 MySQL 本身没有 FIPS 特定的代码，除了为 OpenSSL 指定 FIPS 模式值。FIPS 模式的确切行为`在`要么`严格的`取决于 OpenSSL 版本。有关详细信息，请参阅 OpenSSL FIPS 用户指南（请参阅[FIPS 概述](fips-mode.html#fips-overview)）。

笔记

如果 OpenSSL FIPS 对象模块不可用，则唯一允许的值为[`ssl_fips_mode`](server-system-variables.html#sysvar_ssl_fips_mode)和[`--ssl-fips-模式`](connection-options.html#option_general_ssl-fips-mode)是`离开`.尝试将 FIPS 模式设置为不同的值时会发生错误。

服务器端的 FIPS 模式适用于服务器执行的加密操作。这包括在服务器中运行的复制（源/副本和组复制）和 X 插件。

FIPS 模式也适用于客户端连接到服务器的尝试。启用后，在客户端或服务器端，它会限制可以选择哪些受支持的加密密码。但是，启用 FIPS 模式并不要求必须使用加密连接，或者必须加密用户凭据。例如，如果启用 FIPS 模式，则需要更强的加密算法。特别是 MD5 受到限制，因此尝试使用加密密码建立加密连接，例如`RC4-MD5`不起作用。但是 FIPS 模式并没有阻止建立未加密的连接。（为此，您可以使用`要求`条款[`创建用户`](create-user.html)要么[`更改用户`](alter-user.html)对于特定的用户帐户，或设置[`require_secure_transport`](server-system-variables.html#sysvar_require_secure_transport)影响所有帐户的系统变量。）
