mysql权限

6.2.1 MySQL提供的权限

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

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

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

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

有关帐户权限的信息存储在mysql系统数据库的授权表中。

 
可用权限摘要

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

表6.2 GRANT和REVOKE的允许权限

ALL [PRIVILEGES]
“ all privileges ”的同义词
ALTER
Alter_priv

ALTER ROUTINE
Alter_routine_priv存储例程

CREATE
Create_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
数据库,表或视图

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
“ no privileges ”的同义词
服务器管理

特权描述

以下列表提供了MySQL中可用的每个权限的一般说明。特定的SQL语句可能具有比此处指示的更具体的权限要求。如果是,则有关语句的描述提供了详细信息。

  • ALLALL PRIVILEGES

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

  • ALTER

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

  • ALTER ROUTINE

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

  • CREATE

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

  • CREATE ROUTINE

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

  • CREATE TABLESPACE

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

  • CREATE TEMPORARY TABLES

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

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

  • CREATE USER

    允许使用的ALTER USERCREATE USERDROP USERRENAME USER,和 REVOKE ALL PRIVILEGES语句。

  • CREATE VIEW

    允许使用该CREATE VIEW语句。

  • DELETE

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

  • DROP

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

  • EVENT

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

  • EXECUTE

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

  • FILE

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

    • 使用LOAD DATA INFILESELECT ... INTO OUTFILE语句和 LOAD_FILE()函数在服务器主机上读取和写入文件 。拥有该FILE权限的用户可以读取服务器主机上的任何文件,该文件是世界可读的或MySQL服务器可读的。(这意味着用户可以读取任何数据库目录中的任何文件,因为服务器可以访问任何这些文件。)

    • 允许在MySQL服务器具有写访问权限的任何目录中创建新文件。这包括服务器的数据目录,其中包含实现权限表的文件。

    • 从MySQL 5.7.17开始,允许对语句使用DATA DIRECTORYor INDEX DIRECTORYtable选项 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

    允许一个用户模拟或被称为另一个用户。请参见第6.3.10节“代理用户”

  • REFERENCES

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

  • RELOAD

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

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

  • REPLICATION CLIENT

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

  • REPLICATION SLAVE

    使该帐户能够请求对主服务器上的数据库进行的更新。将此权限授予从服务器用于连接到当前服务器作为其主服务器的帐户。

  • SELECT

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

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

    SELECT读取列值的其他语句也需要 该特权。例如,SELECT需要用于上的右侧引用列 col_name= expr 赋值UPDATE 语句或用于在指定的列 WHERE的条款 DELETEUPDATE语句。

    使用SELECT的表或视图需要特权 EXPLAIN,包括视图定义中的任何基础表。

  • SHOW DATABASES

    通过发出SHOW DATABASE语句使帐户能够查看数据库名称 。没有此权限的帐户只能看到具有某些权限的数据库,如果使用该--skip-show-database选项启动服务器,则根本无法使用该语句 。(任何全局特权都被视为所有数据库的特权。)

  • SHOW VIEW

    允许使用该SHOW CREATE VIEW语句。使用的视图也需要此权限EXPLAIN

  • SHUTDOWN

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

  • SUPER

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

    • 通过修改全局系统变量来启用服务器配置更改。对于某些系统变量,设置会话值也需要该 SUPER权限。如果系统变量受限制并且需要特殊权限来设置会话值,则变量说明指示该限制。实例包括 binlog_formatsql_log_bin,和 sql_log_off。另请参见 第5.1.8.1节“系统变量权限”

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

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

    • 允许使用CHANGE MASTER TOCHANGE REPLICATION FILTER语句。

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

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

    • 允许使用的CREATE SERVERALTER SERVERDROP SERVER语句。

    • 允许使用mysqladmin debug 命令。

    • 启用InnoDB加密密钥轮换。

    • 允许通过该DES_ENCRYPT()函数读取DES密钥文件 。

    • 允许执行版本标记用户定义的函数。

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

      • 允许使用 KILLstatement或 mysqladmin kill命令来终止属于其他帐户的线程。(帐户总是可以杀死自己的线程。)

      • 客户端连接init_connect时 ,服务器不执行 系统变量内容 SUPER

      • SUPER即使max_connections 达到系统变量配置的连接限制 ,服务器也会接受来自客户端的 一个连接 。

      • 处于脱机模式(已offline_mode 启用)的服务器不会SUPER在下一个客户端请求时终止 客户端连接,并接受来自SUPER客户端的新连接 。

      • 即使read_only启用了系统变量,也可以执行更新 。这适用于明确的表的更新,并使用账户管理语句如GRANTREVOKE该更新的表隐。

    SUPER 如果启用了二进制日志记录,则 可能还需要创建或更改存储函数的权限,如 第23.7节“存储程序的二进制日志记录”中所述

  • TRIGGER

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

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

  • UPDATE

    允许在数据库的表中更新行。

  • USAGE

    此权限说明符代表“ 没有特权。“它在全局级别 GRANT用于修改帐户属性,例如资源限制或SSL特征,而无需在特权列表中命名特定帐户特权。SHOW GRANTS显示 USAGE以指示帐户在特权级别没有特权。

特权授予指南

最好只向帐户授予它所需的权限。在授予FILE和管理权限时应特别小心:

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

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

  • ALTER 可用于通过重命名表来破坏权限系统。

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

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

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

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

    • 密码以加密方式存储,因此恶意用户无法简单地读取密码以了解明文密码。但是,对mysql.user系统表 authentication_string列具有写访问权限的用户 可以更改帐户的密码,然后使用该帐户连接到MySQL服务器。

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

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

    • grant表

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

      要操作授权表的内容,请使用帐户管理语句(例如CREATE USER,) 间接修改它们 GRANT,并 REVOKE设置帐户并控制每个帐户可用的权限。请参见 第13.7.1节“帐户管理语句”。此处的讨论描述了授权表的基础结构以及服务器在与客户端交互时如何使用其内容。

      注意

      使用诸如,或者 不鼓励的语句直接修改授权表 INSERT, 并且风险自负。服务器可以自由忽略由于此类修改而变得格式错误的行。 UPDATEDELETE

      从MySQL 5.7.18开始,对于修改授权表的任何操作,服务器都会检查表是否具有预期的结构,否则会产生错误。 必须运行mysql_upgrade才能将表更新为预期的结构。

      这些mysql数据库表包含授权信息:

      • user:用户帐户,全局权限和其他非权限列

      • db:数据库级权限

      • tables_priv:表级权限

      • columns_priv:列级权限

      • procs_priv:存储过程和功能权限

      • proxies_priv:代理用户权限

      每个授权表都包含范围列和特权列:

      • 范围列确定表中每行​​的范围; 也就是说,行适用的上下文。例如, user具有HostUser值的表行, '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范围列表示存储程序到各行适用。

      • 权限列指示表行授予的权限; 也就是说,它允许执行哪些操作。服务器将各种授权表中的信息组合在一起,形成用户权限的完整描述。 第6.2.5节“访问控制,第2阶段:请求验证”,描述了相关规则。

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

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

        警告

        由于任何全局特权都被视为所有数据库的特权,因此任何全局特权都允许用户使用SHOW DATABASES或查看SCHEMATA表 来查看所有数据库名称INFORMATION_SCHEMA

      • db表范围列决定哪些用户可以访问哪些数据库从哪个主机。权限列确定允许的操作。在数据库级别授予的权限适用于数据库和数据库中的所有对象,例如表和存储的程序。

      • tables_privcolumns_priv表类似于 db表,但是更精致:他们在申请表和列级应用而非在数据库级。在表级别授予的权限适用于表及其所有列。在列级别授予的权限仅适用于特定列。

      • procs_priv表适用于存储的例程(存储过程和函数)。在例程级别授予的权限仅适用于单个过程或函数。

      • proxies_priv表指示哪些用户可以充当其他用户的代理以及用户是否可以将该PROXY特权授予其他用户。

      服务器在 访问控制的第一和第二阶段使用数据库中的userdbmysql(请参见第6.2节“MySQL访问权限系统”)。这里显示了 userdb表中的列。

      表6.3用户和数据库表列

      表名
      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

      安全专栏
      ssl_type

      ssl_cipher

      x509_issuer

      x509_subject

      plugin

      authentication_string

      password_expired

      password_last_changed

      password_lifetime

      account_locked

      资源控制列
      max_questions

      max_updates

      max_connections

      max_user_connections

      userpluginauthentication_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.

      要解决此问题,请参见第6.5.1.3节“迁移远离4.1之前的密码散列和mysql_old_password插件”

      password_expired列允许DBA使帐户密码到期,并要求用户重置其密码。默认password_expired值为 'N',但可以'Y' 使用ALTER USER语句设置。帐户密码过期后,帐户在后续服务器连接中执行的所有操作都会导致错误,直到用户发出 ALTER USER声明以建立新帐户密码。

      密码过期后可以通过将密码设置为当前值来“ 重置 ”密码。作为一个好的政策,最好选择不同的密码。

      password_last_changed是一个 TIMESTAMP列,指示上次更改密码的时间。该值NULL不仅适用于使用MySQL内置身份验证方法的帐户(使用mysql_native_password或 使用身份验证插件的帐户 sha256_password)。该值适用 NULL于其他帐户,例如使用外部身份验证系统进行身份验证的帐户。

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

      password_lifetime表示帐户密码的有效期,以天为单位。如果密码超过其生命周期(使用password_last_changed 列评估),则服务器会在客户端使用该帐户连接时认为密码已过期。值N 大于零意味着必须每天更改密码 N。值为0将禁用自动密码到期。如果值为NULL(缺省值),则应用全局过期策略,如default_password_lifetime系统变量所定义 。

      account_locked指示帐户是否已锁定(请参见第6.3.11节“用户帐户锁定”)。

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

      表6.4 tables_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

      TimestampGrantor 列被设置为当前时间戳和 CURRENT_USER值,分别,但其他未使用的。

      为了验证涉及存储例程的请求,服务器可以查询该procs_priv表,该表具有下表中显示的列。

      表6.5 procs_priv表列

      表名
      procs_priv

      范围列
      Host

      Db

      User

      Routine_name

      Routine_type

      权限列
      Proc_priv

      其他专栏
      Timestamp

      Grantor

      Routine_type列是一个ENUM值为'FUNCTION'或的 列, 'PROCEDURE'表示行引用的例程类型。此列允许为具有相同名称的函数和过程单独授予权限。

      TimestampGrantor 列未使用。

      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设置代理用户,以及委托其他帐户设置代理用户的权限。请参见第6.3.10节“代理用户”

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

      表6.6授权表范围列长度

      列名称
      允许的最大字符数

      HostProxied_host
      60

      UserProxied_user
      32

      Password
      41

      Db
      64

      Table_name
      64

      Column_name
      64

      Routine_name
      64

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

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

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

      表6.7 Set-Type权限列值

      image

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

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

      服务器在启动时将授权表的内容读入内存。您可以通过发出FLUSH PRIVILEGES语句或执行mysqladmin flush-privilegesmysqladmin reload命令来告诉它重新加载表 。对授权表的更改将在第6.2.6节“特权更改生效时”中指示生效 。

      修改帐户时,最好验证您的更改是否具有预期效果。要检查给定帐户的权限,请使用该SHOW GRANTS 语句。例如,要确定与用户名和主机名值授予一个帐户的权限 bobpc84.example.com使用下面的语句:

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

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

      SHOW CREATE USER 'bob'@'pc84.example.com';
posted @ 2018-11-20 11:32  lzc的精神家园  阅读(297)  评论(0)    收藏  举报