Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  Migrating Keys Between Keyring Keystores

8.4.4.14 密钥环密钥迁移到其他密钥环存储

密钥环迁移将密钥从一个密钥存储复制到另一个,启用 DBA 将 MySQL 安装切换到不同的密钥存储。成功的迁移操作将产生以下结果:

  • 目标密钥存储包含迁移之前的密钥,以及来自源密钥存储的密钥。

  • 源密钥存储在迁移之前和之后保持不变(因为密钥被复制,而不是移动)。

如果要复制的密钥已经存在于目标密钥存储中,将发生错误,并将目标密钥存储恢复到迁移前的状态。

密钥环使用密钥环组件和密钥环插件来管理密钥存储。这与迁移策略相关,因为源密钥存储和目标密钥存储的管理方式将确定特定类型的密钥迁移是否可能,并确定执行它的过程:

  • 从一个密钥环插件迁移到另一个:MySQL 服务器具有这种能力的操作模式。

  • 从密钥环插件迁移到密钥环组件:MySQL 服务器具有这种能力的操作模式。

  • 从一个密钥环组件迁移到另一个:mysql_migrate_keyring 实用程序提供了这种能力。

  • 从密钥环组件迁移到密钥环插件:没有这种能力的规定。

以下部分讨论离线和在线迁移的特征,并描述如何执行迁移。

离线和在线密钥迁移

密钥迁移要么是离线的,要么是在线的:

  • 离线迁移:用于您确定本地主机上没有运行服务器使用源或目标密钥存储的情况。在这种情况下,迁移操作可以安全地将密钥从源密钥存储复制到目标,而不需要担心运行服务器在操作期间修改密钥存储内容。

  • 在线迁移:用于本地主机上有运行服务器使用源密钥存储的情况。在这种情况下,需要采取措施防止运行服务器在迁移期间更新密钥存储内容。这涉及连接到运行服务器,并指示它暂停密钥环操作,以便安全地将密钥从源密钥存储复制到目标。当密钥复制完成后,运行服务器将被允许恢复密钥环操作。

当您计划密钥迁移时,请使用以下要点来决定是否应该是离线或在线:

  • 不要对正在使用的密钥存储执行离线迁移。

  • 在线迁移期间暂停密钥环操作是通过连接到运行服务器并将其全局 keyring_operations 系统变量设置为 OFF 之前复制密钥,然后设置为 ON 之后复制密钥。这有几个含义:

    • keyring_operations 是在 MySQL 5.7.21 中引入的,因此在线迁移仅在运行服务器是 MySQL 5.7.21 或更高版本时才可能。如果运行服务器是较旧的版本,则必须停止它,执行离线迁移,然后重新启动它。所有其他迁移说明都受此条件的限制。

    • 用于连接到运行服务器的帐户必须具有修改 keyring_operations 所需的权限。这些权限是 ENCRYPTION_KEY_ADMIN,加上要么是 SYSTEM_VARIABLES_ADMIN,要么是已弃用的 SUPER 权限。

    • 如果在线迁移操作异常退出(例如,如果它被强制终止),那么 keyring_operations 可能会在运行服务器上保持禁用状态,无法执行密钥环操作。在这种情况下,可能需要连接到运行服务器并手动启用 keyring_operations 使用以下语句:

      SET GLOBAL keyring_operations = ON;
  • 在线密钥迁移提供了在单个运行服务器上暂停密钥环操作的功能。要在多个运行服务器上使用密钥存储时执行迁移,请使用 涉及多个运行服务器的密钥迁移 中描述的过程。

使用迁移服务器的密钥迁移
Note

使用迁移服务器的在线密钥迁移仅在运行服务器允许套接字连接或使用 TLS 的 TCP/IP 连接时支持;不支持在 Windows 平台上运行的服务器仅允许共享内存连接的情况。

MySQL 服务器可以变成迁移服务器,如果以特殊的操作模式启动,以支持密钥迁移。迁移服务器不接受客户端连接,而是仅运行足够长的时间以迁移密钥,然后退出。迁移服务器将错误报告到控制台(标准错误输出)。

迁移服务器支持以下迁移类型:

  • 从一个密钥环插件迁移到另一个。

  • 从密钥环插件迁移到密钥环组件。较旧的服务器仅支持从一个密钥环插件迁移到另一个,在这种情况下,这些说明中关于密钥环组件的部分不适用。

迁移服务器不支持从一个密钥环组件迁移到另一个。对于这种类型的迁移,请参阅 使用 mysql_migrate_keyring 实用程序的密钥迁移

要执行密钥迁移操作使用迁移服务器,确定所需的密钥迁移选项,以指定参与迁移的密钥环插件或组件,以及迁移是否在线或离线:

  • 要指示源密钥环插件和目标密钥环插件或组件,指定以下选项:

    --keyring-migration-source--keyring-migration-destination 选项表明服务器应该在密钥迁移模式下运行。对于密钥迁移操作,这两个选项都是必需的。每个插件或组件都使用其库文件的名称指定,包括平台特定的扩展名,如 .so.dll。源和目标必须不同,迁移服务器必须同时支持它们。

  • 对于离线迁移,不需要其他密钥迁移选项。

  • 对于在线迁移,某个运行服务器当前正在使用源或目标密钥存储。要调用迁移服务器,需要指定其他密钥迁移选项,以指示如何连接到运行服务器。这是必要的,以便迁移服务器可以连接到运行服务器,并告诉它在迁移操作期间暂停密钥环使用。

    使用以下任何选项都表明在线迁移:assistant<|end_header_id|> Please note that I've translated the text into Simplified Chinese. If you need Traditional Chinese, please let me know.

有关密钥迁移选项的更多详细信息,请参阅 第 8.4.4.18 节,“密钥环命令选项”

使用密钥迁移选项启动迁移服务器,指示源和目标密钥存储以及迁移是否在线,可能还有其他选项。请注意以下几点:

  • 可能需要其他服务器选项,例如两个密钥环插件的配置参数。例如,如果 keyring_file 是源或目标,您必须设置 keyring_file_data 系统变量,如果密钥环数据文件位置不是默认位置。其他非密钥环选项也可能是必需的。可以使用 --defaults-file 指定选项文件来指定这些选项。

  • 迁移服务器期望路径名选项值是完整路径。相对路径名可能不会按预期解析。

  • 启动密钥迁移模式的用户不能是 root 操作系统用户,除非指定了 --user 选项,以非 root 用户名来运行服务器。

  • 在密钥迁移模式下运行的用户必须有权限读取和写入任何本地密钥环文件,例如文件基于插件的数据文件。

    如果您从与正常运行 MySQL 不同的系统帐户中启动迁移服务器,它可能会创建密钥环目录或文件,这些文件对服务器在正常操作期间不可访问。假设 mysqld 通常以 mysql 操作系统用户身份运行,但您以 isabel 身份启动迁移服务器。迁移服务器创建的任何新目录或文件都将归 isabel 所有。随后的启动失败,因为以 mysql 操作系统用户身份运行的服务器尝试访问由 isabel 所拥有的文件系统对象。

    要避免这个问题,请以 root 操作系统用户身份启动迁移服务器,并提供 --user=user_name 选项,其中 user_name 是通常用于运行 MySQL 的系统帐户。或者,在迁移后,检查密钥环相关的文件系统对象,并使用 chownchmod 或类似命令更改所有权和权限,以便服务器可以访问这些对象。

离线迁移之间的两个密钥环插件的示例命令行(在一行中输入命令):

mysqld --defaults-file=/usr/local/mysql/etc/my.cnf
  --keyring-migration-source=keyring_file.so
  --keyring-migration-destination=keyring_encrypted_file.so
  --keyring_encrypted_file_password=password

在线迁移之间的两个密钥环插件的示例命令行:

mysqld --defaults-file=/usr/local/mysql/etc/my.cnf
  --keyring-migration-source=keyring_file.so
  --keyring-migration-destination=keyring_encrypted_file.so
  --keyring_encrypted_file_password=password
  --keyring-migration-host=127.0.0.1
  --keyring-migration-user=root
  --keyring-migration-password=root_password

要执行从密钥环插件到密钥环组件的迁移,请指定 --keyring-migration-to-component 选项,并将组件名称作为 --keyring-migration-destination 选项的值。

从密钥环插件到密钥环组件的离线迁移的示例命令行:

mysqld --defaults-file=/usr/local/mysql/etc/my.cnf
  --keyring-migration-to-component
  --keyring-migration-source=keyring_file.so
  --keyring-migration-destination=component_keyring_encrypted_file.so

注意,在这种情况下,不指定 keyring_encrypted_file_password 值。组件数据文件的密码列在组件配置文件中。

从密钥环插件到密钥环组件的在线迁移的示例命令行:

mysqld --defaults-file=/usr/local/mysql/etc/my.cnf
  --keyring-migration-to-component
  --keyring-migration-source=keyring_file.so
  --keyring-migration-destination=component_keyring_encrypted_file.so
  --keyring-migration-host=127.0.0.1
  --keyring-migration-user=root
  --keyring-migration-password=root_password

密钥迁移服务器按照以下步骤执行迁移操作:

  1. (仅在线迁移) 使用连接选项连接到运行服务器。

  2. (仅在线迁移) 在运行服务器上禁用 keyring_operations

  3. 加载源 keystores 和目标 keystores 的密钥环插件/组件库。

  4. 从源 keystores 复制密钥到目标 keystores。

  5. 卸载源 keystores 和目标 keystores 的密钥环插件/组件库。

  6. (仅在线迁移) 在运行服务器上启用 keyring_operations

  7. (仅在线迁移) 从运行服务器断开连接。

如果在密钥迁移过程中出现错误,目标 keystores 将恢复到其预迁移状态。

在成功的在线密钥迁移操作后,运行服务器可能需要重新启动:

  • 如果运行服务器在迁移前使用源 keystores 并且在迁移后继续使用它,则不需要重新启动服务器。

  • 如果运行服务器在迁移前使用目标 keystores 并且在迁移后继续使用它,则需要重新启动服务器以加载所有迁移到目标 keystores 的密钥。

  • 如果运行服务器在迁移前使用源 keystores 但在迁移后使用目标 keystores,则必须重新配置服务器以使用目标 keystores 并重新启动。在这种情况下,需要注意在迁移和重新启动之间的间隔期间,服务器不会修改源 keystores,因为任何这样的更改都不会反映在目标 keystores 中。

使用 mysql_migrate_keyring 实用程序的密钥迁移

mysql_migrate_keyring 实用程序将密钥从一个密钥环组件迁移到另一个。它不支持涉及密钥环插件的迁移。对于那种类型的迁移,请使用在密钥迁移模式下的 MySQL 服务器;见 使用迁移服务器的密钥迁移

要使用 mysql_migrate_keyring 进行密钥迁移操作,确定密钥迁移选项以指定参与的密钥环组件和是否为离线或在线迁移:

  • 要指示源和目标密钥环组件及其位置,指定以下选项:

    • --source-keyring:源密钥环组件,管理要迁移的密钥。

    • --destination-keyring:目标密钥环组件,将迁移到的密钥。

    • --component-dir:包含密钥环组件库文件的目录。这通常是本地 MySQL 服务器的 plugin_dir 系统变量的值。

    所有三个选项都是必需的。每个密钥环组件名称都是不带平台特定扩展名(如 .so.dll)的组件库文件名。例如,要使用组件库文件 component_keyring_file.so,请指定选项为 --source-keyring=component_keyring_file。源和目标必须不同,且 mysql_migrate_keyring 必须支持它们两个。

  • 对于离线迁移,不需要其他选项。

  • 对于在线迁移,当前有一台运行服务器正在使用源或目标 keystores。在这种情况下,指定 --online-migration 选项以表示在线迁移。此外,指定连接选项以指示如何连接到运行服务器,以便 mysql_migrate_keyring 可以连接到它并告诉它在迁移操作期间暂停密钥环使用。

    选项 --online-migration 通常与连接选项一起使用,例如:

    • --主机: 运行服务器所在的主机。这总是本地主机,因为 mysql_migrate_keyring 只能在本地组件管理的密钥存储之间迁移密钥。

    • --用户, --密码: 用于连接到运行服务器的账户凭证。

    • --端口: 对于 TCP/IP 连接,连接到运行服务器的端口号。

    • --套接字: 对于 Unix 套接字文件或 Windows 命名管道连接,连接到运行服务器的套接字文件或命名管道。

有关所有可用选项的描述,请参阅 第 6.6.8 节,“mysql_migrate_keyring — Keyring Key Migration Utility”

使用选项启动 mysql_migrate_keyring,指示源和目标密钥存储区,以及是否进行离线或在线迁移,可能还有其他选项。请注意以下几点:

  • 调用 mysql_migrate_keyring 的用户不能是 root 操作系统用户。

  • 调用 mysql_migrate_keyring 的用户必须有权限读取和写入任何本地密钥环文件,例如文件基于插件的数据文件。

    如果您从与通常运行 MySQL 不同的系统帐户调用 mysql_migrate_keyring,它可能会创建密钥环目录或文件,这些文件对服务器在正常操作期间不可访问。假设 mysqld 通常以 mysql 操作系统用户身份运行,但您以 isabel 身份调用 mysql_migrate_keyring。任何由 mysql_migrate_keyring 创建的新目录或文件都将归 isabel 所有。随后启动失败,因为以 mysql 操作系统用户身份运行的服务器尝试访问由 isabel 所拥有的文件系统对象。

    要避免这个问题,请以 mysql 操作系统用户身份调用 mysql_migrate_keyring。或者,在迁移后,检查密钥环相关的文件系统对象,并使用 chownchmod 或类似命令更改所有权和权限,以便对象对运行服务器可访问。

假设您想从 component_keyring_file 迁移到 component_keyring_encrypted_file,并且本地服务器将其密钥环组件库文件存储在 /usr/local/mysql/lib/plugin 中。

如果没有运行服务器使用密钥环,离线迁移是允许的。以单行命令调用 mysql_migrate_keyring

mysql_migrate_keyring
  --component-dir=/usr/local/mysql/lib/plugin
  --source-keyring=component_keyring_file
  --destination-keyring=component_keyring_encrypted_file

如果运行服务器正在使用密钥环,您必须执行在线迁移。在线迁移需要 --online-migration 选项,连同指定服务器连接选项。

以下命令执行在线迁移。它使用 TCP/IP 连接连接到本地服务器,并使用 admin 帐户。命令将提示输入密码,请在提示时输入:

mysql_migrate_keyring
  --component-dir=/usr/local/mysql/lib/plugin
  --source-keyring=component_keyring_file
  --destination-keyring=component_keyring_encrypted_file
  --online-migration --host=127.0.0.1 --user=admin --password

mysql_migrate_keyring 执行以下迁移操作:

  1. (在线迁移 only) 使用连接选项连接到正在运行的服务器。

  2. (在线迁移 only) 在正在运行的服务器上禁用 keyring_operations

  3. 加载源 keystores 和目标 keystores 的密钥环组件库。

  4. 从源 keystores 复制密钥到目标 keystores。

  5. 卸载源 keystores 和目标 keystores 的密钥环组件库。

  6. (在线迁移 only) 在正在运行的服务器上启用 keyring_operations

  7. (在线迁移 only) 从正在运行的服务器断开连接。

如果在密钥迁移期间发生错误,目标 keystores 将被恢复到其预迁移状态。

在成功的在线密钥迁移操作后,正在运行的服务器可能需要重新启动:

  • 如果正在运行的服务器在迁移前使用源 keystores 并且在迁移后继续使用它,不需要在迁移后重新启动。

  • 如果正在运行的服务器在迁移前使用目标 keystores 并且在迁移后继续使用它,应该在迁移后重新启动以加载所有迁移到目标 keystores 的密钥。

  • 如果正在运行的服务器在迁移前使用源 keystores 但在迁移后应该使用目标 keystores,必须重新配置以使用目标 keystores 并重新启动。在这种情况下,需要注意,在迁移和重新启动之间的间隔期间,服务器不会暂停修改源 keystores,因为任何这种修改都不会反映在目标 keystores 中。

多个正在运行的服务器的密钥迁移

在线密钥迁移提供了暂停单个正在运行的服务器的密钥环操作。要执行涉及多个正在运行的服务器的迁移,请使用以下过程:

  1. 手动连接到每个正在运行的服务器,并设置 keyring_operations=OFF。这确保了没有正在运行的服务器使用源 keystores 或目标 keystores,满足了离线迁移的要求。

  2. 使用迁移服务器或 mysql_migrate_keyring 执行每个暂停服务器的离线密钥迁移。

  3. 手动连接到每个正在运行的服务器,并设置 keyring_operations=ON

所有正在运行的服务器必须支持 keyring_operations 系统变量。任何不支持的服务器必须在迁移前停止并在迁移后重新启动。