MySQL8安全指南之账号控制与账户管理

司寇高峯
2023-12-01

账号控制与账户管理

账户用户名和密码

MySQL将账户存储在mysql系统数据库中的user表中。

账户还可能具有身份验证凭据,例如密码。凭据由帐户身份验证插件处理,MySQL支持多种认证插件。其中一些使用内部认证方法,而另一些使用外部认证方法来启用认证。更多信息请查看 Pluggable Authentication.

MySQL用户和密码的使用与操作系统用户和密码的使用有几个区别:

  • 用于MySQL身份认证的账户与登录Windows或者Unix系统的用户名无关。在 Unix 上,默认情况下,大多数 MySQL 客户端尝试使用当前 Unix 用户名作为 MySQL 用户名登录,但这只是为了方便起见。可以很容易的重写默认值,因为客户端程序允许使用-u或者--user选项指定登录MySQL的用户名。这就意味着任何人使用任何用户名去登录MySQL。除非没个MySQL用户名都有密码,否则安全不能保证数据库的安全。

  • MySQL用户名支持的最大长度为32个字符。但是不同的操作系统的用户名的长度是不同的。

  • 对于使用内置验证方法的账户验证客户端连接,通常MySQL会使用存储在user表中的密码。这些密码与你登录操作系统的密码是不同的。用于登录 Windows 或 Unix 机器的密码与用于访问该机器上 MySQL的密码之间没有必要的联系。

    如果MySQL使用其他插件对客户端进行认证。则插件实现的身份验证方法可能会或可能不会使用存储在用户表中的密码。

  • 存储在user表中的密码是通过插件的指定算法进行加密的。

  • 如果用户名和密码只包含 ASCII 字符,则无论字符集设置如何,都可以连接到服务器。当用户名和密码包含非ASCII字符的时候,如果要启用连接,客户端应用程序应该使用MYSQL_SET_CHARSET_NAME选项和适当的字符集作为参数来调用C API的mysql_options()函数 。这会导致使用指定的字符集进行身份验证。否则,除非服务器默认字符集与认证的编码相同,否则认证将失败。

    标准 MySQL 客户端程序支持 --default-character-set 选项,该选项会导致 mysql_options() 像刚才描述的那样被调用

MySQL 安装过程中使用初始 root 帐户填充授权表,如Securing the Initial MySQL Account中所述,其中还讨论了如何为其分配密码。此后,您通常会使用 CREATE USER、DROP USER、GRANTREVOKE 等语句来设置、修改和删除 MySQL 帐户。请查看 Adding Accounts, Assigning Privileges, and Dropping AccountsAccount Management Statements

要使用命令行客户端连接到 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提供的权限

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

  • 管理员权限的账户能够管理MySQL服务器的,这些权限是全局的,而不是针对特定数据库的。
  • 数据库权限适用于数据库以及其中的所有对象。这些权限可以授予特定数据,也可以全局授予,以便他们适用所有数据库。
  • 数据库对象权限可以授予数据库中特定的对象例如:表、索引、视图、存储过程,

权限分为静态权限(内置在服务器中的)和动态权限(在运行时定义),这两种有所不同。权限是静态的还是动态的会影响帐户和角色的可用性。

有关账户权限的信息存储在mysql系统数据库中的权限表中。MySQL服务器在启动时将权限表的内容读入内存中,MySQL 服务器在启动时将授权表的内容读取到内存中,并在When Privilege Changes Take Effect所示的情况下重新加载它们。MySQL服务器根据权限表的内存副本做出访问控制决策。

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

  • 可用权限摘要
  • 静态权限描述
  • 动态权限描述
  • 权限授予指南
  • 静态与动态权限
  • 将帐户从 SUPER权限迁移到动态权限

可用权限摘要

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

GRANTREVOKE 允许的静态权限

Table 6.2 Permissible Static Privileges for GRANT and REVOKE

PrivilegeGrant Table ColumnContext
ALL [PRIVILEGES]Synonym for “all privileges”Server administration
ALTERAlter_privTables
ALTER ROUTINEAlter_routine_privStored routines
CREATECreate_privDatabases, tables, or indexes
CREATE ROLECreate_role_privServer administration
CREATE ROUTINECreate_routine_privStored routines
CREATE TABLESPACECreate_tablespace_privServer administration
CREATE TEMPORARY TABLESCreate_tmp_table_privTables
CREATE USERCreate_user_privServer administration
CREATE VIEWCreate_view_privViews
DELETEDelete_privTables
DROPDrop_privDatabases, tables, or views
DROP ROLEDrop_role_privServer administration
EVENTEvent_privDatabases
EXECUTEExecute_privStored routines
FILEFile_privFile access on server host
GRANT OPTIONGrant_privDatabases, tables, or stored routines
INDEXIndex_privTables
INSERTInsert_privTables or columns
LOCK TABLESLock_tables_privDatabases
PROCESSProcess_privServer administration
PROXYSee proxies_priv tableServer administration
REFERENCESReferences_privDatabases or tables
RELOADReload_privServer administration
REPLICATION CLIENTRepl_client_privServer administration
REPLICATION SLAVERepl_slave_privServer administration
SELECTSelect_privTables or columns
SHOW DATABASESShow_db_privServer administration
SHOW VIEWShow_view_privViews
SHUTDOWNShutdown_privServer administration
SUPERSuper_privServer administration
TRIGGERTrigger_privTables
UPDATEUpdate_privTables or columns
USAGESynonym for “no privileges”Server administration

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

PrivilegeContext
APPLICATION_PASSWORD_ADMINDual password administration
AUDIT_ADMINAudit log administration
BACKUP_ADMINBackup administration
BINLOG_ADMINBackup and Replication administration
BINLOG_ENCRYPTION_ADMINBackup and Replication administration
CLONE_ADMINClone administration
CONNECTION_ADMINServer administration
ENCRYPTION_KEY_ADMINServer administration
FIREWALL_ADMINFirewall administration
FIREWALL_EXEMPTFirewall administration
FIREWALL_USERFirewall administration
FLUSH_OPTIMIZER_COSTSServer administration
FLUSH_STATUSServer administration
FLUSH_TABLESServer administration
FLUSH_USER_RESOURCESServer administration
GROUP_REPLICATION_ADMINReplication administration
INNODB_REDO_LOG_ARCHIVERedo log archiving administration
NDB_STORED_USERNDB Cluster
PERSIST_RO_VARIABLES_ADMINServer administration
REPLICATION_APPLIERPRIVILEGE_CHECKS_USER for a replication channel
REPLICATION_SLAVE_ADMINReplication administration
RESOURCE_GROUP_ADMINResource group administration
RESOURCE_GROUP_USERResource group administration
ROLE_ADMINServer administration
SESSION_VARIABLES_ADMINServer administration
SET_USER_IDServer administration
SHOW_ROUTINEServer administration
SYSTEM_USERServer administration
SYSTEM_VARIABLES_ADMINServer administration
TABLE_ENCRYPTION_ADMINServer administration
VERSION_TOKEN_ADMINServer administration
XA_RECOVER_ADMINServer administration

静态权限描述

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

  • ALL, ALL PRIVILEGES:这两个权限说明符是“授予特权级别上可用的所有权限”(GRANT选项除外)的缩写。例如,在全局或表级别授予 ALL权限,那么会分别授予所有全局权限或所有表级别权限。

  • ALTER:允许使用ALTER TABLE语句来改变表的结构。ALTER TABLE 还需要 CREATEINSERT 权限。重命名表需要对旧表执行 ALTERDROP,对新表执行 CREATEINSERT

  • ALTER ROUTINE:允许使用更改或删除存储过程(存储过程和函数)的语句。

  • CREATE:允许使用创建语句来创建数据库和表。

  • CREATE ROLE:允许使用create role语句(具有CREATE USER 权限还允许使用 CREATE ROLE 语句)。CREATE ROLEDROP ROLE 权限不如 CREATE USER 强大,因为它们只能用于创建和删除帐户

  • CREATE ROUTINE:允许使用创建存储例程(存储过程和函数)语句。

  • CREATE TABLESPACE:允许使用创建、更改或删除表空间和日志文件组的语句。

  • CREATE TEMPORARY TABLES:允许使用 CREATE TEMPORARY TABLE 语句创建临时表。会话创建临时表后,服务器不再对该表执行进一步的权限检查。会话可以对表执行任何操作,例如 DROP TABLE、INSERT、UPDATESELECT

  • CREATE USER:允许使用 ALTER USER、CREATE ROLE、CREATE USER、DROP ROLE、DROP USER、RENAME USERREVOKE ALL PRIVILEGES 语句。

  • CREATE VIEW:允许使用 CREATE VIEW 语句。

  • DELETE:允许从数据库中的表中删除行。

  • DROP:允许使用删除(移除)现有数据库、表和视图的语句。在分区表上使用 ALTER TABLE ... DROP PARTITION 语句需要 DROP 权限。 TRUNCATE TABLE 也需要 DROP 权限。

  • DROP ROLE:允许使用 DROP ROLE 语句。 (CREATE USER 权限还允许使用 DROP ROLE 语句)

  • EVENT:允许使用为事件调度程序创建、更改、删除或显示事件的语句。

  • EXECUTE:允许使用执行存储例程(存储过程和函数)的语句。

  • FILE:影响以下操作和服务器行为:

    • 使用 LOAD DATASELECT ... INTO OUTFILE 语句和 LOAD_FILE() 函数在服务器主机上启用读取和写入文件。具有FILE权限的用户可以读取服务器主机上的任何文件,这些文件可以是全局可读的,也可以是MySQL服务器可读的。这意味着用户可以读取任何数据库目录中的任何文件,因为服务器可以访问其中的任何文件。
    • 允许在MySQL服务器上具有写访问权限的任何目录中创建新的文件。包含MySQL服务器数据目录实现权限表的文件。
    • 允许在CREATE TABLE语句上使用DATA DIRECTORY或者 INDEX DIRECTORY表语句选项。

    为了安全,MySQL服务器不会覆盖已存在的文件。

    要限制可以读取或者写入文件的位置,可以是设置系统变量secure_file_priv为指定的文件目录。

  • GRANT OPETION:允许您向其他用户授权,或者撤销自己拥有的权限。

  • INDEX:允许使用创建或者删除索引的语句。INDEX适用于已存在的表。如果你有创建表的权限,你可以在create table语句中定义索引。

  • INSERT:允许向数据库中的表中插入数据。ANALYZE TABLE、OPTIMIZE TABLEREPAIR TABLE 表维护语句也需要 INSERT

  • LOCK TABLES:允许使用显式 LOCK TABLES 语句来锁定您具有 SELECT 权限的表。这包括使用写锁,它可以防止其他会话读取锁定的表。

  • PROCESSprocess权限控制对MySQL内执行线程信息的访问(也就是说,会话中正在执行的语句信息)。

    • 使用 PROCESS 权限,用户可以访问所有线程的信息,甚至是其他用户的线程信息。

    • 如果没有 PROCESS 权限,非匿名用户可以访问自己线程的信息,但不能访问其他用户的线程信息,而匿名用户则无法访问任何线程信息。

  • PROXY:允许一个用户模拟或成为另一个用户。

  • REFERENCES:创建外键约束需要父表的REFERENCES特权

  • RELOADrelaod允许以下操作:

    • 使用flush语句

    • 使用等同于 FLUSH 操作的 mysqladmin 命令:flush-hosts、flush-logs、flush-privileges、flush-status、flush-tables、flush-threads、refreshreload

      reload的命令告诉服务器重新加载权限表到内存。 flush-privilegesreload是同义词。 refresh 命令关闭并重新打开日志文件并刷新所有表。其他flush-xxx 命令执行类似于refresh 的功能,但更具体,在某些情况下可能更可取。例如,如果您只想刷新日志文件,flush-logs 是比refresh更好的选择。

    • 使用mysqldump选项执行各种FLUSH操作:——FLUSH -logs——master-data

    • 使用RESET MASTERRESET REPLICA | SLAVE 语句。

  • REPLICATION CLIENT:允许使用 SHOW MASTER STATUS, SHOW REPLICA | SLAVE STATUSSHOW BINARY LOGS 语句。

  • REPLICATION SLAVE:允许账户使用SHOW REPLICAS | SHOW SLAVE HOSTS, SHOW RELAYLOG EVENTS,SHOW BINLOG EVENTS语句请求副本服务器进行数据库的更新。使用 mysqlbinlog 选项 --read-from-remote-server 、--read-from-remote-source--read-from-remote-master 也需要此权限。将此权限授予副本服务器帐户用于连接到当前服务器作为其复制源的服务器。

  • SELECT:允许查询数据库表中的行数据。SELECT 语句仅在实际访问表时才需要 SELECT 权限。有些不访问表的SELECT语句,可以在没有任何数据库权限的情况下执行。例如,可以使用SELECT作为简单的计算器来计算:

    SELECT 1+1;
    SELECT PI()*2;
    

    读取其他列值的语句需要SELECT权限。例如,在 UPDATE 语句中 col_name=expr 的列或在 DELETEUPDATE 语句的 WHERE 子句中的列需要 SELECT权限。

    EXPLAIN一起使用的表或视图(包括视图定义中的任何基础表)需要SELECT权限。

  • SHOW DATABASES:通过发出 SHOW DATABASE 语句使帐户能够查看数据库名称。没有此权限的帐户只能查看他们拥有某些权限的数据库,如果服务器是使用 --skip-show-database 选项启动的,则根本无法使用该语句。

  • SHOW VIEW:允许使用 SHOW CREATE VIEW 语句。与 EXPLAIN 一起使用的视图也需要此权限。

  • SHUTDOWN:允许使用SHUTDOWNrestart语句,mysqladmin shutdown命令和C API的mysql_shutdown()函数

  • SUPERSUPER是一个强大而宽广的权限,不要轻易分配。如果一个账户只需要执行一个super权限的子集操作,有可能通过授予一个或多个动态特权来实现所需的特权集,每个特权赋予更多有限的能力。

    SUPER 已被弃用,它会在 MySQL 的未来版本中被删除。请参阅将帐户从 SUPER 迁移到动态权限。

    SUPER 影响以下操作和服务器行为:

    • 在运行时允许修改系统变量:

      • 使用 SET GLOBALSET PERSIST 启用对全局系统变量的更改。对应的动态权限是SYSTEM_VARIABLES_ADMIN
      • 允许设置需要特殊权限的受限会话的系统变量。对应的动态权限是 SESSION_VARIABLES_ADMIN
    • 启用对全局事务特性的更改(请参阅SET TRANSACTION Statement)。对应的动态权限是SYSTEM_VARIABLES_ADMIN

    • 允许账户启动和停止复制,包括组复制。对应的动态权限是REPLICATION_SLAVE_ADMIN 用于常规复制,GROUP_REPLICATION_ADMIN 用于组复制。

    • 允许使用 CHANGE REPLICATION SOURCE TO 语句(来自 MySQL 8.0.23)、CHANGE MASTER TO 语句(MySQL 8.0.23 之前)和 CHANGE REPLICATION FILTER 语句。对应的动态权限是 REPLICATION_SLAVE_ADMIN。

    • 通过 PURGE BINARY LOGSBINLOG 语句启用二进制日志控制。对应的动态权限为 BINLOG_ADMIN

    • 启用在执行视图或存储程序时设置有效的权限ID。具有此特权的用户可以在视图或存储程序的DEFINER属性中指定任何帐户。对应的动态权限是SET_USER_ID。

    • 允许使用 CREATE SERVER、ALTER SERVERDROP SERVER 语句。

    • 允许使用 mysqladmin 调试命令。

    • 启用 InnoDB 加密密轮询。对应的动态权限是 ENCRYPTION_KEY_ADMIN

    • 允许执行版本令牌函数。对应的动态权限为 VERSION_TOKEN_ADMIN

    • 允许授权和撤销角色。对应的动态权限为 ROLE_ADMIN

    • 允许控制非SUPER账户的客户端连接:

      • 允许使用 KILL 语句或 mysqladmin kill 命令来终止属于其他帐户的线程。 (一个帐户总是可以杀死自己的线程。)
      • SUPER 客户端连接时,服务器不会执行 init_connect 系统变量内容。
      • 即使达到了 max_connections 系统变量配置的连接限制,服务器也会接受来自 SUPER 客户端的一个连接。
      • 处于离线模式(启用了离线模式)的服务器不会在下一个客户端请求时终止 SUPER 客户端连接,并接受来自 SUPER 客户端的新连接。
      • 即使启用了read_only系统变量,也可以执行更新。这适用于显式表更新,以及使用GRANTREVOKE等帐户管理语句隐式更新表。

      上述连接控制操作对应的动态权限是CONNECTION_ADMIN

  • TRIGGER:允许触发器操作。您必须具有此权限才能为表创建、删除、执行或查看该表的触发器。

    当触发器被激活时(由有权为与触发器关联的表执行INSERT、UPDATEDELETE语句的用户激活),触发器执行要求定义触发器的用户仍具有该表的触发器权限。

  • UPDATE:允许更新数据库表中的行。

  • USAGE:此权限说明符代表“无权限”。它在全局级别与 GRANT 一起使用以指定诸如 WITH GRANT OPTION 之类的子句,而不在权限列表中命名特定帐户权限。 SHOW GRANTS 语句结果中的USAGE表示该帐户在权限级别没有权限。

动态权限

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

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

特定的 SQL 语句可能具有比此处指出的更具体的权限要求。如果是,则以下描述会提供详细信息:

  • APPLICATION_PASSWORD_ADMIN(在 MySQL 8.0.14 中添加)。对于双密码功能,此权限允许对应用于自己帐户的ALTER USERSET PASSWORD语句使用RETAIN CURRENT PASSWORDDISCARD OLD PASSWORD子句。由于大多数用户只需要一个密码,因此需要此权限才能操作自己的辅助密码。

    如果要允许一个帐户为所有帐户操作二级密码,则应授予它 CREATE USER 权限而不是 APPLICATION_PASSWORD_ADMIN

    有关使用双密码的更多信息,请参阅Password Management.。

  • AUDIT_ADMIN:启用审计日志配置。此权限由 audit_log 插件定义;请参阅 “MySQL Enterprise Audit.。

  • BACKUP_ADMIN:允许执行 LOCK INSTANCE FOR BACKUP 语句并访问 log_status 表。

    提示:除了 BACKUP_ADMIN,它的访问还需要 log_status 表的 SELECT 权限。

  • BINLOG_ADMIN:通过 PURGE BINARY LOGSBINLOG 语句启用二进制日志控制。

  • BINLOG_ENCRYPTION_ADMIN:允许设置系统变量 binlog_encryption,它激活或停用二进制日志文件和中继日志文件的加密。BINLOG_ADMIN、SYSTEM_VARIABLES_ADMINSESSION_VARIABLES_ADMIN 权限不提供此功能。相关的系统变量binlog_rotate_encryption_master_key_at_startup在服务器重新启动时自动轮询二进制日志主密钥,它不需要此权限。

  • CLONE_ADMIN:允许执行CLONE 语句。包括 BACKUP_ADMINSHUTDOWN 权限。

  • CONNECTION_ADMIN:启用使用 KILL 语句或 mysqladmin kill 命令来终止属于其他帐户的线程。 (一个帐户总是可以杀死自己的线程。)

    允许设置与客户端连接相关的系统变量,或绕过与客户端连接相关的限制。CONNECTION_ADMIN适用于这些系统变量的影响:

    • init_connect:当CONNECTION_ADMIN客户端连接时,服务器不执行init_connect系统变量内容。
    • max_connections:即使达到了 max_connections 系统变量配置的连接限制,服务器也会接受来自 CONNECTION_ADMIN 客户端的一个连接。
    • 离线模式:处于离线模式(启用离线模式)的服务器不会在下一个客户端请求时终止 CONNECTION_ADMIN 客户端连接,并接受来自 CONNECTION_ADMIN 客户端的新连接。
    • read_only:即使启用了read_only系统变量,也可以执行更新。这适用于显式表更新,以及使用GRANTREVOKE等帐户管理语句隐式更新表。
  • ENCRYPTION_KEY_ADMIN:允许InnoDB 加密密钥轮询。

  • FIREWALL_ADMIN:使用户能够为任何用户管理防火墙规则。此权限由 MYSQL_FIREWALL 插件定义;请参阅 MySQL Enterprise Firewall.。

  • FIREWALL_EXEMPT (added in MySQL 8.0.27):具有此权限的用户不受防火墙限制。此权限由 MYSQL_FIREWALL 插件定义;请参阅 MySQL Enterprise Firewall

  • FIREWALL_USER:使用户能够更新他们自己的防火墙规则。此权限由 MYSQL_FIREWALL 插件定义。请参阅 MySQL Enterprise Firewall

  • FLUSH_OPTIMIZER_COSTS (added in MySQL 8.0.23):允许使用 FLUSH OPTIMIZER_COSTS 语句。

  • FLUSH_STATUS (added in MySQL 8.0.23):允许使用 FLUSH STATUS 语句。

  • FLUSH_TABLES (added in MySQL 8.0.23):允许使用 FLUSH TABLES 语句。

  • FLUSH_USER_RESOURCES (added in MySQL 8.0.23):允许使用 FLUSH USER_RESOURCES 语句。

  • GROUP_REPLICATION_ADMIN

  • INNODB_REDO_LOG_ARCHIVE:启用帐户激活和取消重做日志归档。

  • INNODB_REDO_LOG_ENABLE:允许使用 ALTER INSTANCE {ENABLE|DISABLE} INNODB REDO_LOG 语句来启用或禁用重做日志记录

  • NDB_STORED_USER:使用户或角色及其特权能够在所有启用 NDB 的 MySQL 服务器之间共享和同步,一旦它们加入给定的 NDB Cluster。只有启用了 NDB 存储引擎时,此权限才可用。对给定用户或角色的权限所做的任何更改或撤销都会立即与所有连接的MySQL服务器(SQL节点)同步。您应该知道,不能保证来自不同SQL节点的权限的语句以相同的顺序在所有SQL节点上执行。因此,强烈建议在单个SQL节点执行所有用户管理。

    NDB_STORED_USER是全局权限,必须使用ON *.* 来授予或撤销。试图为该特权设置任何其他作用域将导致错误。这个特权可以授予大多数应用程序和管理用户,但是不能授予系统保留帐户,如mysql,session@localhostmysql.infoschema@localhost

    被授予NDB_STORED_USER权限的用户存储在NDB中(因此由所有SQL节点共享),具有此权限的角色也是如此。仅授予具有NDB_STORED_USER的角色的用户不存储在NDB中;必须显式地授予每个NDB存储用户权限。

    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

  • REPLICATION_SLAVE_ADMIN:使帐户能够连接到复制源服务器,使用START REPLICA | SLAVESTOP REPLICA | SLAVE 语句启动和停止复制,并使用CHANGE REPLICATION SOURCE TO语句(从MySQL 8.0.23开始)或CHANGE MASTER TO语句(在MySQL 8.0.23之前)和CHANGE REPLICATION FILTER语句。将此权限授予副本用于连接到当前服务器作为其复制源服务器的帐户。此权限不适用于组复制,请使用GROUP_REPLICATION_ADMIN

  • RESOURCE_GROUP_ADMIN:允许管理资源组,包括创建、更改和删除资源组,以及将线程和语句分配给资源组。具有此权限的用户可以执行与资源组相关的任何操作。

  • ROLE_ADMIN:允许授予和撤销角色,使用GRANT语句的WITH ADMIN OPTION子句,并在ROLES_GRAPHML()函数的结果中使用非空的元素内容。需要设置mandatory_roles系统变量的值

  • SERVICE_CONNECTION_ADMIN

  • SESSION_VARIABLES_ADMIN (added in MySQL 8.0.14):对于大多数系统变量,设置session值不需要任何特权,任何用户都可以这样做来影响当前会话。对于某些系统变量,设置会话值可能会在当前会话之外产生影响,因此是一个受限操作。对于这些, SESSION_VARIABLES_ADMIN权限允许用户设置SESSION值。

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

  • SYSTEM_USER (added in MySQL 8.0.16)SYSTEM_USER权限将普通 和系统用户区分开来。

    • 具有 SYSTEM_USER 权限的用户是系统用户。
    • 没有 SYSTEM_USER 权限的用户是普通用户。

    系统用户可以影响其他用户的权限

    • 一个系统用户既可以修改系统用户也可以修改普通用户。系统帐户只能由具有适当权限的系统用户修改,普通用户不能修改。
    • 一个拥有适当权限的普通用户可以修改普通账户,但是不能修改系统账户。一个普通账户可以被系统账户或者拥有适当权限的普通账户所修改。
  • SYSTEM_VARIABLES_ADMIN

    影响以下操作和服务器行为:

    • 允许在运行时修改系统变量
      • 允许使用 SET GLOBALSET PERSIST语句对服务全局配置进行修改。
      • 如果用户具有PERSIST_RO_VARIABLES_ADMIN权限,就允许使用 SET PERSIST_ONLY语句对服务全局配置进行修改。
      • 允许设置需要特殊权限的受限会话系统变量。实际上,SYSTEM_VARIABLES_ADMIN权限包含了SESSION_VARIABLES_ADMIN权限。
    • 允许改变全局事务特性
  • TABLE_ENCRYPTION_ADMIN (added in MySQL 8.0.16):当table_encryption_privilege_check被启用时,允许用户覆盖默认的加密设置;请参见Defining an Encryption Default for Schemas and General Tablespaces

权限授予指南

只授权账户所需要的权限。在授予FILE权限和管理权限的时候需要格外小心。

  • 具有FILE权限的账户可以将MySQL服务所在的服务器主机上任何文件读取到数据库表中。这包括所有全局可读的文件和服务器数据目录中的文件。然后可以使用SELECT访问该表,将其内容传输到客户机主机。
  • GRANT OPTION允许用户将自己的权限授予其他用户。两个拥有不同权限并具有GRANT OPTION权限的用户可以合并权限。
  • ALTER 可以通过重命名表来破坏权限系统。
  • SHUTDOWN 可以被滥用,通过终止服务器来完全拒绝向其他用户提供服务。
  • PROCESS 可用于查看当前正在执行语句的信息,包括设置或更改密码的语句。
  • SUPER 可用于终止其他会话或更改服务器的运行方式。
  • mysql系统数据库本身授予的权限可用于更改密码和其他访问权限信息:
    • 密码是加密存储的,因此恶意用户不能简单地读取它们以了解明文密码。但是,一个对mysql有写访问权限的用户。用户系统表authentication_string列可以修改一个帐户的密码,然后使用该帐户连接到MySQL服务器。
    • mysql 系统数据库授予的 INSERTUPDATE 权限能够使用户添加权限或修改现有权限。
    • mysql系统数据库的DROP权限允许用户远程访问权限表,甚至数据库本身。

静态与动态权限

MySQL支持静态和动态权限。

  • 静态权限内置于服务器中。它们始终可以授予给用户帐户,并且不能注销。
  • 动态权限可以在运行时注册和注销。这会影响它们的可用性:无法授予尚未注册的动态权限。

例如,SELECT和INSERT特权是静态的并且总是可用的,而动态特权只有在实现它的组件被启用时才可用。

本节的其余部分将介绍动态权限在MySQL中的工作方式。讨论中使用了“组件”一词,但同样适用于插件。

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

通常,定义动态特权的组件在安装时的初始化过程中注册它们。卸载时,组件不会注销已注册的动态特权。

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

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

第一个INSTALL COMPONENT语句注册my_component中定义的所有权限,但是UNINSTALL COMPONENT语句不会注销这些权限。对于第二个STALL COMPONENT语句,发现该组件已经被注册,但是不会告警或者错误。

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

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

  • GRANTREVOKE 语句修改 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,任何未被识别的静态权限命名都将被已注册的动态权限集所检察,如果知道则授权。否则发生错误并且提示未知的权限标识符。

对于 GRANTREVOKE 全局级别的 ALL [PRIVILEGES] 意味着包括所有静态全局权限,以及所有当前注册的动态权限:

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

FLUSH PRIVILEGES语句读取global_grants表进行动态权限分配,并注册在该表中发现的任何未注册的权限。

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

SUPER现在被弃用了;希望在MySQL的未来版本中删除它。删除SUPER时,以前需要SUPER的操作将失败,除非被授予SUPER的帐户授予相应的动态权限。使用以下说明实现该目标,以便在超级SUPER之前准备好帐户:

  • 执行此查询以识别被授予 SUPER 的帐户:

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

    例如,如果 'u1'@'localhost' 需要 SUPER 权限进行二进制日志清除和系统变量修改,则通过以下语句对账户权限进行修改:

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

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

 类似资料: