Documentation Home
MySQL 8.0 参考手册  / 第 6 章 安全  / 6.2 访问控制和账户管理  /  6.2.2 MySQL提供的权限

6.2.2 MySQL提供的权限

授予 MySQL 帐户的权限决定了该帐户可以执行哪些操作。MySQL 特权在它们应用的上下文和不同的操作级别上有所不同:

  • 管理权限使用户能够管理 MySQL 服务器的操作。这些权限是全局的,因为它们不特定于特定的数据库。

  • 数据库权限适用于数据库及其中的所有对象。可以为特定数据库或全局授予这些权限,以便它们适用于所有数据库。

  • 可以为数据库中的特定对象、数据库中给定类型的所有对象(例如,数据库中的所有表)或全局为所有对象授予表、索引、视图和存储例程等数据库对象的权限所有数据库中给定类型的对象。

权限在它们是静态的(内置于服务器中)还是动态的(在运行时定义)方面也有所不同。特权是静态的还是动态的会影响其授予用户帐户和角色的可用性。有关静态和动态权限之间差异的信息,请参阅 静态与动态权限。)

有关帐户权限的信息存储在mysql系统数据库的授权表中。有关这些表的结构和内容的说明,请参阅 第 6.2.3 节,“授权表”。MySQL 服务器在启动时将授权表的内容读入内存,并在 第 6.2.13 节“权限更改生效时”中指示的情况下重新加载它们。服务器根据授权表的内存副本做出访问控制决策。

重要的

一些 MySQL 版本引入了对授权表的更改以添加新的权限或功能。为确保您可以利用任何新功能,请在升级 MySQL 时将授权表更新为当前结构。请参阅 第 2.11 节,“升级 MySQL”

以下部分总结了可用的权限,提供了每个权限的更详细描述,并提供了使用指南。

可用权限摘要

下表显示了在 GRANTREVOKE语句中使用的静态权限名称,以及与授权表中每个权限关联的列名以及权限适用的上下文。

表 6.2 GRANT 和 REVOKE 允许的静态权限

特权 授予表列 语境
ALL [PRIVILEGES] 所有特权的同义词 服务器管理
ALTER Alter_priv
ALTER ROUTINE Alter_routine_priv 存储例程
CREATE Create_priv 数据库、表或索引
CREATE ROLE Create_role_priv 服务器管理
CREATE ROUTINE Create_routine_priv 存储例程
CREATE TABLESPACE Create_tablespace_priv 服务器管理
CREATE TEMPORARY TABLES Create_tmp_table_priv
CREATE USER Create_user_priv 服务器管理
CREATE VIEW Create_view_priv 观点
DELETE Delete_priv
DROP Drop_priv 数据库、表或视图
DROP ROLE Drop_role_priv 服务器管理
EVENT Event_priv 数据库
EXECUTE Execute_priv 存储例程
FILE File_priv 服务器主机上的文件访问
GRANT OPTION Grant_priv 数据库、表或存储例程
INDEX Index_priv
INSERT Insert_priv 表或列
LOCK TABLES Lock_tables_priv 数据库
PROCESS Process_priv 服务器管理
PROXY 见表proxies_priv_ 服务器管理
REFERENCES References_priv 数据库或表
RELOAD Reload_priv 服务器管理
REPLICATION CLIENT Repl_client_priv 服务器管理
REPLICATION SLAVE Repl_slave_priv 服务器管理
SELECT Select_priv 表或列
SHOW DATABASES Show_db_priv 服务器管理
SHOW VIEW Show_view_priv 观点
SHUTDOWN Shutdown_priv 服务器管理
SUPER Super_priv 服务器管理
TRIGGER Trigger_priv
UPDATE Update_priv 表或列
USAGE 无特权的同义词 服务器管理

下表显示了在 GRANTREVOKE语句中使用的动态权限名称,以及权限适用的上下文。

表 6.3 GRANT 和 REVOKE 允许的动态权限

特权 语境
APPLICATION_PASSWORD_ADMIN 双密码管理
AUDIT_ABORT_EXEMPT 允许被审核日志过滤器阻止的查询
AUDIT_ADMIN 审计日志管理
AUTHENTICATION_POLICY_ADMIN 认证管理
BACKUP_ADMIN 备份管理
BINLOG_ADMIN 备份和复制管理
BINLOG_ENCRYPTION_ADMIN 备份和复制管理
CLONE_ADMIN 克隆管理
CONNECTION_ADMIN 服务器管理
ENCRYPTION_KEY_ADMIN 服务器管理
FIREWALL_ADMIN 防火墙管理
FIREWALL_EXEMPT 防火墙管理
FIREWALL_USER 防火墙管理
FLUSH_OPTIMIZER_COSTS 服务器管理
FLUSH_STATUS 服务器管理
FLUSH_TABLES 服务器管理
FLUSH_USER_RESOURCES 服务器管理
GROUP_REPLICATION_ADMIN 复制管理
GROUP_REPLICATION_STREAM 复制管理
INNODB_REDO_LOG_ARCHIVE 重做日志归档管理
NDB_STORED_USER NDB集群
PASSWORDLESS_USER_ADMIN 认证管理
PERSIST_RO_VARIABLES_ADMIN 服务器管理
REPLICATION_APPLIER PRIVILEGE_CHECKS_USER对于复制通道
REPLICATION_SLAVE_ADMIN 复制管理
RESOURCE_GROUP_ADMIN 资源组管理
RESOURCE_GROUP_USER 资源组管理
ROLE_ADMIN 服务器管理
SENSITIVE_VARIABLES_OBSERVER 服务器管理
SESSION_VARIABLES_ADMIN 服务器管理
SET_USER_ID 服务器管理
SHOW_ROUTINE 服务器管理
SKIP_QUERY_REWRITE 服务器管理
SYSTEM_USER 服务器管理
SYSTEM_VARIABLES_ADMIN 服务器管理
TABLE_ENCRYPTION_ADMIN 服务器管理
TP_CONNECTION_ADMIN 线程池管理
VERSION_TOKEN_ADMIN 服务器管理
XA_RECOVER_ADMIN 服务器管理

静态权限说明

与在运行时定义的动态特权相反,静态特权内置于服务器中。以下列表描述了 MySQL 中可用的每个静态权限。

特定的 SQL 语句可能具有比此处指示的更具体的权限要求。如果是这样,相关陈述的描述会提供详细信息。

动态权限说明

动态权限是在运行时定义的,与服务器内置的静态权限不同。以下列表描述了 MySQL 中可用的每个动态权限。

大多数动态权限是在服务器启动时定义的。其他由特定组件或插件定义,如权限描述中所示。在这种情况下,除非启用定义它的组件或插件,否则该权限不可用。

特定的 SQL 语句可能具有比此处指示的更具体的权限要求。如果是这样,相关陈述的描述会提供详细信息。

特权授予准则

只授予帐户所需的权限是个好主意。FILE在授予和管理权限 时,您应该特别小心:

  • FILE可以滥用将 MySQL 服务器可以在服务器主机上读取的任何文件读入数据库表。这包括所有世界可读的文件和服务器数据目录中的文件。然后可以访问该表 SELECT以将其内容传输到客户端主机。

  • GRANT OPTION使用户能够将他们的特权授予其他用户。具有不同权限和具有GRANT OPTION权限的两个用户能够合并权限。

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

  • SHUTDOWN可以被滥用以通过终止服务器来完全拒绝为其他用户提供服务。

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

  • SUPER可用于终止其他会话或更改服务器的操作方式。

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

    • 密码是加密存储的,因此恶意用户无法简单地阅读它们来获知明文密码。mysql.user但是,对系统表 列具有写入权限的用户 authentication_string可以更改帐户的密码,然后使用该帐户连接到 MySQL 服务器。

    • INSERTUPDATE授予 mysql系统数据库使用户能够分别添加权限或修改现有权限。

    • DROP对于 mysql系统数据库,用户可以远程访问权限表,甚至是数据库本身。

静态与动态特权

MySQL 支持静态和动态权限:

  • 静态特权内置于服务器中。它们始终可以授予用户帐户,并且不能取消注册。

  • 可以在运行时注册和取消注册动态权限。这会影响它们的可用性:无法授予尚未注册的动态权限。

例如,SELECTINSERT权限是静态的并且始终可用,而动态权限只有在实现它的组件已启用时才可用。

本节的其余部分描述动态权限如何在 MySQL 中工作。讨论使用术语 组件,但同样适用于插件。

笔记

服务器管理员应该知道哪些服务器组件定义了动态权限。对于 MySQL 发行版,定义动态权限的组件文档描述了这些权限。

第三方组件也可以定义动态权限;管理员应该了解这些权限,而不是安装可能会冲突或危及服务器操作的组件。例如,如果一个组件与另一个组件都定义了具有相同名称的权限,则会发生冲突。组件开发人员可以通过选择具有基于组件名称的前缀的权限名称来降低这种情况发生的可能性。

服务器在内存中维护一组已注册的动态权限。注销发生在服务器关闭时。

通常,定义动态权限的组件会在安装时在其初始化序列中注册它们。卸载时,组件不会注销其已注册的动态权限。(这是当前的做法,不是必需的。也就是说,组件可以但不能随时注销它们注册的特权。)

尝试注册已注册的动态权限不会出现警告或错误。考虑以下语句序列:

INSTALL COMPONENT 'my_component';
UNINSTALL COMPONENT 'my_component';
INSTALL COMPONENT 'my_component';

第一条INSTALL COMPONENT 语句注册了 component 定义的任何权限 my_component,但 UNINSTALL COMPONENT没有注销它们。对于第二INSTALL COMPONENT条语句,发现其注册的组件权限已经被注册,但是没有出现警告或错误。

动态权限仅适用于全局级别。mysql.global_grants服务器在系统表 中存储有关当前为用户帐户分配的动态权限的信息 :

  • 服务器在服务器启动期间自动注册命名的权限 global_grants(除非 --skip-grant-tables给出该选项)。

  • GRANTand 语句修改 的REVOKE内容global_grants

  • 中列出的动态权限分配 global_grants是持久的。它们不会在服务器关闭时被删除。

示例:以下语句授予用户 u1控制副本上的复制(包括组复制)和修改系统变量所需的权限:

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

授予的动态权限出现在 SHOW GRANTS语句和 INFORMATION_SCHEMA USER_PRIVILEGES表的输出中。

对于全局级别GRANTREVOKE任何未被识别为静态的命名权限都会根据当前注册的动态权限集进行检查,如果找到则授予。否则,会发生错误以指示未知的特权标识符。

forGRANT和 at the global levelREVOKE的含义 ALL [PRIVILEGES]包括所有静态全局权限,以及所有当前注册的动态权限:

  • GRANT ALL在全局级别授予所有静态全局权限和所有当前注册的动态权限。在执行GRANT 语句后注册的动态权限不会追溯授予任何帐户。

  • REVOKE ALL在全局级别撤销所有授予的静态全局权限和所有授予的动态权限。

FLUSH PRIVILEGES语句读取global_grants动态权限分配表并注册在那里找到的任何未注册的权限。

有关 MySQL 服务器和 MySQL 发行版中包含的组件提供的动态权限的描述,请参阅 第 6.2.2 节,“MySQL 提供的权限”

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

在 MySQL 8.0 中,许多以前需要SUPER特权的操作也与范围更有限的动态特权相关联。(有关这些权限的描述,请参阅 第 6.2.2 节,“MySQL 提供的权限”。)通过授予关联的动态权限而不是 ,可以允许帐户执行每个此类操作SUPERSUPER此更改使 DBA 能够避免授予和定制用户权限,使其更接近允许的操作 ,从而提高了安全性 。SUPER现在已弃用;希望在未来的 MySQL 版本中将其删除。

当删除SUPER发生时,以前需要的操作 SUPER失败,除非授予的帐户SUPER被迁移到适当的动态权限。使用以下说明来实现该目标,以便在 SUPER删除之前准备好帐户:

  1. 执行此查询以识别授予的帐户 SUPER

    SELECT GRANTEE FROM INFORMATION_SCHEMA.USER_PRIVILEGES
    WHERE PRIVILEGE_TYPE = 'SUPER';
  2. 对于前面查询标识的每个帐户,确定它需要的操作 SUPER。然后授予与这些操作对应的动态权限,并撤销 SUPER

    例如,如果'u1'@'localhost'需要 SUPER清除二进制日志和修改系统变量,这些语句对帐户进行所需的更改:

    GRANT BINLOG_ADMIN, SYSTEM_VARIABLES_ADMIN ON *.* TO 'u1'@'localhost';
    REVOKE SUPER ON *.* FROM 'u1'@'localhost';

    修改所有适用帐户后, INFORMATION_SCHEMA第一步中的查询应生成一个空结果集。