权限控制
MySQL支持创建帐户,该帐户允许客户端用户连接到服务器并访问服务器管理的数据。MySQL权限系统的主要功能是验证谁从给定主机连接用户,并与特权用户数据库如联想SELECT
,INSERT
,UPDATE
,和DELETE
。其他功能包括授予管理操作特权的功能。
为了控制哪些用户可以连接,可以为每个帐户分配身份验证凭据,例如密码。用户界面MySQL账户由SQL语句如CREATE USER
,GRANT
和REVOKE
。请参见“账户权限控制”。
MySQL特权系统确保所有用户只能执行他们所允许的操作。作为用户,当您连接到MySQL服务器时,您的身份由连接的主机和指定的用户名确定。当您在连接后发出请求时,系统会根据您的身份和您想做的事情授予特权。
MySQL会在识别您的身份时同时考虑您的主机名和用户名,因为没有理由假定给定的用户名在所有主机上都属于同一个人。例如,用户joe
谁从连接office.example.com
不一定是同一个人用户joe
谁从连接home.example.com
。MySQL的,使您能够区分上碰巧有相同的名称不同的主机用户来处理它:你可以通过授予一组的连接权限joe
从office.example.com
,并通过连接一组不同的权限joe
从home.example.com
。要参见给定帐户具有哪些特权,请使用以下SHOW GRANTS
语句。例如:
SHOW GRANTS FOR 'joe'@'office.example.com';SHOW GRANTS FOR 'joe'@'home.example.com';
在内部,服务器将特权信息存储在mysql
系统数据库的授权表中。MySQL服务器在启动时将这些表的内容读入内存,并根据授予表的内存副本进行访问控制决策。
当您运行连接到服务器的客户端程序时,MySQL访问控制涉及两个阶段:
阶段1:服务器根据您的身份以及是否可以通过提供正确的密码来验证您的身份来接受或拒绝连接。
第2阶段:假设您可以连接,服务器将检查您发出的每条语句,以确定您是否具有执行该语句的足够特权。例如,如果尝试从数据库中的表中选择行或从数据库中删除表,则服务器会验证您是否具有SELECT
该表的DROP
特权或该数据库的特权。
有关每个阶段发生的情况的详细说明,请和“访问控制,阶段2:请求验证”。有关诊断权限相关问题的帮助,请参见“对连接到MySQL的问题进行故障排除”。
如果在连接时更改了特权(由您本人或其他人更改),则这些更改不一定会在您发出的下一条语句中立即生效。有关服务器重新加载授权表的条件的详细信息,请参见“特权更改何时生效”。
MySQL特权系统不能做某些事情:
- 您不能明确指定应拒绝给定用户的访问。也就是说,您不能显式匹配用户然后拒绝连接。
- 您不能指定用户有权创建或删除数据库中的表,但不能创建或删除数据库本身。
- 密码全局应用于帐户。您不能将密码与特定对象(例如数据库,表或例程)相关联。
帐户用户名和密码
MySQL将帐户存储在系统数据库的user
表中mysql
。根据用户名和客户端主机(用户可以从中连接到服务器的主机)来定义帐户。有关user
表中帐户代表的信息,请参见“授权表”。
帐户也可能具有身份验证凭据,例如密码。凭据由帐户身份验证插件处理。MySQL支持多个身份验证插件。其中一些使用内置身份验证方法,而其他一些则使用外部身份验证方法启用身份验证。
MySQL和您的操作系统使用用户名和密码的方式之间有几个区别:
- MySQL用于身份验证目的的用户名与Windows或Unix使用的用户名(登录名)无关。在Unix上,大多数MySQL客户端默认情况下会尝试使用当前Unix用户名作为MySQL用户名登录,但这只是为了方便。由于客户端程序允许使用
-u
或--user
选项指定任何用户名,因此可以轻松地覆盖默认值。这意味着任何人都可以尝试使用任何用户名连接到服务器,因此,除非所有MySQL帐户都具有密码,否则您不能以任何方式确保数据库的安全。为没有密码的帐户指定用户名的任何人都可以成功连接到服务器。 MySQL用户名最长为32个字符。操作系统用户名的最大长度可能不同。
警告
MySQL用户名长度限制在MySQL服务器和客户端中是硬编码的,因此尝试通过修改
mysql
数据库中表的定义来绕过它是行不通的。mysql
除非通过“升级MySQL”中描述的过程,否则您绝不能以任何方式改变数据库中表的结构。尝试以任何其他方式重新定义MySQL的系统表会导致未定义和不受支持的行为。服务器可以随意忽略由于此类修改而导致格式错误的行。为了对使用内置身份验证方法的帐户的客户端连接进行身份验证,服务器使用
user
表中存储的密码。这些密码不同于用于登录操作系统的密码。用于登录Windows或Unix计算机的“外部”密码与用于访问该计算机上的MySQL服务器的密码之间没有必要的连接。如果服务器使用其他插件对客户端进行身份验证,则该插件实现的身份验证方法可以使用也可以不使用
user
表中存储的密码。在这种情况下,有可能还使用外部密码对MySQL服务器进行身份验证。user
表中存储的密码使用特定于插件的算法加密。如果用户名和密码仅包含ASCII字符,则无论字符集设置如何,都可以连接到服务器。要在用户名或密码包含非ASCII字符时启用连接,客户端应用程序应
mysql_options()
使用MYSQL_SET_CHARSET_NAME
选项和适当的字符集名称作为参数来调用 C API函数。这将导致使用指定的字符集进行身份验证。否则,除非服务器默认字符集与验证默认值中的编码相同,否则验证将失败。标准的MySQL客户端程序支持一个
--default-character-set
导致mysql_options()
被调用的选项,如上所述。此外,如“连接字符集和排序规则”中所述,支持字符集自动检测。对于使用不基于C API的连接器的程序,该连接器可以提供与之等效的名称,mysql_options()
而可以替代使用。参见连接器文档。前面的注释不适用于
ucs2
,utf16
和和utf32
,它们不允许用作客户端字符集。
MySQL安装过程将使用初始root
帐户填充授权表,如“保护初始MySQL帐户”所述,该文件还讨论了如何为其分配密码。此后,你通常建立,修改和删除MySQL账户使用语句,例如CREATE USER
,DROP USER
,GRANT
,和REVOKE
。请参见“添加帐户,分配特权和删除帐户”和“帐户管理声明”。
要使用命令行客户端连接到MySQL服务器,请根据需要为要使用的帐户指定用户名和密码选项:
shell>mysql --user=finley --password db_name
如果您喜欢短选项,则命令如下所示:
shell>mysql -u finley -p db_name
如果您在命令行中的--password
或-p
选项之后省略了密码值(如刚刚所示),则客户端会提示输入一个。或者,可以在命令行上指定密码:
shell>mysql --user=finley --password=password db_name shell>mysql -u finley -ppassword db_name
如果使用该-p
选项,则以下密码值之间不得有空格-p
。
在命令行上指定密码应该被认为是不安全的。请参见“最终用户密码安全准则”。为避免在命令行上输入密码,请使用选项文件或登录路径文件。请参见“使用选项文件”和“mysql_config_editor-MySQL配置实用程序”。
有关指定用户名,密码和其他连接参数的更多信息,请参见“使用命令选项连接到MySQL服务器”。
MySQL提供的特权
授予MySQL帐户的特权确定该帐户可以执行的操作。MySQL特权在它们适用的上下文和不同的操作级别中有所不同:
- 管理特权使用户可以管理MySQL服务器的操作。这些特权是全局的,因为它们不是特定于特定数据库的。
- 数据库特权适用于数据库及其中的所有对象。可以为特定数据库或全局授予这些特权,以便将它们应用于所有数据库。
- 可以为数据库中的特定对象,数据库中给定类型的所有对象(例如,数据库中的所有表)或所有对象的全局对象授予表,表,索引,视图和存储例程等数据库对象的特权。所有数据库中给定类型的对象。
特权是静态的(内置于服务器中)还是动态的(在运行时定义)方面也有所不同。特权是静态的还是动态的,都会影响将其授予用户帐户和角色的可用性。有关静态特权和动态特权之间的区别的信息,请参阅静态特权与动态特权。)
有关帐户特权的信息存储在mysql
系统数据库的授权表中。有关这些表的结构和内容的说明,请参见“授权表”。MySQL服务器启动时,将授权表的内容读取到内存中,并在“特权更改何时生效”中指出的情况下重新加载它们。服务器基于授予表的内存副本进行访问控制决策。
重要一些MySQL版本对授予表进行了更改,以添加新的特权或功能。为了确保您可以利用所有新功能,每当升级MySQL时,将授权表更新为当前结构。请参见“升级MySQL”。
以下各节总结了可用的特权,提供了每种特权的更详细说明,并提供了使用准则。
- 可用权限摘要
- 静态权限说明
- 动态权限说明
- 特权授予准则
- 静态与动态特权
- 将帐户从SUPER迁移到动态特权
可用权限摘要
下表显示了GRANT
和REVOKE
语句中使用的静态特权名称,以及与授予表中每个特权相关联的列名称以及该特权所应用的上下文。
表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 | “没有特权”的同义词 | 服务器管理 |
下表显示了GRANT
和REVOKE
语句中使用的动态特权名称,以及特权所应用的上下文。
表6.3 GRANT和REVOKE的允许动态特权
特权 | 语境 |
---|---|
APPLICATION_PASSWORD_ADMIN | 双密码管理 |
AUDIT_ADMIN | 审核日志管理 |
BACKUP_ADMIN | 备份管理 |
BINLOG_ADMIN | 备份和复制管理 |
BINLOG_ENCRYPTION_ADMIN | 备份和复制管理 |
CLONE_ADMIN | 克隆管理 |
CONNECTION_ADMIN | 服务器管理 |
ENCRYPTION_KEY_ADMIN | 服务器管理 |
FIREWALL_ADMIN | 防火墙管理 |
FIREWALL_USER | 防火墙管理 |
GROUP_REPLICATION_ADMIN | 复制管理 |
INNODB_REDO_LOG_ARCHIVE | 重做日志归档管理 |
NDB_STORED_USER | NDB集群 |
PERSIST_RO_VARIABLES_ADMIN | 服务器管理 |
REPLICATION_APPLIER | PRIVILEGE_CHECKS_USER 复制通道 |
REPLICATION_SLAVE_ADMIN | 复制管理 |
RESOURCE_GROUP_ADMIN | 资源组管理 |
RESOURCE_GROUP_USER | 资源组管理 |
ROLE_ADMIN | 服务器管理 |
SESSION_VARIABLES_ADMIN | 服务器管理 |
SET_USER_ID | 服务器管理 |
SHOW_ROUTINE | 服务器管理 |
SYSTEM_USER | 服务器管理 |
SYSTEM_VARIABLES_ADMIN | 服务器管理 |
TABLE_ENCRYPTION_ADMIN | 服务器管理 |
VERSION_TOKEN_ADMIN | 服务器管理 |
XA_RECOVER_ADMIN | 服务器管理 |
静态权限说明
与在运行时定义的动态特权相反,服务器内置了静态特权。下表描述了MySQL中可用的每个静态特权。
特定的SQL语句可能具有比此处指示的更具体的特权要求。如果是这样,所讨论语句的说明将提供详细信息。
ALL
,ALL PRIVILEGES
这些特权说明符是“给定特权级别上所有可用特权”的简称(除外
GRANT OPTION
)。例如,ALL
在全局或表级别进行授予分别授予所有全局特权或所有表级别特权。ALTER
允许使用该
ALTER TABLE
语句更改表的结构。ALTER TABLE
还需要CREATE
和INSERT
特权。重命名表需要ALTER
和DROP
对旧表,CREATE
以及INSERT
对新表。ALTER ROUTINE
支持使用更改或删除存储例程(存储过程和函数)的语句。
CREATE
允许使用创建新数据库和表的语句。
CREATE ROLE
启用
CREATE ROLE
语句的使用。(该CREATE USER
特权还允许使用该CREATE ROLE
语句。)请参见“授权控制”。在
CREATE ROLE
和DROP ROLE
特权是不是强大CREATE USER
,因为它们只能用于创建和删除帐户。它们不能用作CREATE USER
修改帐户属性或重命名帐户。请参阅用户和角色互换性。CREATE ROUTINE
允许使用创建存储例程(存储过程和函数)的语句。
CREATE TABLESPACE
允许使用创建,更改或删除表空间和日志文件组的语句。
CREATE TEMPORARY TABLES
启用使用该
CREATE TEMPORARY TABLE
语句创建临时表。会话创建临时表后,服务器将不再对该表执行任何特权检查。所述创建会话可以在桌子上进行任何操作,例如
DROP TABLE
,INSERT
,UPDATE
,或SELECT
。有关更多信息,请参见“ CREATE TEMPORARY TABLE语句”。CREATE USER
允许使用的
ALTER USER
,CREATE ROLE
,CREATE USER
,DROP ROLE
,DROP USER
,RENAME USER
,和REVOKE ALL PRIVILEGES
语句。CREATE VIEW
启用
CREATE VIEW
语句的使用。DELETE
使行可以从数据库的表中删除。
DROP
支持使用删除(删除)现有数据库,表和视图的语句。该
DROP
权限才能使用该ALTER TABLE ... DROP PARTITION
语句的分区表。该DROP
也需要特权TRUNCATE TABLE
。DROP ROLE
启用
DROP ROLE
语句的使用。(该CREATE USER
特权还允许使用该DROP ROLE
语句。)请参见“授权控制”。在
CREATE ROLE
和DROP ROLE
特权是不是强大CREATE USER
,因为它们只能用于创建和删除帐户。它们不能用作CREATE USER
修改帐户属性或重命名帐户。请参阅用户和角色互换性。EVENT
支持使用为事件计划程序创建,更改,删除或显示事件的语句。
EXECUTE
允许使用执行存储例程(存储过程和函数)的语句。
FILE
影响以下操作和服务器行为:
- 使用
LOAD DATA
ndSELECT ... INTO OUTFILE
语句和LOAD_FILE()
函数启用在服务器主机上的读写文件。拥有FILE
特权的用户可以读取服务器主机上世界可读或MySQL服务器可读的任何文件。(这意味着用户可以读取任何数据库目录中的任何文件,因为服务器可以访问任何这些文件。) - 允许在MySQL服务器具有写访问权的任何目录中创建新文件。这包括服务器的数据目录,该目录包含实现特权表的文件。
- 允许对语句使用
DATA DIRECTORY
orINDEX DIRECTORY
表选项CREATE TABLE
。
作为安全措施,服务器不会覆盖现有文件。
要限制可读写文件的位置,请将
secure_file_priv
系统变量设置为特定目录。请参见“服务器系统变量”。- 使用
GRANT OPTION
使您可以授予自己拥有的特权或从其他用户撤消这些特权。
INDEX
允许使用创建或删除(删除)索引的语句。
INDEX
适用于现有表。如果您有CREATE
表的特权,则可以在CREATE TABLE
语句中包括索引定义。INSERT
使行可以插入数据库的表中。
INSERT
还需要对ANALYZE TABLE
,OPTIMIZE TABLE
和REPAIR TABLE
表维护语句。LOCK TABLES
允许使用显式
LOCK TABLES
语句来锁定您具有SELECT
特权的表。这包括写锁定的使用,这可以防止其他会话读取锁定的表。PROCESS
启用显示有关服务器内执行的线程的信息(即有关会话正在执行的语句的信息)。该特权允许使用
SHOW PROCESSLIST
或mysqladmin进程列表参见属于其他帐户的线程;您总是可以看到自己的线程。该PROCESS
特权还允许使用SHOW ENGINE
。PROXY
使一个用户可以模拟或成为另一用户。请参见“代理用户”。
REFERENCES
创建外键约束需要
REFERENCES
父表具有特权。RELOAD
启用
FLUSH
语句的使用。这也使中mysqladmin等效于命令FLUSH
操作:flush-hosts
,flush-logs
,flush-privileges
,flush-status
,flush-tables
,flush-threads
,refresh
,和reload
。该
reload
命令告诉服务器将授权表重新加载到内存中。flush-privileges
是的同义词reload
。该refresh
命令关闭并重新打开日志文件,并刷新所有表。其他命令执行与相似的功能,但更具体,在某些情况下可能更可取。例如,如果您只想刷新日志文件,那是比更好的选择。flush-xxx
refresh
flush-logs
refresh
该
RELOAD
特权还允许使用RESET MASTER
ndRESET SLAVE
语句。REPLICATION CLIENT
允许使用的
SHOW MASTER STATUS
,SHOW SLAVE STATUS
和SHOW BINARY LOGS
语句。将此特权授予从属服务器用于将其作为主服务器连接到当前服务器的帐户。REPLICATION SLAVE
启用该帐户已作出对数据库的主服务器上,使用请求更新
SHOW SLAVE http://127.0.0.1/lanmper/publicS
,SHOW RELAYLOG EVENTS
和SHOW BINLOG EVENTS
语句。要使用mysqlbinlog选项--read-from-remote-server
(-R
)和,也需要此特权--read-from-remote-master
。将此特权授予从属服务器用于将其作为主服务器连接到当前服务器的帐户。SELECT
允许从数据库的表中选择行。
SELECT
语句SELECT
仅在实际访问表时才需要特权。有些SELECT
语句不访问表,并且可以在未经任何数据库许可的情况下执行。例如,您可以SELECT
用作简单的计算器来评估不引用表的表达式:SELECT 1 +1;SELECT PI()*2;该
SELECT
还需要读取列值等语句的权限。例如,对于在语句SELECT
中col_name
=expr
赋值右侧引用的UPDATE
列或在or 语句的WHERE
子句中命名的列,则需要。DELETE
UPDATE
SELECT
是需要与用于表或视图特权EXPLAIN
,包括在视图定义任何潜在的表。SHOW DATABASES
通过发出
SHOW DATABASE
语句使帐户能够参见数据库名称。没有此特权的帐户只能看到具有某些特权的数据库,并且如果使用该--skip-show-database
选项启动服务器,则根本无法使用该语句。警告
因为任何静态全局特权都被认为是所有数据库的特权,所以任何静态全局特权都使用户可以使用
SHOW DATABASES
或通过检查的SCHEMATA
表来参见所有数据库名称INFORMATION_SCHEMA
,但在数据库级别受部分吊销限制的数据库除外。SHOW VIEW
启用
SHOW CREATE VIEW
语句的使用。与结合使用的视图也需要此特权EXPLAIN
。SHUTDOWN
允许使用
SHUTDOWN
andRESTART
语句,mysqladmin shutdown命令和mysql_shutdown()
C API函数。SUPER
SUPER
是一项强大而深远的特权,不应轻视。如果帐户只需要执行一部分SUPER
操作,则可以通过授予一个或多个动态特权来实现所需的特权集,每个特权都赋予更多有限的功能。请参阅动态特权描述。注意
SUPER
已被弃用,并将在MySQL的未来版本中删除。请参阅将帐户从SUPER迁移到动态特权。SUPER
影响以下操作和服务器行为:在运行时启用系统变量更改:
启用服务器的配置变化与全球系统变量
SET GLOBAL
和SET PERSIST
。相应的动态特权为
SYSTEM_VARIABLES_ADMIN
。启用设置需要特殊特权的受限会话系统变量。
相应的动态特权为
SESSION_VARIABLES_ADMIN
。
另请参见“系统变量特权”。
启用对全局事务特征的更改(请参见“ SET TRANSACTION语句”)。
相应的动态特权为
SYSTEM_VARIABLES_ADMIN
。使帐户能够启动和停止复制,包括组复制。
相应的动态特权
REPLICATION_SLAVE_ADMIN
用于常规复制GROUP_REPLICATION_ADMIN
和组复制。启用
CHANGE MASTER TO
和CHANGE REPLICATION FILTER
语句。相应的动态特权为
REPLICATION_SLAVE_ADMIN
。通过
PURGE BINARY LOGS
ndBINLOG
语句启用二进制日志控制。相应的动态特权为
BINLOG_ADMIN
。在执行视图或存储的程序时启用设置有效授权ID的功能。具有此特权的用户可以在
DEFINER
视图或存储程序的属性中指定任何帐户。相应的动态特权为
SET_USER_ID
。- 允许使用的
CREATE SERVER
,ALTER SERVER
和DROP SERVER
语句。 - 启用mysqladmin debug命令的使用。
启用
InnoDB
加密密钥轮换。相应的动态特权为
ENCRYPTION_KEY_ADMIN
。启用执行版本令牌用户定义的功能。
相应的动态特权为
VERSION_TOKEN_ADMIN
。启用授予和吊销角色,使用语句的
WITH ADMIN OPTION
子句GRANT
以及函数<graphml>
结果中的非空元素内容ROLES_GRAPHML()
。相应的动态特权为
ROLE_ADMIN
。启用对非
SUPER
帐户不允许的客户端连接的控制:- 允许使用
KILL
语句或mysqladmin kill命令杀死属于其他帐户的线程。(帐户始终可以杀死自己的线程。) - 客户端连接
init_connect
时,服务器不执行系统变量内容SUPER
。 SUPER
即使max_connections
达到由系统变量配置的连接限制,服务器也会接受来自客户端的一个连接。- 处于脱机模式(
offline_mode
启用)的服务器不会SUPER
在下一个客户端请求时终止客户端连接,而是接受来自SUPER
客户端的新连接。 - 即使
read_only
启用了系统变量,也可以执行更新。这适用于显式表更新,也适用于帐户管理语句,例如GRANT
和REVOKE
隐式更新表。
前面的连接控制操作的相应动态特权为
CONNECTION_ADMIN
。- 允许使用
SUPER
如果启用了二进制日志记录,则可能还需要特权来创建或更改存储的功能,如“存储的程序二进制日志记录”中所述。TRIGGER
启用触发器操作。您必须具有此特权才能使表创建,删除,执行或显示该表的触发器。
当触发器被激活(由谁拥有特权执行用户
INSERT
,UPDATE
或DELETE
与触发器关联的表的语句),触发器执行要求谁定义触发器的用户仍然有TRIGGER
对表的特权。UPDATE
使行可以在数据库的表中更新。
USAGE
此特权说明符代表“无特权。”在全局级别使用,
GRANT
用于指定子句,例如WITH GRANT OPTION
不在特权列表中命名特定的帐户特权。SHOW GRANTS
显示USAGE
以指示帐户在特权级别没有特权。
动态权限说明
与在服务器中内置的静态特权相反,动态特权是在运行时定义的。下表描述了MySQL中可用的每个动态特权。
大多数动态特权是在服务器启动时定义的。其他特权由特定的服务器组件或插件定义,如特权描述中所述。在这种情况下,除非启用了定义特权的组件或插件,否则特权不可用。
特定的SQL语句可能具有比此处指示的更具体的特权要求。如果是这样,所讨论语句的说明将提供详细信息。
APPLICATION_PASSWORD_ADMIN
(在MySQL 8.0.14中添加)对于双密码功能,此特权允许使用适用于您自己帐户的
RETAIN CURRENT PASSWORD
ndDISCARD OLD PASSWORD
子句ALTER USER
和andSET PASSWORD
语句。由于大多数用户只需要一个密码,因此需要此特权才能操作自己的辅助密码。如果要允许一个帐户操作所有帐户的辅助密码,则应授予该
CREATE USER
特权而不是APPLICATION_PASSWORD_ADMIN
。有关使用双重密码的更多信息,请参见“帐户密码管理”。
AUDIT_ADMIN
启用审核日志配置。该权限由
udit_log
插件定义;请参见“ MySQL企业审核”。BACKUP_ADMIN
启用
LOCK INSTANCE FOR BACKUP
语句的执行并访问“性能模式”log_status
表。注意
此外
BACKUP_ADMIN
,还需要表SELECT
上的特权log_status
才能对其进行访问。当执行从早期版本到MySQL 8.0的就地升级时,该
BACKUP_ADMIN
特权将自动授予具有该RELOAD
特权的用户。BINLOG_ADMIN
通过
PURGE BINARY LOGS
ndBINLOG
语句启用二进制日志控制。BINLOG_ENCRYPTION_ADMIN
启用设置系统变量
binlog_encryption
,以激活或禁用二进制日志文件和中继日志文件的加密。这种能力不是由提供BINLOG_ADMIN
,SYSTEM_VARIABLES_ADMIN
或SESSION_VARIABLES_ADMIN
特权。相关的系统变量binlog_rotate_encryption_master_key_at_startup
(在重新启动服务器时自动旋转二进制日志主密钥)不需要此特权。CLONE_ADMIN
启用
CLONE
语句的执行。包含BACKUP_ADMIN
和SHUTDOWN
特权。CONNECTION_ADMIN
允许使用
KILL
语句或mysqladmin kill命令杀死属于其他帐户的线程。(帐户始终可以杀死自己的线程。)启用设置与客户端连接有关的系统变量,或规避与客户端连接有关的限制。
CONNECTION_ADMIN
适用于以下系统变量的影响:init_connect
:客户端连接init_connect
时,服务器不执行系统变量内容CONNECTION_ADMIN
。max_connections
:CONNECTION_ADMIN
即使max_connections
达到了由系统变量配置的连接限制,服务器也会接受来自客户端的一个连接。offline_mode
:处于脱机模式(offline_mode
启用)的服务器不会CONNECTION_ADMIN
在下一个客户端请求时终止客户端连接,而是接受来自CONNECTION_ADMIN
客户端的新连接。read_only
:即使read_only
启用了系统变量,也可以执行更新。这适用于显式表更新,也适用于帐户管理语句,例如GRANT
和REVOKE
隐式更新表。
ENCRYPTION_KEY_ADMIN
启用
InnoDB
加密密钥轮换。FIREWALL_ADMIN
使用户能够管理任何用户的防火墙规则。该权限由
MYSQL_FIREWALL
插件定义;请参见“ MySQL企业防火墙”。FIREWALL_USER
使用户能够更新自己的防火墙规则。该权限由
MYSQL_FIREWALL
插件定义;请参见“ MySQL企业防火墙”。GROUP_REPLICATION_ADMIN
使帐户能够使用
START GROUP REPLICATION
和STOP GROUP REPLICATION
语句启动和停止组复制,更改group_replication_consistency
系统变量的全局设置以及使用group_replication_set_write_concurrency()
和group_replication_set_communication_protocol()
UDF。向用于管理作为复制组成员的服务器的帐户授予此特权。INNODB_REDO_LOG_ARCHIVE
使帐户能够激活和停用重做日志归档。
NDB_STORED_USER
NDB
一旦所有启用的MySQL服务器加入给定的NDB群集,就可以在所有启用的MySQL服务器之间共享和同步用户或角色及其特权。仅当NDB
启用了存储引擎时,此特权才可用。Any changes to or revocations of privileges made for the given user or role are synchronized immediately with all connected MySQL servers(SQL nodes). You should be aware that there is no guarantee that multiple statements affecting privileges originating from different SQL nodes are executed on all SQL nodes in the same order. For this reason, it is highly recommended that all user administration be done from a single designated SQL node.
NDB_STORED_USER
是全局特权,必须使用授予或撤消ON *.*
。尝试为此特权设置任何其他范围会导致错误。此特权可以授予大多数应用程序和管理用户,但不能授予系统保留的帐户,例如mysql.session@localhost
或mysql.infoschema@localhost
。与拥有该特权的角色一样,已被授予
NDB_STORED_USER
特权的用户也存储在其中NDB
(并因此由所有SQL节点共享)。这仅仅是想当然地认为有一个角色的用户NDB_STORED_USER
是不存储在NDB
;NDB
必须为每个存储的用户显式授予特权。有关如何工作的更多详细信息
NDB
,请参见“使用NDB_STORED_USER的分布式MySQL特权”。该
NDB_STORED_USER
特权从NDB 8.0.18开始可用。PERSIST_RO_VARIABLES_ADMIN
对于还具有的用户
SYSTEM_VARIABLES_ADMIN
,PERSIST_RO_VARIABLES_ADMIN
可以使用来SET PERSIST_ONLY
将全局系统变量保留到mysqld-auto.cnf
数据目录中的选项文件中。该语句类似于SET PERSIST
但不修改运行时全局系统变量值。这SET PERSIST_ONLY
适用于配置只能在服务器启动时设置的只读系统变量。另请参见“系统变量特权”。
REPLICATION_APPLIER
允许该帐户充当
PRIVILEGE_CHECKS_USER
复制通道的帐户,并执行mysqlbinlog输出中的BINLOG
语句。将此特权授予分配给用于为复制通道提供安全上下文并处理这些通道上的复制错误的帐户。除了特权之外,还必须赋予该帐户所需的特权,以执行复制通道接收或包含在mysqlbinlog输出中的事务,例如,更新受影响的表。有关更多信息,请参见CHANGE MASTER TO
REPLICATION_APPLIER
“复制特权检查”。REPLICATION_SLAVE_ADMIN
使帐户能够连接到主服务器,使用
START SLAVE
和STOP SLAVE
语句启动和停止复制,以及使用CHANGE MASTER TO
和CHANGE REPLICATION FILTER
语句。将此特权授予从属服务器用于将其作为主服务器连接到当前服务器的帐户。此特权不适用于组复制;使用GROUP_REPLICATION_ADMIN
了点。RESOURCE_GROUP_ADMIN
启用资源组管理,包括创建,更改和删除资源组,以及将线程和语句分配给资源组。具有此特权的用户可以执行与资源组有关的任何操作。
RESOURCE_GROUP_USER
允许将线程和语句分配给资源组。具有此特权的用户可以使用该
SET RESOURCE GROUP
语句和RESOURCE_GROUP
优化器提示。ROLE_ADMIN
启用授予和吊销角色,使用语句的
WITH ADMIN OPTION
子句GRANT
以及函数<graphml>
结果中的非空元素内容ROLES_GRAPHML()
。设置mandatory_roles
系统变量的值所必需。SERVICE_CONNECTION_ADMIN
启用到仅允许管理连接的网络接口的连接(请参见“ MySQL如何处理客户端连接”)。
SESSION_VARIABLES_ADMIN
(在MySQL 8.0.14中添加)对于大多数系统变量,设置会话值不需要特殊的特权,任何用户都可以完成以影响当前会话。对于某些系统变量,设置会话值可能会在当前会话之外产生影响,因此是受限制的操作。对于这些,
SESSION_VARIABLES_ADMIN
特权使用户可以设置会话值。如果系统变量是受限制的,并且需要特殊特权来设置会话值,则变量描述将指示该限制。实例包括
binlog_format
,sql_log_bin
,和sql_log_off
。在MySQL 8.0.14之前的版本中
SESSION_VARIABLES_ADMIN
,受限会话系统变量只能由具有SYSTEM_VARIABLES_ADMIN
或SUPER
特权的用户设置。该
SESSION_VARIABLES_ADMIN
特权的一个子集SYSTEM_VARIABLES_ADMIN
和SUPER
特权。具有这两种特权之一的用户也被允许设置受限制的会话变量,并且SESSION_VARIABLES_ADMIN
通过暗示有效地具有该特权,并且无需SESSION_VARIABLES_ADMIN
明确地被授予。另请参见“系统变量特权”。
SET_USER_ID
在执行视图或存储的程序时启用设置有效授权ID的功能。具有此特权的用户可以在
DEFINER
视图或存储程序的属性中指定任何帐户。SHOW_ROUTINE
(在MySQL 8.0.20中添加)使用户能够访问所有存储例程(存储过程和函数)的定义和属性,即使用户不是其定义者。此访问权限包括:
INFORMATION_SCHEMA.ROUTINES
表的内容。- 该
SHOW CREATE FUNCTION
和SHOW CREATE PROCEDURE
语句。 - 该
SHOW FUNCTION CODE
和SHOW PROCEDURE CODE
语句。 - 该
SHOW FUNCTION STATUS
和SHOW PROCEDURE STATUS
语句。
在MySQL 8.0.20之前,对于用户来说,如果用户要访问未定义的例程的定义,则该用户必须具有
SELECT
非常广泛的全局特权。从8.0.20开始,SHOW_ROUTINE
可以将其授予特权,但其作用域受到更严格的限制,以允许访问例程定义。(也就是说,管理员可以SELECT
从其他不需要此权限的用户处撤回全局权限,SHOW_ROUTINE
而改为授予权限。)SYSTEM_USER
(在MySQL 8.0.16中添加)该
SYSTEM_USER
特权将系统用户与常规用户区分开:- 具有
SYSTEM_USER
特权的用户是系统用户。 - 没有
SYSTEM_USER
特权的用户是普通用户。
在
SYSTEM_USER
特权上,给定用户可以应用其其他特权,以及用户是否从其他帐户保护的帐户的效果:- 系统用户可以修改系统帐户和普通帐户。即,具有拥有对普通帐户执行给定操作的权限的用户通过拥有
SYSTEM_USER
还对系统帐户执行操作而被启用。系统帐户只能由具有适当特权的系统用户修改,而不能由普通用户修改。 - 具有适当特权的普通用户可以修改普通帐户,但不能修改系统帐户。普通帐户可以由具有适当特权的系统用户和普通用户修改。
有关更多信息,请参见“帐户类别”。
SYSTEM_USER
特权提供给系统帐户的防止常规帐户修改的保护不适用于对mysql
系统架构具有特权的常规帐户,因此可以直接修改该架构中的授权表。为了获得全面保护,请勿将mysql
架构特权授予普通帐户。请参阅防止系统帐户受到常规帐户的操纵。- 具有
SYSTEM_VARIABLES_ADMIN
影响以下操作和服务器行为:
在运行时启用系统变量更改:
- 启用服务器的配置变化与全球系统变量
SET GLOBAL
和SET PERSIST
。 SET PERSIST_ONLY
如果用户也具有,则可以使用启用服务器配置更改全局系统变量PERSIST_RO_VARIABLES_ADMIN
。- 启用设置需要特殊特权的受限会话系统变量。实际上,
SYSTEM_VARIABLES_ADMIN
意味着SESSION_VARIABLES_ADMIN
没有显式授予SESSION_VARIABLES_ADMIN
。
另请参见“系统变量特权”。
- 启用服务器的配置变化与全球系统变量
- 启用对全局事务特征的更改(请参见“ SET TRANSACTION语句”)。
TABLE_ENCRYPTION_ADMIN
(在MySQL 8.0.16中添加)启用后,使用户能够覆盖默认的加密设置
table_encryption_privilege_check
;请参阅为架构和常规表空间定义加密默认值。VERSION_TOKEN_ADMIN
启用执行版本令牌用户定义的功能。该权限由
version_tokens
插件定义;请参见“版本令牌”。XA_RECOVER_ADMIN
启用
XA RECOVER
语句的执行;请参见“ XA事务SQL语句”。在MySQL 8.0之前,任何用户都可以执行该
XA RECOVER
语句来发现未完成的准备好的XA事务的XID值,这可能导致启动该XA事务的用户而非发起该XA事务的用户。在MySQL 8.0中,XA RECOVER
仅允许具有XA_RECOVER_ADMIN
特权,应该仅将特权授予需要此特权的管理用户。例如,对于XA应用程序的管理员来说,如果该应用程序已崩溃并且可能需要查找该应用程序启动的未完成的事务以便可以回滚它们,则可能是这种情况。此特权要求防止用户发现他们自己以外的未完成的XA事务的XID值。它不会影响XA事务的正常提交或回滚,因为启动它的用户知道其XID。
特权授予准则
最好仅向帐户授予所需的特权。在授予FILE
和管理特权时,应格外谨慎:
FILE
可能会被滥用以将MySQL服务器可以在服务器主机上读取的任何文件读入数据库表。这包括所有世界可读的文件以及服务器数据目录中的文件。然后可以使用将该表SELECT
的内容传输到客户端主机来访问该表。GRANT OPTION
使用户可以将特权授予其他用户。具有不同特权并具有GRANT OPTION
特权的两个用户可以组合特权。ALTER
可用于通过重命名表来颠覆特权系统。SHUTDOWN
可以通过终止服务器来完全拒绝向其他用户提供服务。PROCESS
可用于参见当前正在执行的语句的纯文本,包括设置或更改密码的语句。SUPER
可用于终止其他会话或更改服务器的运行方式。授予
mysql
系统数据库本身的特权可用于更改密码和其他访问特权信息:- 密码以加密方式存储,因此恶意用户无法简单地阅读它们以了解纯文本密码。但是,对
mysql.user
系统表uthentication_string
列具有写访问权的用户可以更改帐户的密码,然后使用该帐户连接到MySQL服务器。 INSERT
或UPDATE
授予mysql
系统数据库权限的用户可以分别添加特权或修改现有特权。DROP
用于mysql
系统数据库的数据库使用户能够远程访问特权表,甚至数据库本身。
- 密码以加密方式存储,因此恶意用户无法简单地阅读它们以了解纯文本密码。但是,对
静态与动态特权
MySQL支持静态和动态特权:
- 静态特权内置在服务器中。它们始终可以授予用户帐户,并且不能取消注册。
- 动态特权可以在运行时注册和注销。这会影响其可用性:无法授予尚未注册的动态特权。
例如,SELECT
nd INSERT
特权是静态的,并且始终可用,而动态特权只有在实现它的服务器组件已启用时才可用。
本节的其余部分描述了动态特权在MySQL中的工作方式。讨论使用术语“组件”,但同样适用于插件。
注意服务器管理员应了解哪些服务器组件定义了动态特权。对于MySQL发行版,定义动态特权的组件文档描述了这些特权。
第三方组件也可以定义动态特权。管理员应该了解这些特权,而不应该安装可能会冲突或损害服务器操作的组件。例如,如果两个组件都定义了具有相同名称的特权,则该组件会与另一个组件发生冲突。组件开发人员可以通过基于组件名称选择具有前缀的特权名称来减少这种情况的发生。
服务器在内存中内部维护一组已注册的动态特权。在服务器关闭时发生注销。
通常,定义动态特权的服务器组件在安装时会在其初始化过程中进行注册。卸载后,服务器组件不会取消注册其注册的动态特权。(这是当前的惯例,不是必需的。也就是说,组件可以但不随时注销其注册的特权。)
尝试注册已注册的动态特权不会发生任何警告或错误。考虑以下语句序列:
INSTALL COMPONENT 'my_component';UNINSTALL COMPONENT 'my_component';INSTALL COMPONENT 'my_component';
第一条INSTALL COMPONENT
语句注册由服务器组件定义的任何特权my_component
,但UNINSTALL COMPONENT
不注销它们。对于第二条INSTALL COMPONENT
语句,发现它注册的组件特权已被注册,但是没有警告或错误发生。
动态特权仅适用于全局级别。服务器将有关当前动态特权分配给用户帐户的信息存储在mysql.global_grants
系统表中:
- 服务器自动注册
global_grants
在服务器启动期间命名的特权(除非提供了该--skip-grant-tables
选项)。 - 该
GRANT
和REVOKE
语句修改的内容global_grants
。 - 列出的动态特权分配
global_grants
是永久的。它们不会在服务器关闭时删除。
示例:以下语句向用户授予u1
控制从属服务器上的复制(包括组复制)以及修改系统变量所需的特权:
GRANT REPLICATION_SLAVE_ADMIN, GROUP_REPLICATION_ADMIN, BINLOG_ADMINON *.*TO 'u1'@'localhost';
授予的动态特权出现在SHOW GRANTS
语句和INFORMATION_SCHEMA
USER_PRIVILEGES
表的输出中。
对于GRANT
并REVOKE
在全球范围内,不会被识别为静态任何命名权限核对当前的一组登记的动态权限,如果发现理所当然的。否则,将发生错误以指示未知的特权标识符。
对于GRANT
和REVOKE
意义ALL[PRIVILEGES]
在全球范围包括所有静态全局权限,以及所有目前已登记的动态权限:
GRANT ALL
在全局级别授予所有静态全局特权和所有当前注册的动态特权。在执行该GRANT
语句之后注册的动态特权不会追溯授予任何帐户。REVOKE ALL
在全局级别上,吊销所有授予的静态全局特权和所有授予的动态特权。
该FLUSH PRIVILEGES
语句读取global_grants
表中的动态特权分配,并注册在那里找到的所有未注册特权。
有关MySQL服务器和MySQL发行版中包含的服务器组件提供的动态特权的描述,请参见“ MySQL提供的特权”。
将帐户从SUPER迁移到动态特权
在MySQL 8.0中,许多以前需要SUPER
特权的操作也与范围更有限的动态特权相关联。(有关这些特权的说明,请参见“ MySQL提供的特权”。)可以通过授予关联的动态特权(而不是)来向帐户允许每个此类操作SUPER
。通过使DBA避免授予SUPER
和定制用户特权使其更接近所允许的操作,此更改可提高安全性。SUPER
现在已弃用,并将在MySQL的未来版本中删除。
删除SUPER
时,SUPER
除非授予SUPER
的帐户迁移到适当的动态特权,否则以前需要的操作将失败。使用以下说明来实现该目标,以便在SUPER
删除帐户之前准备好帐户:
执行此查询以标识已授予的帐户
SUPER
:SELECT GRANTEEFROM INFORMATION_SCHEMA.USER_PRIVILEGESWHERE PRIVILEGE_TYPE = 'SUPER';对于前面查询所标识的每个帐户,确定其所需的操作
SUPER
。然后,授予与这些操作相对应的动态特权,然后撤销SUPER
。例如,如果
'u1'@'localhost'
需要SUPER
清除二进制日志和修改系统变量,这些语句将对帐户进行所需的更改:GRANT BINLOG_ADMIN, SYSTEM_VARIABLES_ADMINON *.*TO 'u1'@'localhost';REVOKE SUPER ON *.*FROM 'u1'@'localhost';修改所有适用的帐户之后,
INFORMATION_SCHEMA
第一步中的查询应产生一个空结果集。
授权表
该mysql
系统数据库包括包含关于用户帐户和他们持有的特权信息的几个授权表。本节介绍了这些表。有关系统数据库中其他表的信息,请参见“ mysql系统模式”。
这里的讨论描述了授权表的底层结构,以及服务器在与客户端交互时如何使用其内容。但是,通常您不直接修改授予表。当您使用诸如CREATE USER
,的帐户管理语句GRANT
并REVOKE
设置帐户并控制每个帐户的可用特权时,将间接进行修改。请参见“账户权限控制”。当您使用此类语句执行帐户操作时,服务器会代表您修改授权表。
注意不建议使用,,或等语句直接修改授权表
INSERT
,风险自负。服务器可以随意忽略由于此类修改而导致格式错误的行。UPDATE
DELETE
对于修改授权表的任何操作,服务器都会检查该表是否具有预期的结构,如果没有,则会产生错误。要将表更新为预期的结构,请执行MySQL升级过程。请参见“升级MySQL”。
- 授权表概述
- 用户和数据库授权表
- table_priv和columns_priv授予表
- procs_priv授权表
- proxies_priv授权表
- global_grants授权表
- default_roles授权表
- role_edges授予表
- password_history授权表
- 授予表范围列属性
- 授予表权限列属性
授权表概述
这些mysql
数据库表包含授权信息:
user
:用户帐户,静态全局特权和其他非特权列。global_grants
:动态全局特权。db
:数据库级特权。tables_priv
:表级特权。columns_priv
:列级特权。procs_priv
:存储过程和函数特权。proxies_priv
:代理用户权限。default_roles
:默认用户角色。role_edges
:角色子图的边缘。password_history
:密码更改历史记录。
有关静态和动态全局特权之间差异的信息,请参阅静态与动态特权。)
在MySQL 8.0中,授权表使用InnoDB
存储引擎并且是事务性的。在MySQL 8.0之前,授权表使用MyISAM
存储引擎,并且是非事务性的。授予表存储引擎的此更改使帐户管理语句(例如CREATE USER
或)的行为也可以随之更改GRANT
。以前,命名多个用户的帐户管理语句可能对某些用户成功而对其他用户失败。现在,每个语句都是事务性的,并且对于所有命名的用户都成功,或者回滚,并且在发生任何错误时都不起作用。
每个授权表都包含作用域列和特权列:
- 范围列确定表中每一行的范围;也就是说,该行适用的上下文。例如,
user
具有Host
和的User
值'h1.example.net'
和的表行'bob'
适用于认证h1.example.net
指定用户名的客户端从主机与服务器建立的连接bob
。同样,一个db
表行用Host
,User
和Db
的列值'h1.example.net'
,'bob'
并'reports'
适用于当bob
从主机连接h1.example.net
来访问reports
数据库。的tables_priv
和columns_priv
表包含作用域列,这些作用域列指示每行适用的表或表/列组合。该procs_priv
范围列表示存储程序到各行适用。 - 特权列指示表行授予哪些特权;也就是说,它允许执行哪些操作。服务器将信息组合在各种授权表中,以形成用户特权的完整描述。“访问控制,第二阶段:请求验证”,描述了此规则。
另外,授予表可能包含用于范围或特权评估以外的目的的列。
服务器以以下方式使用授权表:
user
表范围列确定是否拒绝或允许传入连接。对于允许的连接,user
表中授予的任何特权都表示用户的静态全局特权。该表中授予的所有特权都适用于服务器上的所有数据库。警告
因为任何静态全局特权都被认为是所有数据库的特权,所以任何静态全局特权都使用户可以使用
SHOW DATABASES
或通过检查的SCHEMATA
表来参见所有数据库名称INFORMATION_SCHEMA
,但在数据库级别受部分吊销限制的数据库除外。- 该
global_grants
表列出了对用户帐户的动态全局特权的当前分配。对于每一行,作用域列确定哪个用户具有在特权列中命名的特权。 - 该
db
表范围列决定哪些用户可以访问哪些数据库从哪个主机。特权列确定允许的操作。在数据库级别授予的特权适用于数据库以及数据库中的所有对象,例如表和存储的程序。 - 在
tables_priv
与columns_priv
表类似于db
表,但是更精致:他们在申请表和列级应用而非在数据库级。在表级别授予的特权适用于表及其所有列。在列级别授予的特权仅适用于特定列。 - 该
procs_priv
表适用于存储的例程(存储的过程和函数)。在例程级别授予的特权仅适用于单个过程或函数。 - 该
proxies_priv
表指示哪些用户可以充当其他用户的代理,以及该用户是否可以PROXY
向其他用户授予特权。 - 在
default_roles
与role_edges
表包含角色关系的信息。 - 该
password_history
表保留了先前选择的密码,以启用密码重用限制。请参见“帐户密码管理”。
服务器启动时会将授权表的内容读入内存。您可以通过发出一条FLUSH PRIVILEGES
语句或执行mysqladmin flush-privileges或mysqladmin reload命令来告诉它重新加载表。对授予表的更改将按“特权更改何时生效”中所述生效。
修改帐户时,最好确认您的更改是否达到了预期的效果。要检查给定帐户的特权,请使用以下SHOW GRANTS
语句。例如,要确定授予用户名和主机名值为bob
和的帐户的特权pc84.example.com
,请使用以下语句:
SHOW GRANTS FOR 'bob'@'pc84.example.com';
要显示帐户的非特权属性,请使用SHOW CREATE USER
:
SHOW CREATE USER 'bob'@'pc84.example.com';
用户和数据库授权表
服务器在访问控制的第一阶段和第二阶段都使用数据库中的user
和db
表mysql
(请参见“访问控制和帐户管理”)。user
和db
表中的列显示在此处。
表6.4用户和数据库表列
表名 | user | db |
---|---|---|
范围列 | Host | Host |
User | Db | |
User | ||
特权列 | Select_priv | Select_priv |
Insert_priv | Insert_priv | |
Update_priv | Update_priv | |
Delete_priv | Delete_priv | |
Index_priv | Index_priv | |
Alter_priv | Alter_priv | |
Create_priv | Create_priv | |
Drop_priv | Drop_priv | |
Grant_priv | Grant_priv | |
Create_view_priv | Create_view_priv | |
Show_view_priv | Show_view_priv | |
Create_routine_priv | Create_routine_priv | |
Alter_routine_priv | Alter_routine_priv | |
Execute_priv | Execute_priv | |
Trigger_priv | Trigger_priv | |
Event_priv | Event_priv | |
Create_tmp_table_priv | Create_tmp_table_priv | |
Lock_tables_priv | Lock_tables_priv | |
References_priv | References_priv | |
Reload_priv | ||
Shutdown_priv | ||
Process_priv | ||
File_priv | ||
Show_db_priv | ||
Super_priv | ||
Repl_slave_priv | ||
Repl_client_priv | ||
Create_user_priv | ||
Create_tablespace_priv | ||
Create_role_priv | ||
Drop_role_priv | ||
安全栏 | ssl_type | |
ssl_cipher | ||
x509_issuer | ||
x509_subject | ||
plugin | ||
uthentication_string | ||
password_expired | ||
password_last_changed | ||
password_lifetime | ||
ccount_locked | ||
Password_reuse_history | ||
Password_reuse_time | ||
Password_require_current | ||
User_attributes | ||
资源控制列 | max_questions | |
max_updates | ||
max_connections | ||
max_user_connections |
该user
表plugin
和 uthentication_string
列存储身份验证插件和凭据信息。
服务器使用plugin
帐户行列中命名的插件来验证帐户的连接尝试。
该plugin
列必须为非空。在启动时以及在运行时FLUSH PRIVILEGES
执行时,服务器将检查user
表行。对于任何具有空plugin
列的行,服务器都会向这种形式的错误日志中写入警告:
[Warning] User entry 'user_name'@'host_name' has an empty plugin value. The user will be ignored and no one can login with this user anymore.
要将插件分配给缺少该插件的帐户,请使用ALTER USER
语句。
该password_expired
列允许DBA终止帐户密码,并要求用户重置其密码。默认password_expired
值为'N'
,但可以'Y'
使用ALTER USER
语句设置为。帐户密码过期后,该帐户在与服务器的后续连接中执行的所有操作都会导致错误,直到用户发出ALTER USER
声明以建立新的帐户密码为止。
注意尽管可以通过将过期的密码设置为当前值来“重置”它,但出于良好的政策考虑,最好选择其他密码。DBA可以通过建立适当的密码重用策略来强制不重用。请参阅密码重用策略。
password_last_changed
是一TIMESTAMP
列,指示上次更改密码的时间。该值为非NULL
仅适用于使用MySQL内置的身份验证插件账户(mysql_native_password
,sha256_password
,或caching_sha2_password
)。该值NULL
用于其他帐户,例如使用外部身份验证系统进行身份验证的帐户。
password_last_changed
通过更新CREATE USER
,ALTER USER
和SET PASSWORD
报表,并通过GRANT
创造一个帐户或更改帐户密码的语句。
password_lifetime
表示帐户密码的有效期限(天)。如果密码已过期(使用该password_last_changed
列进行评估),则当客户端使用该帐户连接时,服务器认为密码已过期。的值N
大于零个表示口令必须在每次更改N
天。值为0将禁用自动密码过期。如果值为NULL
(默认值),则应用全局到期策略,如default_password_lifetime
系统变量所定义。
ccount_locked
指示该帐户是否被锁定(请参见“帐户锁定”)。
Password_reuse_history
是PASSWORD HISTORY
帐户或NULL
默认历史记录的选项的值。
Password_reuse_time
是PASSWORD REUSE INTERVAL
帐户或NULL
默认间隔的选项的值。
Password_require_current
(在MySQL 8.0.13中添加)对应PASSWORD REQUIRE
于该帐户的选项值,如下表所示。
表6.5允许的Password_require_current值
密码要求_当前值 | 相应的PASSWORD REQUIRE选项 |
---|---|
'Y' | PASSWORD REQUIRE CURRENT |
'N' | PASSWORD REQUIRE CURRENT OPTIONAL |
NULL | PASSWORD REQUIRE CURRENT DEFAULT |
User_attributes
(在MySQL 8.0.14中添加)是一个JSON格式的列,用于存储未存储在其他列中的帐户属性:
dditional_password
:辅助密码(如果有)。请参阅双密码支持。Restrictions
:限制列表(如果有)。限制是通过部分撤销操作添加的。属性值是一个元素数组,每个元素都有Database
和,这些Restrictions
键和键指示受限制的数据库的名称及其适用的限制(请参见“使用部分撤销的权限限制”)。Password_locking
:登录失败跟踪和临时帐户锁定的条件(如果有)(请参阅登录失败跟踪和临时帐户锁定)。该Password_locking
属性根据和语句的FAILED_LOGIN_ATTEMPTS
和PASSWORD_LOCK_TIME
选项进行更新。属性值是带有和的散列键,其键指示已为帐户指定的选项的值。如果缺少键,则其值隐式为0。如果键值隐式或显式为0,则禁用了相应的功能。该属性是在MySQL 8.0.19中添加的。CREATE USER
ALTER USER
failed_login_attempts
password_lock_time_days
如果没有适用的属性,User_attributes
则为NULL
。
示例:具有辅助密码并且部分撤销数据库特权的帐户在列值中具有 dditional_password
和Restrictions
属性:
mysql>SELECT User_attributesFROM mysql.User WHERE User = 'u'\G *************************** 1. row *************************** User_attributes : {"Restrictions" : [{"Database" : "mysql", "Privileges" : ["SELECT"]}], "additional_password" : "hashed_credentials"}
要确定存在哪些属性,请使用以下JSON_KEYS()
函数:
SELECT User ,Host , JSON_KEYS(User_attributes)FROM mysql.user WHERE User_attributes IS NOT NULL;
要提取诸如的特定属性Restrictions
,请执行以下操作:
SELECT User ,Host , User_attributes->>'$.Restrictions'FROM mysql.user WHERE User_attributes->>'$.Restrictions' <> '';
table_priv和columns_priv授予表
在访问控制的第二阶段,服务器执行请求验证,以确保每个客户端对其发出的每个请求都具有足够的特权。除了user
和db
授权表,服务器还可以查询tables_priv
和columns_priv
表以获取涉及表的请求。后面的表在表和列级别提供了更好的特权控制。它们具有下表中显示的列。
表6.6tables_priv和columns_priv表列
表名 | tables_priv | columns_priv |
---|---|---|
范围列 | Host | Host |
Db | Db | |
User | User | |
Table_name | Table_name | |
Column_name | ||
特权列 | Table_priv | Column_priv |
Column_priv | ||
其他栏 | Timestamp | Timestamp |
Grantor |
Timestamp
和Grantor
列被设置为当前时间戳和CURRENT_USER
值,分别,但其他未使用的。
procs_priv授权表
为了验证涉及存储例程的请求,服务器可以查询该procs_priv
表,该表具有下表中显示的列。
表6.7 procs_priv表列
表名 | procs_priv |
---|---|
范围列 | Host |
Db | |
User | |
Routine_name | |
Routine_type | |
特权列 | Proc_priv |
其他栏 | Timestamp |
Grantor |
该Routine_type
列是一ENUM
列,其值为'FUNCTION'
或'PROCEDURE'
表示该行所引用的例程的类型。该列使具有相同名称的函数和过程的特权可以分别授予。
在Timestamp
与Grantor
列未使用。
proxies_priv授权表
该proxies_priv
表记录有关代理帐户的信息。它具有以下列:
Host
,User
:代理帐户;也就是说,该帐户具有PROXY
代理帐户的特权。Proxied_host
,Proxied_user
:代理帐户。Grantor
,Timestamp
:未使用。With_grant
:代理帐户是否可以将PROXY
特权授予其他帐户。
为了使一个帐户能够将PROXY
特权授予其他帐户,它必须在proxies_priv
表中的一行中With_grant
设置为1,Proxied_host
并Proxied_user
设置为指示可以为其授予特权的一个或多个帐户。例如,'root'@'localhost'
在MySQL安装期间创建的帐户在proxies_priv
表中具有一行,该行允许授予的PROXY
特权''@''
,即授予所有用户和所有主机的特权。这样可以root
设置代理用户,以及将设置代理用户的权限委托给其他帐户。请参见“代理用户”。
global_grants授权表
该global_grants
表列出了对用户帐户的动态全局特权的当前分配。该表包含以下列:
USER
,http://127.0.0.1/lanmper/public
:被授予特权的帐户的用户名和主机名。PRIV
:特权名称。WITH_GRANT_OPTION
:该帐户是否可以将特权授予其他帐户。
default_roles授权表
该default_roles
表列出了默认用户角色。它具有以下列:
http://127.0.0.1/lanmper/public
,USER
:默认角色所应用的帐户或角色。DEFAULT_ROLE_http://127.0.0.1/lanmper/public
,DEFAULT_ROLE_USER
:默认角色。
role_edges授予表
该role_edges
表列出了角色子图的边。它具有以下列:
FROM_http://127.0.0.1/lanmper/public
,FROM_USER
:被授予角色的帐户。TO_http://127.0.0.1/lanmper/public
,TO_USER
:即授予帐户的角色。WITH_ADMIN_OPTION
:该帐户是否可以使用来授予其他帐户的角色并从其他帐户撤消该角色WITH ADMIN OPTION
。
password_history授权表
该password_history
表包含有关密码更改的信息。它具有以下列:
Host
,User
:发生密码更改的帐户。Password_timestamp
:更改密码的时间。Password
:新的密码哈希值。
该password_history
表为每个帐户积累了足够数量的非空密码,以使MySQL能够针对帐户密码历史记录长度和重用间隔进行检查。尝试更改密码时,会自动修剪两个限制之外的条目。
注意空密码不计入密码历史记录,并且随时可以重复使用。
如果重命名帐户,则其条目将重命名以匹配。如果删除了帐户或更改了其身份验证插件,则会删除其条目。
授予表范围列属性
授权表中的范围列包含字符串。每个的默认值是空字符串。下表显示了每一列中允许的字符数。
表6.8授予表范围列长度
栏名 | 允许的最大字符数 |
---|---|
Host ,Proxied_host | 255(MySQL 8.0.17之前的60) |
User ,Proxied_user | 32 |
Db | 64 |
Table_name | 64 |
Column_name | 64 |
Routine_name | 64 |
Host
和Proxied_host
值先转换为小写,然后再存储在授权表中。
对于访问检查的目的,进行比较User
,Proxied_user
, uthentication_string
,Db
,和Table_name
的值是大小写敏感的。的比较Host
,Proxied_host
,Column_name
,和Routine_name
的值是不区分大小写。
授予表权限列属性
在user
和db
表列出了被声明为一个单独的列每个特权ENUM('N','Y')DEFAULT 'N'
。换句话说,可以禁用或启用每个特权,默认状态为禁用。
tables_priv
,columns_priv
和procs_priv
表申报权限列的SET
列。这些列中的值可以包含表控制的特权的任何组合。仅启用列值中列出的那些特权。
表6.9集合类型特权列值
表名 | 栏名 | 可能的设置元素 |
---|---|---|
tables_priv | Table_priv | 'Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter','Create View','Show view','Trigger' |
tables_priv | Column_priv | 'Select','Insert','Update','References' |
columns_priv | Column_priv | 'Select','Insert','Update','References' |
procs_priv | Proc_priv | 'Execute','Alter Routine','Grant' |
只有user
和global_grants
表指定管理权限,如RELOAD
,SHUTDOWN
和SYSTEM_VARIABLES_ADMIN
。管理操作是对服务器本身的操作,而不是特定于数据库的操作,因此没有理由在其他授权表中列出这些特权。因此,服务器仅需要查阅user
和global_grants
表,以确定用户是否可以执行管理操作。
该FILE
特权也仅在user
表中指定。它本身不是管理特权,但是用户在服务器主机上读取或写入文件的能力与所访问的数据库无关。