• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 权限控制

    MySQL支持创建帐户,该帐户允许客户端用户连接到服务器并访问服务器管理的数据。MySQL权限系统的主要功能是验证谁从给定主机连接用户,并与特权用户数据库如联想SELECTINSERTUPDATE,和DELETE。其他功能包括授予管理操作特权的功能。

    为了控制哪些用户可以连接,可以为每个帐户分配身份验证凭据,例如密码。用户界面MySQL账户由SQL语句如CREATE USERGRANTREVOKE。请参见“账户权限控制”。

    MySQL特权系统确保所有用户只能执行他们所允许的操作。作为用户,当您连接到MySQL服务器时,您的身份由连接的主机指定的用户名确定。当您在连接后发出请求时,系统会根据您的身份和您想做的事情授予特权。

    MySQL会在识别您的身份时同时考虑您的主机名和用户名,因为没有理由假定给定的用户名在所有主机上都属于同一个人。例如,用户joe谁从连接office.example.com不一定是同一个人用户joe谁从连接home.example.com。MySQL的,使您能够区分上碰巧有相同的名称不同的主机用户来处理它:你可以通过授予一组的连接权限joeoffice.example.com,并通过连接一组不同的权限joehome.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()而可以替代使用。参见连接器文档。

      前面的注释不适用于ucs2utf16和和utf32,它们不允许用作客户端字符集。

    MySQL安装过程将使用初始root帐户填充授权表,如“保护初始MySQL帐户”所述,该文件还讨论了如何为其分配密码。此后,你通常建立,修改和删除MySQL账户使用语句,例如CREATE USERDROP USERGRANT,和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迁移到动态特权

    可用权限摘要

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

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

    特权授权表列语境
    ALL[PRIVILEGES]“所有特权”的同义词服务器管理
    ALTERAlter_priv桌子
    ALTER ROUTINEAlter_routine_priv存储的例程
    CREATECreate_priv数据库,表或索引
    CREATE ROLECreate_role_priv服务器管理
    CREATE ROUTINECreate_routine_priv存储的例程
    CREATE TABLESPACECreate_tablespace_priv服务器管理
    CREATE TEMPORARY TABLESCreate_tmp_table_priv桌子
    CREATE USERCreate_user_priv服务器管理
    CREATE VIEWCreate_view_priv观看次数
    DELETEDelete_priv桌子
    DROPDrop_priv数据库,表或视图
    DROP ROLEDrop_role_priv服务器管理
    EVENTEvent_priv资料库
    EXECUTEExecute_priv存储的例程
    FILEFile_priv服务器主机上的文件访问
    GRANT OPTIONGrant_priv数据库,表或存储的例程
    INDEXIndex_priv桌子
    INSERTInsert_priv表或列
    LOCK TABLESLock_tables_priv资料库
    PROCESSProcess_priv服务器管理
    PROXYproxies_priv服务器管理
    REFERENCESReferences_priv数据库或表
    RELOADReload_priv服务器管理
    REPLICATION CLIENTRepl_client_priv服务器管理
    REPLICATION SLAVERepl_slave_priv服务器管理
    SELECTSelect_priv表或列
    SHOW DATABASESShow_db_priv服务器管理
    SHOW VIEWShow_view_priv观看次数
    SHUTDOWNShutdown_priv服务器管理
    SUPERSuper_priv服务器管理
    TRIGGERTrigger_priv桌子
    UPDATEUpdate_priv表或列
    USAGE“没有特权”的同义词服务器管理

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

    表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_USERNDB集群
    PERSIST_RO_VARIABLES_ADMIN服务器管理
    REPLICATION_APPLIERPRIVILEGE_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语句可能具有比此处指示的更具体的特权要求。如果是这样,所讨论语句的说明将提供详细信息。

    • ALLALL PRIVILEGES

      这些特权说明符是“给定特权级别上所有可用特权”的简称(除外GRANT OPTION)。例如,ALL在全局或表级别进行授予分别授予所有全局特权或所有表级别特权。

    • ALTER

      允许使用该ALTER TABLE语句更改表的结构。ALTER TABLE还需要CREATEINSERT特权。重命名表需要ALTERDROP对旧表,CREATE以及INSERT对新表。

    • ALTER ROUTINE

      支持使用更改或删除存储例程(存储过程和函数)的语句。

    • CREATE

      允许使用创建新数据库和表的语句。

    • CREATE ROLE

      启用CREATE ROLE语句的使用。(该CREATE USER特权还允许使用该CREATE ROLE语句。)请参见“授权控制”。

      CREATE ROLEDROP ROLE特权是不是强大CREATE USER,因为它们只能用于创建和删除帐户。它们不能用作CREATE USER修改帐户属性或重命名帐户。请参阅用户和角色互换性。

    • CREATE ROUTINE

      允许使用创建存储例程(存储过程和函数)的语句。

    • CREATE TABLESPACE

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

    • CREATE TEMPORARY TABLES

      启用使用该CREATE TEMPORARY TABLE语句创建临时表。

      会话创建临时表后,服务器将不再对该表执行任何特权检查。所述创建会话可以在桌子上进行任何操作,例如DROP TABLEINSERTUPDATE,或SELECT。有关更多信息,请参见“ CREATE TEMPORARY TABLE语句”。

    • CREATE USER

      允许使用的ALTER USERCREATE ROLECREATE USERDROP ROLEDROP USERRENAME 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 ROLEDROP ROLE特权是不是强大CREATE USER,因为它们只能用于创建和删除帐户。它们不能用作CREATE USER修改帐户属性或重命名帐户。请参阅用户和角色互换性。

    • EVENT

      支持使用为事件计划程序创建,更改,删除或显示事件的语句。

    • EXECUTE

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

    • FILE

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

      • 使用LOAD DATA nd SELECT ... INTO OUTFILE语句和LOAD_FILE()函数启用在服务器主机上的读写文件。拥有FILE特权的用户可以读取服务器主机上世界可读或MySQL服务器可读的任何文件。(这意味着用户可以读取任何数据库目录中的任何文件,因为服务器可以访问任何这些文件。)
      • 允许在MySQL服务器具有写访问权的任何目录中创建新文件。这包括服务器的数据目录,该目录包含实现特权表的文件。
      • 允许对语句使用DATA DIRECTORYor INDEX DIRECTORY表选项CREATE TABLE

      作为安全措施,服务器不会覆盖现有文件。

      要限制可读写文件的位置,请将secure_file_priv系统变量设置为特定目录。请参见“服务器系统变量”。

    • GRANT OPTION

      使您可以授予自己拥有的特权或从其他用户撤消这些特权。

    • INDEX

      允许使用创建或删除(删除)索引的语句。INDEX适用于现有表。如果您有CREATE表的特权,则可以在CREATE TABLE语句中包括索引定义。

    • INSERT

      使行可以插入数据库的表中。INSERT还需要对ANALYZE TABLEOPTIMIZE TABLEREPAIR TABLE表维护语句。

    • LOCK TABLES

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

    • PROCESS

      启用显示有关服务器内执行的线程的信息(即有关会话正在执行的语句的信息)。该特权允许使用SHOW PROCESSLISTmysqladmin进程列表参见属于其他帐户的线程;您总是可以看到自己的线程。该PROCESS特权还允许使用SHOW ENGINE

    • PROXY

      使一个用户可以模拟或成为另一用户。请参见“代理用户”。

    • REFERENCES

      创建外键约束需要REFERENCES父表具有特权。

    • RELOAD

      启用FLUSH语句的使用。这也使中mysqladmin等效于命令FLUSH操作:flush-hostsflush-logsflush-privilegesflush-statusflush-tablesflush-threadsrefresh,和reload

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

      RELOAD特权还允许使用RESET MASTER nd RESET SLAVE语句。

    • REPLICATION CLIENT

      允许使用的SHOW MASTER STATUSSHOW SLAVE STATUSSHOW BINARY LOGS语句。将此特权授予从属服务器用于将其作为主服务器连接到当前服务器的帐户。

    • REPLICATION SLAVE

      启用该帐户已作出对数据库的主服务器上,使用请求更新SHOW SLAVE http://127.0.0.1/lanmper/publicSSHOW RELAYLOG EVENTSSHOW BINLOG EVENTS语句。要使用mysqlbinlog选项--read-from-remote-server-R)和,也需要此特权--read-from-remote-master。将此特权授予从属服务器用于将其作为主服务器连接到当前服务器的帐户。

    • SELECT

      允许从数据库的表中选择行。SELECT语句SELECT仅在实际访问表时才需要特权。有些SELECT语句不访问表,并且可以在未经任何数据库许可的情况下执行。例如,您可以SELECT用作简单的计算器来评估不引用表的表达式:

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

      SELECT还需要读取列值等语句的权限。例如,对于在语句SELECTcol_name=expr赋值右侧引用的UPDATE列或在or 语句的WHERE子句中命名的列,则需要。DELETEUPDATE

      SELECT是需要与用于表或视图特权EXPLAIN,包括在视图定义任何潜在的表。

    • SHOW DATABASES

      通过发出SHOW DATABASE语句使帐户能够参见数据库名称。没有此特权的帐户只能看到具有某些特权的数据库,并且如果使用该--skip-show-database选项启动服务器,则根本无法使用该语句。

      警告

      因为任何静态全局特权都被认为是所有数据库的特权,所以任何静态全局特权都使用户可以使用SHOW DATABASES或通过检查的SCHEMATA表来参见所有数据库名称INFORMATION_SCHEMA,但在数据库级别受部分吊销限制的数据库除外。

    • SHOW VIEW

      启用SHOW CREATE VIEW语句的使用。与结合使用的视图也需要此特权EXPLAIN

    • SHUTDOWN

      允许使用SHUTDOWN and RESTART语句,mysqladmin shutdown命令和mysql_shutdown()C API函数。

    • SUPER

      SUPER是一项强大而深远的特权,不应轻视。如果帐户只需要执行一部分SUPER操作,则可以通过授予一个或多个动态特权来实现所需的特权集,每个特权都赋予更多有限的功能。请参阅动态特权描述。

      注意

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

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

      • 在运行时启用系统变量更改:

        • 启用服务器的配置变化与全球系统变量SET GLOBALSET PERSIST

          相应的动态特权为SYSTEM_VARIABLES_ADMIN

        • 启用设置需要特殊特权的受限会话系统变量。

          相应的动态特权为SESSION_VARIABLES_ADMIN

        另请参见“系统变量特权”。

      • 启用对全局事务特征的更改(请参见“ SET TRANSACTION语句”)。

        相应的动态特权为SYSTEM_VARIABLES_ADMIN

      • 使帐户能够启动和停止复制,包括组复制。

        相应的动态特权REPLICATION_SLAVE_ADMIN用于常规复制GROUP_REPLICATION_ADMIN和组复制。

      • 启用CHANGE MASTER TOCHANGE REPLICATION FILTER语句。

        相应的动态特权为REPLICATION_SLAVE_ADMIN

      • 通过PURGE BINARY LOGS nd BINLOG语句启用二进制日志控制。

        相应的动态特权为BINLOG_ADMIN

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

        相应的动态特权为SET_USER_ID

      • 允许使用的CREATE SERVERALTER SERVERDROP 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启用了系统变量,也可以执行更新。这适用于显式表更新,也适用于帐户管理语句,例如GRANTREVOKE隐式更新表。

        前面的连接控制操作的相应动态特权为CONNECTION_ADMIN

      SUPER如果启用了二进制日志记录,则可能还需要特权来创建或更改存储的功能,如“存储的程序二进制日志记录”中所述。

    • TRIGGER

      启用触发器操作。您必须具有此特权才能使表创建,删除,执行或显示该表的触发器。

      当触发器被激活(由谁拥有特权执行用户INSERTUPDATEDELETE与触发器关联的表的语句),触发器执行要求谁定义触发器的用户仍然有TRIGGER对表的特权。

    • UPDATE

      使行可以在数据库的表中更新。

    • USAGE

      此特权说明符代表“无特权。”在全局级别使用,GRANT用于指定子句,例如WITH GRANT OPTION不在特权列表中命名特定的帐户特权。SHOW GRANTS显示USAGE以指示帐户在特权级别没有特权。

    动态权限说明

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

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

    特定的SQL语句可能具有比此处指示的更具体的特权要求。如果是这样,所讨论语句的说明将提供详细信息。

    • APPLICATION_PASSWORD_ADMIN(在MySQL 8.0.14中添加)

      对于双密码功能,此特权允许使用适用于您自己帐户的RETAIN CURRENT PASSWORD nd DISCARD OLD PASSWORD子句ALTER USER和and SET 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 nd BINLOG语句启用二进制日志控制。

    • BINLOG_ENCRYPTION_ADMIN

      启用设置系统变量binlog_encryption,以激活或禁用二进制日志文件和中继日志文件的加密。这种能力不是由提供BINLOG_ADMINSYSTEM_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:客户端连接init_connect时,服务器不执行系统变量内容CONNECTION_ADMIN
      • max_connectionsCONNECTION_ADMIN即使max_connections达到了由系统变量配置的连接限制,服务器也会接受来自客户端的一个连接。
      • offline_mode:处于脱机模式(offline_mode启用)的服务器不会CONNECTION_ADMIN在下一个客户端请求时终止客户端连接,而是接受来自CONNECTION_ADMIN客户端的新连接。
      • read_only:即使read_only启用了系统变量,也可以执行更新。这适用于显式表更新,也适用于帐户管理语句,例如GRANTREVOKE隐式更新表。
    • ENCRYPTION_KEY_ADMIN

      启用InnoDB加密密钥轮换。

    • FIREWALL_ADMIN

      使用户能够管理任何用户的防火墙规则。该权限由MYSQL_FIREWALL插件定义;请参见“ MySQL企业防火墙”。

    • FIREWALL_USER

      使用户能够更新自己的防火墙规则。该权限由MYSQL_FIREWALL插件定义;请参见“ MySQL企业防火墙”。

    • GROUP_REPLICATION_ADMIN

      使帐户能够使用START GROUP REPLICATIONSTOP 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@localhostmysql.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_ADMINPERSIST_RO_VARIABLES_ADMIN可以使用来SET PERSIST_ONLY将全局系统变量保留到mysqld-auto.cnf数据目录中的选项文件中。该语句类似于SET PERSIST但不修改运行时全局系统变量值。这SET PERSIST_ONLY适用于配置只能在服务器启动时设置的只读系统变量。

      另请参见“系统变量特权”。

    • REPLICATION_APPLIER

      允许该帐户充当PRIVILEGE_CHECKS_USER复制通道的帐户,并执行mysqlbinlog输出中的BINLOG语句。将此特权授予分配给用于为复制通道提供安全上下文并处理这些通道上的复制错误的帐户。除了特权之外,还必须赋予该帐户所需的特权,以执行复制通道接收或包含在mysqlbinlog输出中的事务,例如,更新受影响的表。有关更多信息,请参见CHANGE MASTER TOREPLICATION_APPLIER“复制特权检查”。

    • REPLICATION_SLAVE_ADMIN

      使帐户能够连接到主服务器,使用START SLAVESTOP SLAVE语句启动和停止复制,以及使用CHANGE MASTER TOCHANGE 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_formatsql_log_bin,和sql_log_off

      在MySQL 8.0.14之前的版本中SESSION_VARIABLES_ADMIN,受限会话系统变量只能由具有SYSTEM_VARIABLES_ADMINSUPER特权的用户设置。

      SESSION_VARIABLES_ADMIN特权的一个子集SYSTEM_VARIABLES_ADMINSUPER特权。具有这两种特权之一的用户也被允许设置受限制的会话变量,并且SESSION_VARIABLES_ADMIN通过暗示有效地具有该特权,并且无需SESSION_VARIABLES_ADMIN明确地被授予。

      另请参见“系统变量特权”。

    • SET_USER_ID

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

    • SHOW_ROUTINE(在MySQL 8.0.20中添加)

      使用户能够访问所有存储例程(存储过程和函数)的定义和属性,即使用户不是其定义者。此访问权限包括:

      • INFORMATION_SCHEMA.ROUTINES表的内容。
      • SHOW CREATE FUNCTIONSHOW CREATE PROCEDURE语句。
      • SHOW FUNCTION CODESHOW PROCEDURE CODE语句。
      • SHOW FUNCTION STATUSSHOW 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 GLOBALSET 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服务器。
      • INSERTUPDATE授予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选项)。
    • GRANTREVOKE语句修改的内容global_grants
    • 列出的动态特权分配global_grants是永久的。它们不会在服务器关闭时删除。

    示例:以下语句向用户授予u1控制从属服务器上的复制(包括组复制)以及修改系统变量所需的特权:

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

    授予的动态特权出现在SHOW GRANTS语句和INFORMATION_SCHEMAUSER_PRIVILEGES表的输出中。

    对于GRANTREVOKE在全球范围内,不会被识别为静态任何命名权限核对当前的一组登记的动态权限,如果发现理所当然的。否则,将发生错误以指示未知的特权标识符。

    对于GRANTREVOKE意义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删除帐户之前准备好帐户:

    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第一步中的查询应产生一个空结果集。

    授权表

    mysql系统数据库包括包含关于用户帐户和他们持有的特权信息的几个授权表。本节介绍了这些表。有关系统数据库中其他表的信息,请参见“ mysql系统模式”。

    这里的讨论描述了授权表的底层结构,以及服务器在与客户端交互时如何使用其内容。但是,通常您不直接修改授予表。当您使用诸如CREATE USER,的帐户管理语句GRANTREVOKE设置帐户并控制每个帐户的可用特权时,将间接进行修改。请参见“账户权限控制”。当您使用此类语句执行帐户操作时,服务器会代表您修改授权表。

    注意

    不建议使用,,或等语句直接修改授权表INSERT,风险自负。服务器可以随意忽略由于此类修改而导致格式错误的行。UPDATEDELETE

    对于修改授权表的任何操作,服务器都会检查该表是否具有预期的结构,如果没有,则会产生错误。要将表更新为预期的结构,请执行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表行用HostUserDb的列值'h1.example.net''bob''reports'适用于当bob从主机连接h1.example.net来访问reports数据库。的tables_privcolumns_priv表包含作用域列,这些作用域列指示每行适用的表或表/列组合。该procs_priv范围列表示存储程序到各行适用。
    • 特权列指示表行授予哪些特权;也就是说,它允许执行哪些操作。服务器将信息组合在各种授权表中,以形成用户特权的完整描述。“访问控制,第二阶段:请求验证”,描述了此规则。

    另外,授予表可能包含用于范围或特权评估以外的目的的列。

    服务器以以下方式使用授权表:

    • user表范围列确定是否拒绝或允许传入连接。对于允许的连接,user表中授予的任何特权都表示用户的静态全局特权。该表中授予的所有特权适用于服务器上的所有数据库。

      警告

      因为任何静态全局特权都被认为是所有数据库的特权,所以任何静态全局特权都使用户可以使用SHOW DATABASES或通过检查的SCHEMATA表来参见所有数据库名称INFORMATION_SCHEMA,但在数据库级别受部分吊销限制的数据库除外。

    • global_grants表列出了对用户帐户的动态全局特权的当前分配。对于每一行,作用域列确定哪个用户具有在特权列中命名的特权。
    • db表范围列决定哪些用户可以访问哪些数据库从哪个主机。特权列确定允许的操作。在数据库级别授予的特权适用于数据库以及数据库中的所有对象,例如表和存储的程序。
    • tables_privcolumns_priv表类似于db表,但是更精致:他们在申请表和列级应用而非在数据库级。在表级别授予的特权适用于表及其所有列。在列级别授予的特权仅适用于特定列。
    • procs_priv表适用于存储的例程(存储的过程和函数)。在例程级别授予的特权仅适用于单个过程或函数。
    • proxies_priv表指示哪些用户可以充当其他用户的代理,以及该用户是否可以PROXY向其他用户授予特权。
    • default_rolesrole_edges表包含角色关系的信息。
    • password_history表保留了先前选择的密码,以启用密码重用限制。请参见“帐户密码管理”。

    服务器启动时会将授权表的内容读入内存。您可以通过发出一条FLUSH PRIVILEGES语句或执行mysqladmin flush-privilegesmysqladmin reload命令来告诉它重新加载表。对授予表的更改将按“特权更改何时生效”中所述生效。

    修改帐户时,最好确认您的更改是否达到了预期的效果。要检查给定帐户的特权,请使用以下SHOW GRANTS语句。例如,要确定授予用户名和主机名值为bob和的帐户的特权pc84.example.com,请使用以下语句:

    SHOW GRANTS FOR 'bob'@'pc84.example.com';
    

    要显示帐户的非特权属性,请使用SHOW CREATE USER

    SHOW CREATE USER 'bob'@'pc84.example.com';
    

    用户和数据库授权表

    服务器在访问控制的第一阶段和第二阶段都使用数据库中的userdbmysql(请参见“访问控制和帐户管理”)。userdb表中的列显示在此处。

    表6.4用户和数据库表列

    表名userdb
    范围列HostHost
    UserDb
    User
    特权列Select_privSelect_priv
    Insert_privInsert_priv
    Update_privUpdate_priv
    Delete_privDelete_priv
    Index_privIndex_priv
    Alter_privAlter_priv
    Create_privCreate_priv
    Drop_privDrop_priv
    Grant_privGrant_priv
    Create_view_privCreate_view_priv
    Show_view_privShow_view_priv
    Create_routine_privCreate_routine_priv
    Alter_routine_privAlter_routine_priv
    Execute_privExecute_priv
    Trigger_privTrigger_priv
    Event_privEvent_priv
    Create_tmp_table_privCreate_tmp_table_priv
    Lock_tables_privLock_tables_priv
    References_privReferences_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

    userplugin 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_passwordsha256_password,或caching_sha2_password)。该值NULL用于其他帐户,例如使用外部身份验证系统进行身份验证的帐户。

    password_last_changed通过更新CREATE USERALTER USERSET PASSWORD报表,并通过GRANT创造一个帐户或更改帐户密码的语句。

    password_lifetime表示帐户密码的有效期限(天)。如果密码已过期(使用该password_last_changed列进行评估),则当客户端使用该帐户连接时,服务器认为密码已过期。的值N大于零个表示口令必须在每次更改N天。值为0将禁用自动密码过期。如果值为NULL(默认值),则应用全局到期策略,如default_password_lifetime系统变量所定义。

    ccount_locked指示该帐户是否被锁定(请参见“帐户锁定”)。

    Password_reuse_historyPASSWORD HISTORY帐户或NULL默认历史记录的选项的值。

    Password_reuse_timePASSWORD 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
    NULLPASSWORD REQUIRE CURRENT DEFAULT

    User_attributes(在MySQL 8.0.14中添加)是一个JSON格式的列,用于存储未存储在其他列中的帐户属性:

    • dditional_password:辅助密码(如果有)。请参阅双密码支持。
    • Restrictions:限制列表(如果有)。限制是通过部分撤销操作添加的。属性值是一个元素数组,每个元素都有Database和,这些Restrictions键和键指示受限制的数据库的名称及其适用的限制(请参见“使用部分撤销的权限限制”)。
    • Password_locking:登录失败跟踪和临时帐户锁定的条件(如果有)(请参阅登录失败跟踪和临时帐户锁定)。该Password_locking属性根据和语句的FAILED_LOGIN_ATTEMPTSPASSWORD_LOCK_TIME选项进行更新。属性值是带有和的散列键,其键指示已为帐户指定的选项的值。如果缺少键,则其值隐式为0。如果键值隐式或显式为0,则禁用了相应的功能。该属性是在MySQL 8.0.19中添加的。CREATE USERALTER USERfailed_login_attemptspassword_lock_time_days

    如果没有适用的属性,User_attributes则为NULL

    示例:具有辅助密码并且部分撤销数据库特权的帐户在列值中具有 dditional_passwordRestrictions属性:

    mysql> SELECT User_attributes FROM 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授予表

    在访问控制的第二阶段,服务器执行请求验证,以确保每个客户端对其发出的每个请求都具有足够的特权。除了userdb授权表,服务器还可以查询tables_privcolumns_priv表以获取涉及表的请求。后面的表在表和列级别提供了更好的特权控制。它们具有下表中显示的列。

    表6.6tables_priv和columns_priv表列

    表名tables_privcolumns_priv
    范围列HostHost
    DbDb
    UserUser
    Table_nameTable_name
    Column_name
    特权列Table_privColumn_priv
    Column_priv
    其他栏TimestampTimestamp
    Grantor

    TimestampGrantor列被设置为当前时间戳和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'表示该行所引用的例程的类型。该列使具有相同名称的函数和过程的特权可以分别授予。

    TimestampGrantor列未使用。

    proxies_priv授权表

    proxies_priv表记录有关代理帐户的信息。它具有以下列:

    • HostUser:代理帐户;也就是说,该帐户具有PROXY代理帐户的特权。
    • Proxied_hostProxied_user:代理帐户。
    • GrantorTimestamp:未使用。
    • With_grant:代理帐户是否可以将PROXY特权授予其他帐户。

    为了使一个帐户能够将PROXY特权授予其他帐户,它必须在proxies_priv表中的一行中With_grant设置为1,Proxied_hostProxied_user设置为指示可以为其授予特权的一个或多个帐户。例如,'root'@'localhost'在MySQL安装期间创建的帐户在proxies_priv表中具有一行,该行允许授予的PROXY特权''@'',即授予所有用户和所有主机的特权。这样可以root设置代理用户,以及将设置代理用户的权限委托给其他帐户。请参见“代理用户”。

    global_grants授权表

    global_grants表列出了对用户帐户的动态全局特权的当前分配。该表包含以下列:

    • USERhttp://127.0.0.1/lanmper/public:被授予特权的帐户的用户名和主机名。
    • PRIV:特权名称。
    • WITH_GRANT_OPTION:该帐户是否可以将特权授予其他帐户。

    default_roles授权表

    default_roles表列出了默认用户角色。它具有以下列:

    • http://127.0.0.1/lanmper/publicUSER:默认角色所应用的帐户或角色。
    • DEFAULT_ROLE_http://127.0.0.1/lanmper/publicDEFAULT_ROLE_USER:默认角色。

    role_edges授予表

    role_edges表列出了角色子图的边。它具有以下列:

    • FROM_http://127.0.0.1/lanmper/publicFROM_USER:被授予角色的帐户。
    • TO_http://127.0.0.1/lanmper/publicTO_USER:即授予帐户的角色。
    • WITH_ADMIN_OPTION:该帐户是否可以使用来授予其他帐户的角色并从其他帐户撤消该角色WITH ADMIN OPTION

    password_history授权表

    password_history表包含有关密码更改的信息。它具有以下列:

    • HostUser:发生密码更改的帐户。
    • Password_timestamp:更改密码的时间。
    • Password:新的密码哈希值。

    password_history表为每个帐户积累了足够数量的非空密码,以使MySQL能够针对帐户密码历史记录长度和重用间隔进行检查。尝试更改密码时,会自动修剪两个限制之外的条目。

    注意

    空密码不计入密码历史记录,并且随时可以重复使用。

    如果重命名帐户,则其条目将重命名以匹配。如果删除了帐户或更改了其身份验证插件,则会删除其条目。

    授予表范围列属性

    授权表中的范围列包含字符串。每个的默认值是空字符串。下表显示了每一列中允许的字符数。

    表6.8授予表范围列长度

    栏名允许的最大字符数
    HostProxied_host255(MySQL 8.0.17之前的60)
    UserProxied_user32
    Db64
    Table_name64
    Column_name64
    Routine_name64

    HostProxied_host值先转换为小写,然后再存储在授权表中。

    对于访问检查的目的,进行比较UserProxied_user uthentication_stringDb,和Table_name的值是大小写敏感的。的比较HostProxied_hostColumn_name,和Routine_name的值是不区分大小写。

    授予表权限列属性

    userdb表列出了被声明为一个单独的列每个特权ENUM('N','Y')DEFAULT 'N'。换句话说,可以禁用或启用每个特权,默认状态为禁用。

    tables_privcolumns_privprocs_priv表申报权限列的SET列。这些列中的值可以包含表控制的特权的任何组合。仅启用列值中列出的那些特权。

    表6.9集合类型特权列值

    表名栏名可能的设置元素
    tables_privTable_priv'Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter','Create View','Show view','Trigger'
    tables_privColumn_priv'Select','Insert','Update','References'
    columns_privColumn_priv'Select','Insert','Update','References'
    procs_privProc_priv'Execute','Alter Routine','Grant'

    只有userglobal_grants表指定管理权限,如RELOADSHUTDOWNSYSTEM_VARIABLES_ADMIN。管理操作是对服务器本身的操作,而不是特定于数据库的操作,因此没有理由在其他授权表中列出这些特权。因此,服务器仅需要查阅userglobal_grants表,以确定用户是否可以执行管理操作。

    FILE特权也仅在user表中指定。它本身不是管理特权,但是用户在服务器主机上读取或写入文件的能力与所访问的数据库无关。

    上篇:一般安全问题

    下篇:授权访问