密钥环迁移将密钥从一个密钥库复制到另一个密钥库,使 DBA 能够将 MySQL 安装切换到不同的密钥库。成功的迁移操作具有以下结果
目标密钥库包含它在迁移之前拥有的密钥,以及源密钥库中的密钥。
源密钥库在迁移之前和之后保持不变(因为密钥是复制的,而不是移动的)。
如果要复制的密钥已存在于目标密钥库中,则会发生错误,并且目标密钥库将恢复到迁移前的状态。
密钥环使用密钥环组件和密钥环插件来管理密钥库。这与迁移策略有关,因为源和目标密钥库的管理方式决定了执行给定类型密钥迁移的过程
从一个密钥环插件迁移到另一个:MySQL 服务器具有提供此功能的操作模式。
从密钥环插件迁移到密钥环组件:MySQL 服务器具有提供此功能的操作模式。
从一个密钥环组件迁移到另一个:mysql_migrate_keyring 实用程序提供了此功能。
从密钥环组件迁移到密钥环插件:MySQL 服务器具有提供此功能的操作模式。
以下部分讨论了离线和在线迁移的特性,并描述了如何执行迁移。
密钥迁移可以是离线的,也可以是在线的
离线迁移:当你确定本地主机上没有运行的服务器正在使用源或目标密钥库时使用。在这种情况下,迁移操作可以将密钥从源密钥库复制到目标密钥库,而不会出现运行的服务器在操作期间修改密钥库内容的可能性。
在线迁移:当你确定本地主机上运行的服务器正在使用源密钥库时使用。在这种情况下,必须注意防止该服务器在迁移期间更新密钥库。这涉及连接到运行的服务器,并指示它暂停密钥环操作,以便可以安全地将密钥从源密钥库复制到目标密钥库。当密钥复制完成后,允许运行的服务器恢复密钥环操作。
当你规划密钥迁移时,使用以下几点来确定它应该是离线的还是在线的
不要执行涉及正在运行的服务器使用的密钥库的离线迁移。
在线迁移期间暂停密钥环操作是通过连接到运行的服务器,在密钥复制之前将其全局
keyring_operations
系统变量设置为OFF
,在密钥复制之后设置为ON
来完成的。这有几个含义keyring_operations
是在 MySQL 5.7.21 中引入的,因此在线迁移只有在运行的服务器来自 MySQL 5.7.21 或更高版本时才有可能。如果运行的服务器版本较旧,则必须停止它,执行离线迁移,然后重新启动它。其他所有提到了keyring_operations
的迁移说明都受此条件约束。连接到运行服务器的帐户必须具有修改
keyring_operations
所需的权限。 这些权限是ENCRYPTION_KEY_ADMIN
以及SYSTEM_VARIABLES_ADMIN
或已弃用的SUPER
权限。如果在线迁移操作异常退出(例如,强制终止),则
keyring_operations
可能在运行服务器上保持禁用状态,使其无法执行密钥环操作。 在这种情况下,可能需要连接到运行服务器并使用以下语句手动启用keyring_operations
SET GLOBAL keyring_operations = ON;
在线密钥迁移提供暂停单个运行服务器上的密钥环操作的功能。 如果多个运行服务器使用所涉及的密钥存储,要执行迁移,请使用 涉及多个运行服务器的密钥迁移 中描述的步骤。
仅当运行服务器允许使用 TLS 的套接字连接或 TCP/IP 连接时,才支持使用迁移服务器进行在线密钥迁移;例如,当服务器在 Windows 平台上运行并且仅允许共享内存连接时,它不受支持。
如果 MySQL 服务器以支持密钥迁移的特殊操作模式调用,则它将成为迁移服务器。 迁移服务器不接受客户端连接。 相反,它只运行足够长的时间来迁移密钥,然后退出。 迁移服务器将错误报告到控制台(标准错误输出)。
迁移服务器支持以下迁移类型
从一个密钥环插件迁移到另一个密钥环插件。
从密钥环插件迁移到密钥环组件。
从密钥环组件迁移到密钥环插件。
迁移服务器不支持从一个密钥环组件迁移到另一个密钥环组件。 对于这种类型的迁移,请参见 使用 mysql_migrate_keyring 实用程序进行密钥迁移。
要使用迁移服务器执行密钥迁移操作,请确定需要指定的密钥迁移选项,包括哪些密钥环插件或组件参与以及迁移是离线还是在线。
要指示源密钥环插件和目标密钥环插件或组件,请指定以下选项
--keyring-migration-source
: 管理要迁移的密钥的源密钥环组件或插件。--keyring-migration-destination
: 要将迁移的密钥复制到的目标密钥环插件或组件。--keyring-migration-to-component
: 如果目标是密钥环组件,则需要此选项。--keyring-migration-from-component
: 如果源是密钥环组件,则需要此选项。
--keyring-migration-source
和--keyring-migration-destination
选项表示服务器应以密钥迁移模式运行。 对于密钥迁移操作,这两个选项都是必需的。 每个插件或组件都使用其库文件的名称指定,包括任何平台特定的扩展名,例如.so
或.dll
。 源和目标必须不同,并且迁移服务器必须同时支持它们。对于离线迁移,不需要额外的密钥迁移选项。
对于在线迁移,某些运行服务器当前正在使用源或目标密钥存储。 要调用迁移服务器,请指定其他密钥迁移选项,这些选项指示如何连接到运行服务器。 这是必要的,以便迁移服务器可以连接到运行服务器并告诉它在迁移操作期间暂停密钥环使用。
使用以下任何选项表示在线迁移
--keyring-migration-host
: 运行服务器所在的宿主机。 这始终是本地主机,因为迁移服务器只能迁移本地插件和组件管理的密钥存储之间的密钥。--keyring-migration-user
、--keyring-migration-password
: 用于连接到运行服务器的帐户凭据。--keyring-migration-port
: 对于 TCP/IP 连接,运行服务器上要连接到的端口号。--keyring-migration-socket
: 对于 Unix 套接字文件或 Windows 命名管道连接,运行服务器上要连接到的套接字文件或命名管道。
有关密钥迁移选项的更多详细信息,请参见 第 8.4.4.15 节,“密钥环命令选项”。
使用指示源和目标密钥存储以及迁移是离线还是在线的密钥迁移选项启动迁移服务器,可能还会使用其他选项。 请记住以下事项
可能需要其他服务器选项;也可能需要其他非密钥环选项。 指定这些选项的一种方法是使用
--defaults-file
来命名包含所需选项的选项文件。迁移服务器期望路径名选项值是完整路径。 相对路径名可能无法按预期解析。
以密钥迁移模式调用服务器的用户不得是
root
操作系统用户,除非指定了--user
选项,并且指定了非root
用户名以该用户身份运行服务器。以密钥迁移模式运行的服务器的用户必须有权读取和写入任何本地密钥环文件,例如基于文件的插件的数据文件。
如果您从与通常用于运行 MySQL 的系统帐户不同的系统帐户调用迁移服务器,它可能会创建密钥环目录或文件,这些目录或文件在正常操作期间无法访问服务器。 假设 mysqld 通常以
mysql
操作系统用户身份运行,但您在以isabel
身份登录时调用迁移服务器。 迁移服务器创建的任何新目录或文件都由isabel
拥有。 当以mysql
操作系统用户身份运行的服务器尝试访问由isabel
拥有的文件系统对象时,后续启动将失败。要避免此问题,请以
root
操作系统用户身份启动迁移服务器,并提供--user=
选项,其中user_name
user_name
是通常用于运行 MySQL 的系统帐户。 或者,在迁移后,检查密钥环相关文件系统对象,并使用 chown、chmod 或类似命令更改其所有权和权限,以便运行服务器可以访问这些对象。
两个密钥环插件之间离线迁移的示例命令行(在单行上输入命令)
mysqld --defaults-file=/usr/local/mysql/etc/my.cnf
--keyring-migration-source=keyring_okv.so
--keyring-migration-destination=keyring_aws.so
两个密钥环插件之间在线迁移的示例命令行
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
密钥迁移服务器按以下方式执行迁移操作
(仅在线迁移)使用连接选项连接到运行服务器。
(仅在线迁移)禁用运行服务器上的
keyring_operations
。加载源和目标密钥存储的密钥环插件或组件库。
将密钥从源密钥存储复制到目标密钥存储。
卸载源和目标密钥存储的密钥环插件或组件库。
(仅在线迁移)启用运行服务器上的
keyring_operations
。(仅在线迁移)断开与运行服务器的连接。
如果在密钥迁移期间发生错误,则目标密钥存储将恢复到其迁移前的状态。
在线密钥迁移操作成功完成后,可能需要重新启动运行服务器
如果运行服务器在迁移之前使用源密钥存储,并且应该在迁移之后继续使用它,则无需在迁移之后重新启动它。
如果运行服务器在迁移之前使用目标密钥存储,并且应该在迁移之后继续使用它,则应该在迁移之后重新启动它以加载迁移到目标密钥存储的所有密钥。
如果运行服务器在迁移之前使用源密钥存储,但在迁移之后应该使用目标密钥存储,则必须重新配置它以使用目标密钥存储并重新启动。 在这种情况下,请注意,尽管运行服务器在迁移本身期间被暂停修改源密钥存储,但在迁移和后续重新启动之间的间隔内它没有被暂停。 应注意,服务器在此间隔内不要修改源密钥存储,因为任何此类更改都不会反映在目标密钥存储中。
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 必须同时支持它们。对于离线迁移,不需要其他选项。
对于在线迁移,一些正在运行的服务器当前正在使用源或目标密钥存储。在这种情况下,请指定
--online-migration
选项以表示在线迁移。此外,请指定连接选项,说明如何连接到正在运行的服务器,以便 mysql_migrate_keyring 可以连接到它并告诉它在迁移操作期间暂停密钥环使用。The
--online-migration
选项通常与以下连接选项一起使用--host
: 正在运行的服务器所在的宿主机。这始终是本地主机,因为 mysql_migrate_keyring 只能迁移本地组件管理的密钥存储之间的密钥。--user
,--password
: 用于连接到正在运行的服务器的帐户凭据。--port
: 对于 TCP/IP 连接,在正在运行的服务器上连接到的端口号。--socket
: 对于 Unix 套接字文件或 Windows 命名管道连接,在正在运行的服务器上连接到的套接字文件或命名管道。
有关所有可用选项的描述,请参见 第 6.6.8 节,“mysql_migrate_keyring — 密钥环密钥迁移实用程序”。
使用指示源和目标密钥存储以及迁移是离线还是在线的选项启动 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。或者,在迁移之后,检查与密钥环相关的文件系统对象,并使用 chown、chmod 或类似命令更改其所有权和权限(如果需要),以便正在运行的服务器可以访问这些对象。
假设您要将密钥从 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
选项,以及指定要连接的服务器和要使用的 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_migrate_keyring 执行迁移操作如下
(仅在线迁移)使用连接选项连接到运行服务器。
(仅在线迁移)禁用运行服务器上的
keyring_operations
。加载源和目标密钥存储的密钥环组件库。
将密钥从源密钥存储复制到目标密钥存储。
卸载源和目标密钥存储的密钥环组件库。
(仅在线迁移)启用运行服务器上的
keyring_operations
。(仅在线迁移)断开与运行服务器的连接。
如果在密钥迁移期间发生错误,则目标密钥存储将恢复到其迁移前的状态。
在线密钥迁移操作成功完成后,可能需要重新启动运行服务器
如果运行服务器在迁移之前使用源密钥存储,并且应该在迁移之后继续使用它,则无需在迁移之后重新启动它。
如果运行服务器在迁移之前使用目标密钥存储,并且应该在迁移之后继续使用它,则应该在迁移之后重新启动它以加载迁移到目标密钥存储的所有密钥。
如果运行服务器在迁移之前使用源密钥存储,但在迁移之后应该使用目标密钥存储,则必须重新配置它以使用目标密钥存储并重新启动。 在这种情况下,请注意,尽管运行服务器在迁移本身期间被暂停修改源密钥存储,但在迁移和后续重新启动之间的间隔内它没有被暂停。 应注意,服务器在此间隔内不要修改源密钥存储,因为任何此类更改都不会反映在目标密钥存储中。
在线密钥迁移提供了暂停单个正在运行的服务器上的密钥环操作的功能。如果要迁移多个正在运行的服务器正在使用所涉及的密钥存储,请使用此过程
手动连接到每个正在运行的服务器并设置
keyring_operations=OFF
。这确保了没有正在运行的服务器使用源或目标密钥存储,并满足了离线迁移所需的条件。使用迁移服务器或 mysql_migrate_keyring 为每个已暂停的服务器执行离线密钥迁移。
手动连接到每个正在运行的服务器并设置
keyring_operations=ON
。
所有正在运行的服务器必须支持 keyring_operations
系统变量。任何不支持的服务器都必须在迁移之前停止,并在迁移之后重新启动。