当前位置:   article > 正文

MySQL动态权限详解

MySQL动态权限详解

MySQL数据库系统在管理用户访问控制时,除了传统的静态权限之外,还引入了动态权限的概念。动态权限机制为系统管理员提供了更为灵活和细致的权限管理方式,允许根据运行时环境和特定组件的需求来定义和授予权限。本文将深入探讨MySQL动态权限的特性和应用方法。

动态权限的基本概念

动态权限与服务器启动时即已内置的静态权限相对,它们是在运行时由服务器或特定组件定义的。这意味着动态权限的存在与否依赖于相关组件是否被启用。例如,某些插件可能在安装时注册自己的动态权限,而这些权限只有在该插件激活时才生效。动态权限的设计使得权限管理能够更加适应多样化的应用场景和安全需求。

动态权限概览:

  • APPLICATION_PASSWORD_ADMIN(从MySQL 8.0.14起):为双密码功能服务,允许用户在修改自身账户时使用RETAIN CURRENT PASSWORDDISCARD OLD PASSWORD子句。
  • AUDIT_ABORT_EXEMPT(自MySQL 8.0.28始):允许查询绕过审计日志过滤器中的“abort”限制,由audit_log插件定义。
  • AUDIT_ADMIN:支持审计日志的管理。
  • NDB_STORED_USER(自NDB 8.0.18起):允许用户在NDB集群中存储,角色带有此权限也会被存储。
  • PASSWORDLESS_USER_ADMIN(自MySQL 8.0.27起):用于无密码账户的管理,创建无密码账户或处理复制用户时需要此权限。
  • PERSIST_RO_VARIABLES_ADMIN:结合SYSTEM_VARIABLES_ADMIN,允许使用SET PERSIST_ONLY命令只将只读系统变量持久化到配置文件,不影响运行时值。
  • REPLICATION_APPLIER:使账户能作为复制通道的权限检查用户,并执行mysqlbinlog输出中的BINLOG语句。
  • REPLICATION_SLAVE_ADMIN:允许连接到复制源服务器,使用START REPLICASTOP REPLICA管理复制,以及变更复制源设置。
  • RESOURCE_GROUP_ADMIN:提供资源组的全面管理能力,包括创建、修改和删除资源组,以及线程和语句的分配。
  • RESOURCE_GROUP_USER:仅允许用户将其线程和语句分配给资源组。
  • SET_USER_ID:允许在执行视图或存储程序时设定有效的授权ID,可指定任何账户作为DEFINER,且自MySQL 8.0.22起,能绕过防止存储对象成为孤儿或被意外采用的安全检查。
  • SHOW_ROUTINE(自MySQL 8.0.20起):允许访问所有存储例程的定义和属性,即使用户不是定义者。
  • SKIP_QUERY_REWRITE(自MySQL 8.0.31起):发出的查询不受Rewriter插件重写影响。
  • SYSTEM_USER(自MySQL 8.0.16起):区分系统用户与普通用户,系统用户拥有此权限。
其他特定场景权限包括:
  • FIREWALL_ADMINFIREWALL_EXEMPTFIREWALL_USER:分别用于管理、豁免和更新个人防火墙规则,由MYSQL_FIREWALL插件定义。
  • FLUSH_* 系列权限:如FLUSH_OPTIMIZER_COSTSFLUSH_STATUS等,允许执行相应的FLUSH语句,用于优化器成本刷新、状态刷新等。
  • GROUP_REPLICATION_ADMIN:管理Group Replication,包括启动/停止、一致性设置等。
  • GROUP_REPLICATION_STREAM:允许账户用于Group Replication的组通信连接。
  • INNODB_REDO_LOG_ARCHIVEINNODB_REDO_LOG_ENABLE:管理InnoDB重做日志存档和启用/禁用。
  • MASKING_DICTIONARIES_ADMIN:管理数据屏蔽词典,增删词典条目。

动态权限的注册与管理

MySQL服务器内部维护着一个动态权限的注册表,这些权限存储在内存中,并在服务器关闭时进行注销。组件(如插件)在安装初始化阶段通常会自动注册其定义的动态权限,但在卸载时并不会自动注销这些权限。重复安装同一组件不会因为权限已经注册而产生警告或错误。

动态权限仅在全球级别(全局范围)有效,且服务器通过mysql.global_grants系统表记录用户账户的动态权限分配情况。当服务器启动时(除非使用了--skip-grant-tables选项),会自动注册这个表中列出的所有动态权限。此外,GRANTREVOKE语句可以修改这些权限的分配状态,且这些更改是持久化的,不会因服务器重启而丢失。

动态权限的授予与撤销

在使用GRANTREVOKE语句时,如果指定了非静态权限,服务器会检查当前已注册的动态权限列表,如果找到匹配项则进行授权,否则报错提示未知权限。当使用GRANT ALL [PRIVILEGES]全局级别指令时,它会授予所有静态全局权限及当前已注册的所有动态权限,但之后新注册的动态权限不会追溯性地授予任何账户。相反,REVOKE ALL则会撤销所有已授予的静态和动态权限。

迁移账户从SUPER到动态权限

MySQL 8.0版本中,许多原本需要SUPER权限的操作现在关联有更具体范围的动态权限。这一改变旨在提高安全性,使数据库管理员能够避免广泛授予SUPER权限,而是根据实际操作需求精细化定制用户权限。由于SUPER权限已被废弃,未来版本中可能会被移除,因此,对于拥有SUPER权限的账户,应提前迁移至相应的动态权限上,以确保在SUPER权限移除后,这些账户仍能执行必要的操作。

示例与实践

例如,若要授予用户u1控制复制(包括组复制)和修改系统变量的权限,可使用以下GRANT语句:

  1. GRANT REPLICATION_SLAVE_ADMIN, GROUP_REPLICATION_ADMIN, BINLOG_ADMIN
  2. ON . TO 'u1'@'localhost';

动态权限的授予情况可通过SHOW GRANTS命令和INFORMATION_SCHEMA.USER_PRIVILEGES表查询得知。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/735432
推荐阅读
相关标签
  

闽ICP备14008679号