密钥环迁移将密钥从一个密钥库复制到另一个密钥库,使 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
所需的权限。除了SYSTEM_VARIABLES_ADMIN
或已弃用的SUPER
权限之外,这些权限还包括ENCRYPTION_KEY_ADMIN
。如果在线迁移操作异常退出(例如,如果它被强行终止),则
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 可以连接到它并告诉它在迁移操作期间暂停密钥环的使用。--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
系统变量。任何不支持的服务器都必须在迁移之前停止,并在之后重新启动。