Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


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

8.4.4.11 密钥库之间迁移密钥

密钥库迁移将从一个密钥库复制密钥到另一个密钥库,从而使DBA能够将MySQL安装切换到不同的密钥库。成功的迁移操作将产生以下结果:

  • 目标密钥库包含迁移前它拥有的密钥,plus来自源密钥库的密钥。

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

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

密钥环使用密钥环组件和密钥环插件来管理密钥库。这与迁移策略相关,因为源密钥库和目标密钥库的管理方式确定了执行给定类型的密钥迁移的过程:

  • 从一个密钥环插件到另一个密钥环插件:MySQL服务器具有提供此能力的操作模式。

  • 从密钥环插件到密钥环组件:MySQL服务器具有提供此能力的操作模式。

  • 从一个密钥环组件到另一个密钥环组件:mysql_migrate_keyring实用工具提供了此能力。

  • 从密钥环组件到密钥环插件:MySQL服务器具有提供此能力的操作模式。

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

密钥迁移可以是离线或在线的:

  • 离线迁移:在您确定本地主机上没有运行服务器使用源或目标keystore时使用。在这种情况下,迁移操作可以从源keystore中复制密钥到目标keystore,而不可能在操作过程中由运行服务器修改keystore内容。

  • 在线迁移:在本地主机上有运行服务器使用源keystore时使用。在这种情况下,需要采取措施防止该服务器在迁移期间更新keystore。这个涉及连接到运行服务器并 instructing它暂停密钥ring操作,以便安全地从源keystore中复制密钥到目标keystore。当密钥复制完成后,可以允许运行服务器恢复密钥ring操作。

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

  • 不要执行离线迁移涉及正在使用的keystore。

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

    • keyring_operations从MySQL 5.7.21开始引入,因此在线迁移只能在运行的服务器是MySQL 5.7.21或更高版本的情况下进行。如果运行的服务器older,您必须停止它,执行离线迁移,并重新启动它。所有其他迁移指南中提到keyring_operations的都是受这个条件限制的。

    • 连接到正在运行的服务器所用的账户必须具有修改keyring_operations的权限。这些权限包括ENCRYPTION_KEY_ADMIN,在加上 either SYSTEM_VARIABLES_ADMIN 或已弃用的SUPER权限。

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

      SET GLOBAL keyring_operations = ON;
  • 在线密钥迁移提供了暂停单个运行服务器上的密钥环操作的功能。如果多个运行服务器正在使用涉及到的keystore,使用涉及多个运行服务器的密钥迁移中描述的过程进行迁移。

Note

使用migration server进行在线密钥迁移仅在运行服务器允许套接字连接或使用TLS的TCP/IP连接时支持;在例如,服务器运行于Windows平台且只允许共享内存连接时不支持。

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

migration server 支持以下迁移类型:

  • 从一个keyring插件迁移到另一个keyring插件。

  • 从keyring插件迁移到keyring组件。

  • 从keyring组件迁移到keyring插件。

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

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

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

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

  • 对于离线迁移,不需要任何额外的密钥迁移选项。

  • 对于在线迁移,有一个正在运行的服务器当前使用源或目标keystore。要启动迁移服务器,指定密钥迁移选项,以指示如何连接到正在运行的服务器。这是必要的,因为迁移服务器可以连接到正在运行的服务器,并告诉它在迁移操作期间暂停密钥ring 使用。

    使用以下任何选项表示在线迁移:

关于密钥迁移选项的详细信息,请参阅第8.4.4.15节,“Keyring Command Options”

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

  • 其他服务器选项可能需要;其他非密钥ring 选项也可能需要。一个方式是使用--defaults-file来指定包含所需选项的选项文件。

  • 迁移服务器期望路径名选项值为完整路径。相对路径名可能不会被解析为您所期望的那样。

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

  • 密钥迁移模式的服务器用户必须有权限读取和写入任何本地密钥ring 文件,例如文件插件的数据文件。

    如果您从通常用于运行 MySQL 的系统账户以外的账户启动迁移服务器,它可能会创建无法在正常操作中访问的密钥-ring 目录或文件。假设mysqld通常以mysql操作系统用户运行,但您在登录为isabel时启动迁移服务器。迁移服务器创建的任何新目录或文件都将由isabel操作系统用户所有权。随后,作为mysql操作系统用户运行的服务器在访问由isabel操作系统用户所有权的文件系统对象时失败。

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

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

mysqld --defaults-file=/usr/local/mysql/etc/my.cnf
  --keyring-migration-source=keyring_okv.so
  --keyring-migration-destination=keyring_aws.so

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

mysqld --defaults-file=/usr/local/mysql/etc/my.cnf
  --keyring-migration-source=keyring_okv.so
  --keyring-migration-destination=keyring_aws.so
  --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_okv.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_okv.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

当源是密钥环组件,而不是密钥环插件时,指定--keyring-migration-from-component选项,并将组件名称作为--keyring-migration-source选项的值。

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

mysqld --defaults-file=/usr/local/mysql/etc/my.cnf
  --keyring-migration-from-component
  --keyring-migration-source=component_keyring_file.so
  --keyring-migration-destination=keyring_okv.so
  --keyring-okv-conf-dir=/usr/local/mysql/mysql-keyring-okv

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

mysqld --defaults-file=/usr/local/mysql/etc/my.cnf
  --keyring-migration-from-component
  --keyring-migration-source=component_keyring_file.so
  --keyring-migration-destination=keyring_okv.so
  --keyring-okv-conf-dir=/usr/local/mysql/mysql-keyring-okv
  --keyring-migration-host=127.0.0.1
  --keyring-migration-user=root
  --keyring-migration-password=root_password

密钥迁移服务器执行迁移操作如下:

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

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

  3. 加载源和目标密钥库的keyring插件或组件库。

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

  5. 卸载源和目标密钥库的keyring插件或组件库。

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

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

如果在密钥迁移过程中发生错误,目标密钥库将恢复到迁移前的状态。

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

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

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

  • 如果运行服务器在迁移前使用源密钥库,但应该在迁移后使用目标密钥库,必须将服务器重新配置以使用目标密钥库,并重新启动。在这种情况下,请注意,即使服务器在迁移过程中暂停修改源密钥库,但是在迁移和重启之间的间隔期间,它仍然可以修改源密钥库。因此,在这个间隔期间,需要小心地确保服务器不修改源密钥库,因为任何这样的更改都将不会反映在目标密钥库中。

mysql_migrate_keyring 工具将密钥从一个密钥组件迁移到另一个密钥组件。它不支持涉及密钥插件的迁移。对于这种类型的迁移,请使用 MySQL 服务器在密钥迁移模式下运行;见Key Migration Using a Migration Server

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

  • 要指示源和目标密钥组件及其位置,请指定这些选项:

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

    • --destination-keyring:目标密钥组件,将迁移的密钥复制到其中。

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

    三个选项都是必需的。每个密钥ring 组件名称都是一个指定了文件名但没有平台特定扩展名(如.so.dll)的组件库文件名。例如,要使用library 文件为component_ keyring_file.so的组件,可以将选项指定为--source-keyring=component_keyring_file。源和目标必须不同,且mysql_migrate_keyring必须支持它们两个。

  • 对于离线迁移,无需额外选项。

  • 对于在线迁移,当前正在使用源或目标keystore的某个服务器。在这种情况下,请指定--online-migration选项以表示在线迁移。此外,还需要指定连接选项,以便mysql_migrate_keyring可以连接到它并在迁移操作期间告诉它暂停密钥ring 使用。

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

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

    • --user, --password: 连接到运行服务器所需的帐户凭证。

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

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

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

使用选项指示源和目标密钥库,并且是否在线或离线迁移,可能还有其他选项。请注意以下几点:

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

  • 调用mysql_ migrate_keyring的用户必须有权限读取和写入本地密钥-ring 文件,如文件插件的数据文件。

    如果您从通常用于运行 MySQL 的系统账户以外的系统账户调用mysql_ migrate_keyring,可能会创建密钥-ring 目录或文件,这些目录或文件在正常操作期间无法被服务器访问。例如,如果mysqld通常以mysql操作系统用户运行,但您使用isabel账户调用mysql_ migrate_keyring,那么创建的任何新目录或文件将由isabel账户所有。随后,服务器启动失败,因为以mysql操作系统用户运行的服务器无法访问由isabel账户所有的文件系统对象。

    为了避免这个问题,使用mysql_ migrate_keyring作为mysql操作系统用户。或者,在迁移后,检查keyring相关的文件系统对象,并使用chownchmod或类似命令更改对象的所有权和权限,以便这些对象可以被运行服务器访问。

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

如果没有运行的服务器使用keyring,则可以进行离线迁移。使用mysql_ migrate_keyring命令,如下所示(在单行中输入命令):

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

如果运行的服务器使用keyring,则必须进行在线迁移。在这种情况下,需要提供--online-migration选项,以及任何连接选项,以指定要连接到的服务器和MySQL账户。

以下命令执行在线迁移。它使用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_迁移密钥ring 执行以下迁移操作:

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

  2. (在线迁移-only) 在正在运行的服务器上禁用密钥ring_操作

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

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

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

  6. (在线迁移-only) 在正在运行的服务器上启用密钥ring_操作

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

如果在密钥迁移期间发生错误,目标密钥库将恢复到迁移前的状态。

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

  • 如果正在运行的服务器在迁移之前使用了源密钥库,并且应该继续使用它,在迁移完成后不需要重新启动。

  • 如果正在运行的服务器在迁移之前使用了目标密钥库,并且应该继续使用它,在迁移完成后需要重新启动,以便加载到目标密钥库中的所有已迁移到密钥。

  • 如果迁移前服务器正在使用源密钥库,但迁移后应该使用目标密钥库,需要将服务器重新配置为使用目标密钥库并重启。在这种情况下,请注意,即使在迁移过程中服务器暂停修改源密钥库,但是在迁移和重启之间的间隔期间服务器仍然可以修改源密钥库。因此,在这个间隔期间,需要确保服务器不修改源密钥库,因为任何这样的更改都将不会反映在目标密钥库中。

在线密钥迁移提供了暂停单个运行服务器的密钥操作。要在多个运行服务器使用涉及密钥库的情况下执行迁移,请按照以下步骤进行:

  1. 手动连接到每个运行服务器,并将keyring_operations=OFF设置为 OFF。这确保了没有运行服务器正在使用源或目标密钥库,满足了离线迁移所需的条件。

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

  3. 手动连接到每个运行服务器,并将keyring_operations=ON设置为 ON。

所有运行服务器都必须支持keyring_operations系统变量。如果有任何不支持的服务器,需要在迁移前停止该服务器,并在迁移后重启。