当前位置: 首页 > news >正文

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语句:

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

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

相关文章:

  • RabbitMQ安装配置,封装工具类,发送消息及监听
  • 汽车IVI中控开发入门及进阶(三十一):视频知识扫盲
  • 2024年虚拟现实、图像和信号处理国际学术会议(ICVISP 2024)
  • AI音乐大模型:是颠覆还是助力?
  • 大众标准化杂志大众标准化杂志社大众标准化编辑部2024年第10期目录
  • 04. Java 多线程的创建
  • LogicFlow 学习笔记——9. LogicFlow 进阶 节点
  • 计算机组成原理必备知识点
  • PAT A1042. 洗牌机器
  • 数据库完整性基本概念及MySql语法
  • MYSQL数据库安装
  • SpringBoot整合SpringDataRedis
  • 使用Jetpack Compose和DummyJSON加速你的Android开发
  • Python Virtualenv:创建独立的 Python 开发环境
  • 天地图 uniapp使用笔记
  • dbForge Studioor MySQL v6 解锁版 安装教程(MYSQL数据库客户端)
  • ubuntu换镜像源方法
  • 课程设计---哈夫曼树的编码与解码(Java详解)
  • Stable diffusion 3 正式开源
  • 嵌入式硬件VS软件,到底哪个更难?
  • 华为鸿蒙电脑正式亮相,应用生态系统能否挑战Windows?
  • 融创中国:今年前4个月销售额约112亿元
  • 马上评|比余华与史铁生的友情更动人的是什么
  • 专访|高圆圆:像鸟儿一样,柔弱也自由
  • 深入贯彻中央八项规定精神学习教育中央第一指导组指导督导河北省见面会召开
  • 前瞻|美联储明晨“按兵不动”几无悬念:关税战阴霾下,会否释放降息信号