mysql 拷贝权限_mysql8 参考手册--复制权限检查

默认情况下,当已经被另一个服务器接受的事务应用于复制从属或组成员时,MySQL复制(包括组复制)不执行特权检查。从MySQL 8.0.18开始,您可以创建一个具有适当特权的用户帐户,以应用通常在通道上复制的事务,并PRIVILEGE_CHECKS_USER使用一条CHANGE MASTER TO语句将该用户帐户指定为复制应用程序的 帐户。然后,MySQL将根据用户帐户的权限检查每个事务,以验证您已授权该通道的操作。管理员也可以安全地使用该帐户从mysqlbinlog应用或重新应用事务 输出,例如从通道上的复制错误中恢复。

PRIVILEGE_CHECKS_USER帐户 的使用有助于保护复制通道,以防止未经授权或意外使用特权或不需要的操作。PRIVILEGE_CHECKS_USER在以下情况下,该 帐户可提供额外的安全保护:

您正在组织网络上的服务器实例与另一个网络上的服务器实例(例如云服务提供商提供的实例)之间进行复制。

您希望将多个本地或异地部署作为单独的单元进行管理,而又不给所有部署一个管理员帐户特权。

您希望拥有一个管理员帐户,该帐户使管理员能够仅执行与复制通道及其复制的数据库直接相关的操作,而不要对服务器实例具有广泛的特权。

CHANGE MASTER TO 在PRIVILEGE_CHECKS_USER为通道指定帐户时,可以 通过在语句中 添加以下一个或两个选项来提高应用特权检查的复制通道的安全性:

该REQUIRE_ROW_FORMAT选项(可从MySQL 8.0.19获得)使复制通道仅接受基于行的复制事件。当 REQUIRE_ROW_FORMAT设置,则必须使用基于行的二进制日志(binlog_format=ROW在主)。在MySQL 8.0.18 REQUIRE_ROW_FORMAT 中不可用,但是仍然强烈建议对安全复制通道使用基于行的二进制日志记录。使用基于语句的二进制日志记录,该PRIVILEGE_CHECKS_USER帐户可能需要一些管理员级别的权限才能 成功执行事务。

该REQUIRE_TABLE_PRIMARY_KEY_CHECK选项(可从MySQL 8.0.20获得)使复制通道将其自己的策略用于主键检查。设置 ON意味着始终需要主键,而设置OFF意味着不再需要主键。默认设置() 使用从主服务器为每个事务复制的STREAM值来设置sql_require_primary_key系统变量的会话值 。当 PRIVILEGE_CHECKS_USER被设置时,设置 REQUIRE_TABLE_PRIMARY_KEY_CHECK于任一 ON或OFF表示该用户帐户不需要会话管理级别的权限即可设置受限的会话变量,而更改的值是必需的 sql_require_primary_key。它还可以针对不同的主服务器规范跨复制通道的行为。

您授予REPLICATION_APPLIER 特权以使用户帐户显示为PRIVILEGE_CHECKS_USER复制应用程序线程的权限 ,并执行BINLOGmysqlbinlog 使用的内部使用 语句。该PRIVILEGE_CHECKS_USER帐户的用户名和主机名 必须遵循第6.2.4节“指定帐户名”中所述的语法,并且该用户不得为匿名用户(用户名为空)或 CURRENT_USER。要创建一个新帐户,请使用 CREATE USER。要授予此帐户REPLICATION_APPLIER特权,请使用以下GRANT语句。例如,要创建一个用户帐户priv_repl,管理员可以从该帐户中的任何主机手动使用该帐户example.com 域,并且需要加密的连接,请发出以下语句:

mysql>SET sql_log_bin = 0;

mysql>CREATE USER 'priv_repl'@'%.example.com' IDENTIFIED BY 'password' REQUIRE SSL;

mysql>GRANT REPLICATION_APPLIER ON *.* TO 'priv_repl'@'%.example.com';

mysql>SET sql_log_bin = 1;

使用这些SET sql_log_bin语句是为了使帐户管理语句不会添加到二进制日志中,也不会发送到复制通道(请参见 第13.4.1.3节“ SET sql_log_bin语句”)。

重要

caching_sha2_password对于从MySQL 8.0创建的新用户 ,身份验证插件是默认的(有关详细信息,请参见 第6.4.1.2节“缓存SHA-2可插入身份验证”)。要使用通过此插件进行身份验证的用户帐户连接到服务器,必须按照第17.3.1节“设置复制以使用加密的连接”中所述 设置加密的连接,或者启用未加密的连接以支持密码交换使用RSA密钥对。

设置用户帐户后,使用该 GRANT语句授予其他特权,以使用户帐户能够执行希望应用程序线程执行的数据库更改,例如更新服务器上保存的特定表。如果管理员需要在复制通道上手动执行任何这些事务,则这些相同的特权使管理员可以使用该帐户。如果尝试执行您未授予其适当特权的意外操作,则该操作将被禁止,并且复制应用程序线程会因错误而停止。 第17.3.3.1节“复制PRIVILEGE_CHECKS_USER帐户的特权”说明该帐户需要哪些其他特权。例如,要授予priv_repl用户帐户INSERT向中的cust表添加行的 权限 db1,请发出以下语句:

mysql>GRANT INSERT ON db1.cust TO 'priv_repl'@'%.example.com';

您可以PRIVILEGE_CHECKS_USER使用CHANGE MASTER TO语句为复制通道分配帐户。强烈建议在PRIVILEGE_CHECKS_USER设置时使用基于行的二进制日志记录 ,并且从MySQL 8.0.19开始,您可以使用语句 REQUIRE_ROW_FORMAT来强制执行此操作。如果复制正在运行,请STOP SLAVE在CHANGE MASTER TO语句之前和START SLAVE之后发出。例如,要channel_1在正在运行的复制从属服务器上的通道上启动特权检查,请发出以下语句:

mysql> STOP SLAVE FOR CHANNEL 'channel_1';

mysql> CHANGE MASTER TO

PRIVILEGE_CHECKS_USER = 'priv_repl'@'%.example.com',

REQUIRE_ROW_FORMAT = 1 FOR CHANNEL 'channel_1';

mysql> START SLAVE FOR CHANNEL 'channel_1';

重新启动复制通道时,从那时起将应用特权检查。如果您未指定通道并且不存在其他通道,则该语句将应用于默认通道。PRIVILEGE_CHECKS_USER通道帐户的用户名和主机名 显示在“性能模式” replication_applier_configuration 表中,在此处正确进行了转义,因此可以将它们直接复制到SQL语句中以执行单个事务。

当REQUIRE_ROW_FORMAT被设定为一个复制的信道,则复制施加不创建或删除临时表,因此不设置 pseudo_thread_id会话系统变量。它不执行LOAD DATA INFILE 指令,因此不会尝试文件操作来访问或删除与数据加载相关联的临时文件(记录为 Format_description_log_event)。它不执行INTVAR,RAND和 USER_VAR事件,这些事件用于为基于语句的复制重现客户端的连接状态。(一个例外是USER_VAR与DDL查询关联的事件(已执行)。它不执行DML事务中记录的任何语句。如果复制请求者在尝试排队或应用事务时检测到任何此类事件,则不应用该事件,并且复制会因错误而停止。

REQUIRE_ROW_FORMAT无论是否设置PRIVILEGE_CHECKS_USER帐户, 都可以设置复制通道 。设置此选项时实施的限制即使没有特权检查也可以提高复制通道的安全性。您还--require-row-format可以在使用mysqlbinlog时指定该选项,以在mysqlbinlog输出中强制执行基于行的复制事件。

安全上下文。 默认情况下,使用指定为的用户帐户启动复制应用程序线程时 PRIVILEGE_CHECKS_USER,将使用默认角色创建安全上下文,或者将所有角色(如果activate_all_roles_on_login设置为)创建安全上下文 ON。

您可以使用角色向用作PRIVILEGE_CHECKS_USER 帐户的帐户提供常规特权集,如以下示例所示。在这里,与其像在前面的示例中那样直接向用户帐户授予表的INSERT特权, db1.cust不如将此特权priv_repl_role与REPLICATION_APPLIER特权一起 授予该角色 。然后使用该角色将特权集授予两个用户帐户,这两个用户帐户现在都可以用作 PRIVILEGE_CHECKS_USER帐户:

mysql>SET sql_log_bin = 0;

mysql>CREATE USER 'priv_repa'@'%.example.com'

IDENTIFIED BY 'password'

REQUIRE SSL;

mysql>CREATE USER 'priv_repb'@'%.example.com'

IDENTIFIED BY 'password'

REQUIRE SSL;

mysql>CREATE ROLE 'priv_repl_role';

mysql>GRANT REPLICATION_APPLIER TO 'priv_repl_role';

mysql>GRANT INSERT ON db1.cust TO 'priv_repl_role';

mysql>GRANT 'priv_repl_role' TO

'priv_repa'@'%.example.com',

'priv_repb'@'%.example.com';

mysql>SET DEFAULT ROLE 'priv_repl_role' TO

'priv_repa'@'%.example.com',

'priv_repb'@'%.example.com';

mysql>SET sql_log_bin = 1;

请注意,当复制应用程序线程创建安全上下文时,它将检查该PRIVILEGE_CHECKS_USER帐户的特权 ,但不执行密码验证,也不执行与帐户管理有关的检查,例如检查帐户是否被锁定。在复制应用程序线程的生存期内,创建的安全上下文将保持不变。

局限性。 仅在MySQL 8.0.18中,如果从属mysqld在发出一条RESET SLAVE语句后立即重新启动(由于服务器崩溃或有意重新启动),PRIVILEGE_CHECKS_USER则mysql.slave_relay_log_info表中保存的帐户设置将 丢失,必须重新指定。当您在该发行版中使用特权检查时,请始终在重新启动后验证它们是否就位,并在需要时重新指定它们。在MySQL 8.0.19中,PRIVILEGE_CHECKS_USER在这种情况下保留了 帐户设置,因此可以从表中检索帐户设置并将其重新应用到通道。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值