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
- PROCESS 权限控制对有关服务器内执行的线程的信息 (即会话执行的语句的信息) 的访问
SUPER已过时,将来会删除。
- 允许动态修改系统变量
- 允许使用 SET GLOBAL、SET PERSIST 语句修改全局系统变量
- 对应的动态权限是 SYSTEM_VARIABLES_ADMIN
- 允许设置会话级系统变量
- 对应的动态权限是 SESSION_VARIABLES_ADMIN
- 允许使用 SET GLOBAL、SET PERSIST 语句修改全局系统变量
- 允许对全局事务特征的更改
- 对应的动态权限是 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 权限才能创建或更改存储的功能
- 允许通过 PURGE BINARY LOGS 和 BINLOG 语句控制二进制日志
-
在执行视图或存储程序时允许设置有效授权 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 语句
- CHANGE REPLICATION SOURCE TO 语句的权限
- 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
- init_connect
- 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';