MySQL 提供的权限

MySQL 提供的权限

MySQL 的权限信息存储在授权表中。

可用权限列表:https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html

权限级别

管理权限

  • 管理 MySQL 服务器

数据库权限

  • 管理数据库和所有数据库对象

数据库对象权限

  • 管理数据库对象

静态权限

修改权限

  • ALTER
    • ALTER TABLE 语句的权限
    • ALTER TABLE 还需要 CREATE、INSERT 权限
  • ALTER ROUTINE
    • alter/drop 存储例程 (存储过程和函数) 的权限

创建权限

  • CREATE USER
    • ALTER USER/CREATE ROLE/CREATE USER/DROP ROLE/DROP USER/RENAME USER/REVOKE ALL PRIVILEGES 语句的权限
  • CREATE ROLE
    • CREATE ROLE 语句的权限
    • CREATE USER 也提供此权限,并且权限更大
  • CREATE
    • create 数据库和表的权限
  • CREATE VIEW
    • CREATE VIEW 语句的权限
  • CREATE ROUTINE
    • create 存储例程 (存储过程和函数) 的权限
  • CREATE TABLESPACE
    • create/alter/drop tablespace 和日志组的权限
  • CREATE TEMPORARY TABLES
    • CREATE TEMPORARY TABLE 语句的权限
    • 临时表被创建后,不会做进一步的权限检查

删除权限

  • DELETE
    • delete 表中数据的权限
  • DROP
    • drop 数据库、表、视图的权限
    • ALTER TABLE … DROP PARTITION 语句和 TRUNCATE TABLE 语句也需要 DROP 权限
  • DROP ROLE
    • DROP ROLE 语句的权限
    • CREATE USER 也提供 DROP ROLE 的权限,并且权限更大

重要权限汇总

  • ALL, ALL PRIVILEGES
    • 全部权限
  • FILE
    • 允许使用 LOAD DATA 和 SELECT … INTO OUTFILE 语句以及 LOAD_FILE() 函数,在服务器主机上读写文件
    • 允许在 MySQL 服务器具有写访问权的任何目录中创建新文件
    • 允许对 CREATE TABLE 语句使用 DATA DIRECTORY 或 INDEX DIRECTORY 选项
    • 作为安全措施,服务器不会覆盖现有文件
      • 限制文件读写权限
        • secure_file_priv
  • PROCESS
    • PROCESS 权限控制对有关服务器内执行的线程的信息 (即会话执行的语句的信息) 的访问
      • SHOW PROCESSLIST
      • mysqladmin processlist
      • 信息表 INFORMATION_SCHEMA.PROCESSLIST
    • 此权限使用户可以访问有关所有线程的信息,包括属于其他用户的线程

    • 如果没有 PROCESS 权限,则非匿名用户只能访问有关自己线程的信息,而其他用户则不能访问线程,并且匿名用户不能访问线程信息
    • SHOW ENGINE 语句的权限,可以访问信息表

      • INFORMATION_SCHEMA.INNODB_xxx
      • INFORMATION_SCHEMA.FILES_xxx
  • SUPER

    已过时,将来会删除。

    • 允许动态修改系统变量
      • 允许使用 SET GLOBAL、SET PERSIST 语句修改全局系统变量
        • 对应的动态权限是 SYSTEM_VARIABLES_ADMIN
      • 允许设置会话级系统变量
        • 对应的动态权限是 SESSION_VARIABLES_ADMIN
    • 允许对全局事务特征的更改
      • 对应的动态权限是 SYSTEM_VARIABLES_ADMIN
    • 复制和组复制
      • 使帐户能够启动和停止复制,包括组复制
        • 普通复制对应的动态权限是 REPLICATION_SLAVE_ADMIN
        • 组复制对应的动态权限是 GROUP_REPLICATION_ADMIN
      • 允许使用 CHANGE REPLICATION SOURCE TO | CHANGE MASTER TO 和 CHANGE REPLICATION FILTER 语句
        • 对应的动态权限是 REPLICATION_SLAVE_ADMIN
    • 二进制日志
      • 允许通过 PURGE BINARY LOGS 和 BINLOG 语句控制二进制日志
        • 对应的动态权限是 BINLOG_ADMIN
      • 如果启用了二进制日志记录,则可能还需要 SUPER 权限才能创建或更改存储的功能

    • 在执行视图或存储程序时允许设置有效授权 ID。具有此权限的用户可以在视图或存储程序的 DEFINER 属性中指定任何帐户

      • 对应的动态权限是 SET_USER_ID
    • CREATE SERVER、ALTER SERVER、DROP SERVER 语句的权限

    • mysqladmin debug 命令的权限
    • 允许 InnoDB 加密密钥轮换

      • 对应的动态权限是 ENCRYPTION_KEY_ADMIN
    • 允许执行版本令牌用户定义的功能
      • 对应的动态权限是 VERSION_TOKEN_ADMIN
    • 允许使用 GRANT 语句中的 WITH ADMIN OPTION 子句 grant 或 revoke 角色,和 ROLES_GRAPHML() 函数的非空 元素内容
      • 对应的动态权限是 ROLE_ADMIN
    • 允许控制非超级用户的拒绝连接
      • 允许 KILL 语句或 mysqladmin kill 命令杀死属于其他用户的线程
      • 使服务器不执行 init_connect 系统变量内容
      • 在达到系统变量 max_connections 配置的最大连接数时,允许服务器接收 SUPER 客户端的连接
      • offline 模式下,允许来自 SUPER 客户端的新连接
      • 即使启用了系统变量 read_only,也可以执行 update

操作数据库对象的权限

  • EVENT
    • create/alter/drop/display events 的权限
  • INDEX
    • create/drop 索引的权限
  • TRIGGER
    • 允许触发器的操作,表需要此权限才能 create/drop/execute/display triggers 以及执行触发器
  • INSERT
    • insert 表的权限
    • ANALYZE TABLE/OPTIMIZE TABLE/REPAIR TABLE 这些表维护语句也需要 INSERT 权限
  • LOCK TABLES
    • LOCK TABLES 语句的权限
  • SELECT
    • SELECT 语句的权限
    • UPDATE 语句的列表达式 col_name=expr 中,也需要 SELECT 权限
    • DELETE/UPDATE 的 WHERE 子句也需要此权限
    • 与 EXPLAIN 一起使用的表/视图也需要此权限
  • UPDATE
    • 允许表中数据 update
  • EXECUTE
    • execute 存储例程 (存储过程和函数) 的权限

其他权限

  • GRANT OPTION
    • grant/revoke 的权限
  • PROXY
    • 代理权限
  • REFERENCES
    • 创建外键约束要求父表具有 REFERENCES 权限
  • RELOAD
    • FLUSH 语句的权限
    • 与 FLUSH 操作等效的 mysqladmin 命令
      • flush-hosts, flush-logs, flush-privileges, flush-status, flush-tables, flush-threads, refresh 和 reload
      • reload 命令告诉服务器将授权表重新加载到内存中
    • 与 FLUSH 操作的相关的 mysqldump 选项
      • –flush-logs 和 –master-data
  • REPLICATION CLIENT
    • SHOW REPLICAS | SHOW SLAVE HOSTS, SHOW RELAYLOG EVENTS和SHOW BINARY LOGS 语句的权限
    • mysqlbinlog 的选项:–read-from-remote-server(-R) 和–read-from-remote-master 也需要此权限
  • SHOW DATABASES
    • SHOW DATABASE 语句的权限
  • SHOW VIEW
    • SHOW CREATE VIEW 语句的权限
    • 与 EXPLAIN 一起使用的视图也需要此权限
  • SHUTDOWN
    • SHUTDOWN/RESTART 语句的权限
    • mysqladmin shutdown 命令的权限
    • C API 函数 mysql_shutdown() 的权限
  • USAGE
    • 无权限
      • 使用全局级别的 GRANT … WITH GRANT OPTION 语句,而无需指定权限。
      • SHOW GRANTS 显示 USAGE 无权限

动态权限

大多数动态权限是在服务器启动时定义的,还有一部分是由特定的组件/插件定义,必须先启用相应的组件/插件,否则这些权限不可用。

与插件相关

  • APPLICATION_PASSWORD_ADMIN
    • 对于双密码功能,允许 ALTER USER、SET PASSWORD 子句 (RETAIN CURRENT PASSWORD和 DISCARD OLD PASSWORD) 来操纵第二密码
    • 如果允许一个帐户操作所有帐户的第二密码,则应授予该帐户 CREATE USER 权限
  • AUDIT_ADMIN
    • 允许配置审计日志。
    • 由 audit_log 插件定义
  • CLONE_ADMIN
    • CLONE 语句的权限
    • 包含了 BACKUP_ADMIN/SHUTDOWN 权限
  • FIREWALL_ADMIN
    • 所有用户防火墙规则的管理权限。
    • 由 MYSQL_FIREWALL 插件定义。
  • FIREWALL_USER
    • 更新自己的防火墙规则的权限。
    • 由 MYSQL_FIREWALL 插件定义。
  • ENCRYPTION_KEY_ADMIN
    • 允许 InnoDB 加密密钥轮换
  • VERSION_TOKEN_ADMIN
    • 允许执行版本令牌用户定义的功能。此权限由 version_tokens 插件定义。

与备份相关

  • BACKUP_ADMIN
    • 允许执行 LOCK INSTANCE FOR BACKUP 语句,和访问性能表 performance_schema.log_status
    • 访问性能表 log_status 还需要 SELECT 权限
    • 早期版本升级到 8.0 版本时,具有 RELOAD 权限的用户会被自动收取此权限

与二进制日志相关

  • BINLOG_ADMIN
    • 允许通过 PURGE BINARY LOGS 和 BINLOG 语句控制二进制日志
  • BINLOG_ENCRYPTION_ADMIN
    • 允许设置系统变量 binlog_encryption。这个变量用于激活或禁用二进制日志和中继日志的加密

redo 日志相关

  • INNODB_REDO_LOG_ARCHIVE
    • 激活/禁用 redo 日志的权限
  • INNODB_REDO_LOG_ENABLE
    • 通过 ALTER INSTANCE {ENABLE|DISABLE} INNODB REDO_LOG 语句激活/禁用 redo 日志的权限

与复制/组复制相关

  • GROUP_REPLICATION_ADMIN
    • 通过 START|STOP GROUP REPLICATION 语句启动/停止组复制的权限
    • 修改系统变量 group_replication_consistency 的权限
    • 使用函数 group_replication_set_write_concurrency() 和 group_replication_set_communication_protocol() 的权限
  • REPLICATION_APPLIER
    • CHANGE REPLICATION SOURCE TO 语句的权限
      • 开启复制通道,并且 mysqlbinlog 的输出中包含 BINLOG 语句
  • REPLICATION_SLAVE_ADMIN
    • 通过 START REPLICA | SLAVE 和 STOP REPLICA | SLAVE 语句开始和停止复制的权限
    • CHANGE REPLICATION SOURCE TO 语句和 CHANGE REPLICATION FILTER 语句的权限
    • 不适用于组复制,组复制权限是 GROUP_REPLICATION_ADMIN

与刷新相关

  • FLUSH_OPTIMIZER_COSTS
    • FLUSH_OPTIMIZER_COSTS 语句的权限
  • FLUSH_STATUS
    • FLUSH STATUS 语句的权限
  • FLUSH_TABLES
    • FLUSH TABLES 语句的权限
  • FLUSH_USER_RESOURCES
    • FLUSH USER_RESOURCES 语句的权限

与资源组相关

  • RESOURCE_GROUP_ADMIN
    • 资源组的管理权限,包括创建,更改和删除资源组以及将线程和语句分配给资源组
  • RESOURCE_GROUP_USER
    • 分配资源组线程和语句的权限。此权限可以使用 SET RESOURCE GROUP 语句和 RESOURCE_GROUP 优化器提示

与设置系统变量相关

  • SYSTEM_VARIABLES_ADMIN
    • 允许动态修改系统变量
      • SET GLOBAL 和 SET PERSIST 语句
      • SET PERSIST_ONLY 语句 (此语句还需要PERSIST_RO_VARIABLES_ADMIN 权限)
      • 允许设置受限制的会话级系统变量的权限
    • 允许修改全局事务特征

  • PERSIST_RO_VARIABLES_ADMIN

    • 通过 SET PERSIST_ONLY 语句进行持久化全局变量的设置
    • 持久化设置同时还需要 SYSTEM_VARIABLES_ADMIN 和 PERSIST_RO_VARIABLES_ADMIN 权限
  • SESSION_VARIABLES_ADMIN
    • 允许设置受限制的会话级系统变量的权限 (一些特殊的变量需要此权限)
      • 系统变量
        • binlog_format
        • sql_log_bin
        • sql_log_off
    • 此权限是 SYSTEM_VARIABLES_ADMIN 和
      SUPER 权限的子集

与用户/角色相关

  • SYSTEM_USER

    • 系统用户权限。
    • 用来区分系统用户和普通用户,由此权限的是系统用户,无此权限的是普通用户
  • SET_USER_ID
    • 在执行视图或存储程序时允许设置有效授权 ID。具有此权限的用户可以在视图或存储程序的 DEFINER 属性中指定任何帐户
  • ROLE_ADMIN
    • 允许使用 GRANT 语句中的 WITH ADMIN OPTION 子句 grant/revoke 角色,和 ROLES_GRAPHML() 函数的非空 元素内容
    • 设置系统变量 mandatory_roles 需要此权限

与连接相关

  • CONNECTION_ADMIN
    • 允许使用 KILL 语句或 mysqladmin kill 命令杀掉其他用户的线程
    • 允许设置与客户端连接有关的系统变量,或规避客户端连接相关的限制
      • init_connect
        • 此权限不执行这个变量值
      • max_connections
        • 达到最大连接数后,仍然允许此权限的客户端连接
      • offline_mode
        • 脱机模式下,仍然会接收此权限的客户端的新连接
      • read_only
        • 只读模式下,此权限的用户仍然可以 update
  • SERVICE_CONNECTION_ADMIN
    • 允许使用管理连接接口的权限

其他

  • SHOW_ROUTINE
    • 查看存储例程 (存储过程和函数) 的定义和属性的权限
      • 信息表 INFORMATION_SCHEMA.ROUTINES
      • SHOW CREATE FUNCTION 和 SHOW CREATE PROCEDURE 语句
      • SHOW FUNCTION CODE 和 SHOW PROCEDURE CODE 语句
      • SHOW FUNCTION STATUS 和 SHOW PROCEDURE STATUS 语句
  • TABLE_ENCRYPTION_ADMIN
    • 当开启 table_encryption_privilege_check 时,允许用户覆盖默认的加密设置
  • XA_RECOVER_ADMIN
    • XA RECOVER 语句的权限
  • NDB_STORED_USER
    • 新加入 NDB 集群中时,允许分享用户、角色、权限

静态权限和动态权限对比

  • 静态权限内置在服务器中
    • 它们始终可以授予用户帐户,并且不能取消注册
  • 动态权限可以在运行时注册和注销
    • 定义动态权限的组件/插件在初始化过程中注册它们,卸载后,并不会取消注册。
    • 注册的权限信息持久保存在 mysql.global_grants 表中。
      • 服务器启动时,自动注册表中权限
      • GRANT/REVOKE 语句可以更改表的内容
      • FLUSH PRIVILEGES 语句,读取 global_grants 表中所有动态权限,注册未注册的权限
  • 动态权限仅适用于全局级别

  • ALL 包含所有静态权限和已注册的动态权限

权限授予准则

仅向帐户授予所需的权限。

  • 滥用 FILE 权限,会导致可以从主机任意读取文件

  • GRANT OPTION 权限使用户可以将其权限授予其他用户

  • ALTER 权限可以用于通过重命名表来颠覆权限系统

  • 可以利用 SHUTDOWN 权限通过关闭服务器来完全拒绝向其他用户提供服务

  • PROCESS 权限可用于查看当前正在执行的语句的纯文本,包括设置或更改密码的语句

  • SUPER 权限可用于终止其他会话或更改服务器的运行方式

  • 授予 mysql 系统数据库本身的权限,可用于更改密码和其他访问权限

将帐户从 SUPER 迁移到动态权限

迁移原因

  • 许多以前需要 SUPER 权限的操作,与动态权限相关连,动态权限可以受到更严格的限制
  • SUPER 权限已过时,将来会删除。

迁移过程

  • 查找 SUPER 权限的账户

    SELECT GRANTEE FROM INFORMATION_SCHEMA.USER_PRIVILEGES WHERE PRIVILEGE_TYPE = 'SUPER';
    
    • INFORMATION_SCHEMA.USER_PRIVILEGES
  • 以动态权限替换和回收 SUPER 权限
    GRANT BINLOG_ADMIN, SYSTEM_VARIABLES_ADMIN ON *.* TO 'u1'@'localhost';
    REVOKE SUPER ON *.* FROM 'u1'@'localhost';
    

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注