mysql权限
6.2.1 MySQL提供的权限
授予MySQL帐户的权限决定了帐户可以执行的操作。MySQL权限在它们适用的上下文和不同操作级别上有所不同:
-
管理权限使用户能够管理MySQL服务器的操作。这些权限是全局的,因为它们不是特定于特定数据库的。
-
数据库权限适用于数据库及其中的所有对象。可以为特定数据库或全局授予这些权限,以便它们适用于所有数据库。
-
可以为数据库中的特定对象,数据库中给定类型的所有对象(例如,数据库中的所有表)或全局的所有对象授予数据库对象(如表,索引,视图和存储例程)的权限。所有数据库中给定类型的对象。
有关帐户权限的信息存储在mysql系统数据库的授权表中。
可用权限摘要
下表显示了GRANT和 REVOKE语句中使用的权限名称 ,以及与权限表中的每个权限关联的列名以及权限适用的上下文。
表6.2 GRANT和REVOKE的允许权限
ALL [PRIVILEGES]
“ all privileges ”的同义词ALTERAlter_priv表
ALTER ROUTINEAlter_routine_priv存储例程
CREATECreate_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
数据库,表或视图
EVENTEvent_priv
数据库
EXECUTEExecute_priv
存储例程
FILEFile_priv
服务器主机上的文件访问
GRANT OPTIONGrant_priv
数据库,表或存储例程
INDEXIndex_priv
表
INSERTInsert_priv
表或列
LOCK TABLESLock_tables_priv
数据库
PROCESSProcess_priv
服务器管理
PROXY
请参阅proxies_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
“ no privileges ”的同义词
服务器管理
特权描述
以下列表提供了MySQL中可用的每个权限的一般说明。特定的SQL语句可能具有比此处指示的更具体的权限要求。如果是,则有关语句的描述提供了详细信息。
-
这些权限说明符的简写“ 可在给定的权限级别的所有权限 ” (除
GRANT OPTION)。例如,ALL在全局或表级别授予分别授予所有全局特权或所有表级特权。 -
允许使用该
ALTER TABLE语句来更改表的结构。ALTER TABLE还需要CREATE和INSERT特权。重命名表需要ALTER和DROP对旧表,CREATE以及INSERT对新表。 -
允许使用更改或删除存储例程(存储过程和函数)的语句。
-
允许使用创建新数据库和表的语句。
-
允许使用创建存储例程(存储过程和函数)的语句。
-
允许使用创建,更改或删除表空间和日志文件组的语句。
-
允许使用该
CREATE TEMPORARY TABLE语句创建临时表 。会话创建临时表后,服务器不会对表执行进一步的权限检查。所述创建会话可以在桌子上进行任何操作,例如
DROP TABLE,INSERT,UPDATE,或SELECT。有关更多信息,请参见第13.1.18.3节“CREATE TEMPORARY TABLE语法”。 -
允许使用的
ALTER USER,CREATE USER,DROP USER,RENAME USER,和REVOKE ALL PRIVILEGES语句。 -
允许使用该
CREATE VIEW语句。 -
允许从数据库中的表中删除行。
-
允许使用删除(删除)现有数据库,表和视图的语句。 在分区表上
DROP使用该ALTER TABLE ... DROP PARTITION语句需要该 特权。该DROP也需要特权TRUNCATE TABLE。 -
允许使用为事件调度程序创建,更改,删除或显示事件的语句。
-
允许使用执行存储例程(存储过程和函数)的语句。
-
影响以下操作和服务器行为:
-
使用
LOAD DATA INFILE和SELECT ... INTO OUTFILE语句和LOAD_FILE()函数在服务器主机上读取和写入文件 。拥有该FILE权限的用户可以读取服务器主机上的任何文件,该文件是世界可读的或MySQL服务器可读的。(这意味着用户可以读取任何数据库目录中的任何文件,因为服务器可以访问任何这些文件。) -
允许在MySQL服务器具有写访问权限的任何目录中创建新文件。这包括服务器的数据目录,其中包含实现权限表的文件。
-
从MySQL 5.7.17开始,允许对语句使用
DATA DIRECTORYorINDEX DIRECTORYtable选项CREATE TABLE。
作为安全措施,服务器不会覆盖现有文件。
要限制可以读取和写入文件的位置,请将
secure_file_priv系统变量设置为特定目录。 -
-
允许您向其他用户授予或撤消您自己拥有的权限。
-
允许使用创建或删除(删除)索引的语句。
INDEX适用于现有表格。如果您拥有CREATE表的 权限,则可以在CREATE TABLE语句中包含索引定义 。 -
允许将行插入数据库中的表。
INSERT还需要对ANALYZE TABLE,OPTIMIZE TABLE和REPAIR TABLE表维护语句。 -
允许使用显式
LOCK TABLES语句来锁定您具有该SELECT权限的表。这包括使用写锁定,这可以防止其他会话读取锁定的表。 -
允许显示有关服务器内执行的线程的信息(即有关会话正在执行的语句的信息)。该权限允许使用
SHOW PROCESSLIST或 mysqladmin进程列表来查看属于其他帐户的线程; 你总能看到自己的线程。该PROCESS权限还可以使用SHOW ENGINE。 -
允许一个用户模拟或被称为另一个用户。请参见第6.3.10节“代理用户”。
-
创建外键约束需要
REFERENCES父表的 特权。 -
允许使用该
FLUSH语句。这也使中mysqladmin 等效于命令FLUSH操作:flush-hosts,flush-logs,flush-privileges,flush-status,flush-tables,flush-threads,refresh,和reload。该
reload命令告诉服务器将授权表重新加载到内存中。flush-privileges是...的同义词reload。该refresh命令将关闭并重新打开日志文件并刷新所有表。其他 命令执行类似但更具体的功能 ,并且在某些情况下可能是优选的。例如,如果要仅刷新日志文件,则是比较好的选择。flush-xxxrefreshflush-logsrefresh -
允许使用的
SHOW MASTER STATUS,SHOW SLAVE STATUS和SHOW BINARY LOGS语句。将此权限授予从服务器用于连接到当前服务器作为其主服务器的帐户。 -
使该帐户能够请求对主服务器上的数据库进行的更新。将此权限授予从服务器用于连接到当前服务器作为其主服务器的帐户。
-
允许从数据库中的表中选择行。 只有在实际访问表时,
SELECT语句才需要该SELECT权限。某些SELECT语句不访问表,并且可以在未经许可的情况下执行任何数据库。例如,您可以使用SELECT简单的计算器来计算不引用表的表达式:SELECT 1+1; SELECT PI()*2;SELECT读取列值的其他语句也需要 该特权。例如,SELECT需要用于上的右侧引用列col_name=expr赋值UPDATE语句或用于在指定的列WHERE的条款DELETE或UPDATE语句。 -
通过发出
SHOW DATABASE语句使帐户能够查看数据库名称 。没有此权限的帐户只能看到具有某些权限的数据库,如果使用该--skip-show-database选项启动服务器,则根本无法使用该语句 。(任何全局特权都被视为所有数据库的特权。) -
允许使用该
SHOW CREATE VIEW语句。使用的视图也需要此权限EXPLAIN。 -
允许使用
SHUTDOWN语句,mysqladmin shutdown 命令和mysql_shutdown()C API函数。 -
影响以下操作和服务器行为:
-
通过修改全局系统变量来启用服务器配置更改。对于某些系统变量,设置会话值也需要该
SUPER权限。如果系统变量受限制并且需要特殊权限来设置会话值,则变量说明指示该限制。实例包括binlog_format,sql_log_bin,和sql_log_off。另请参见 第5.1.8.1节“系统变量权限”。 -
启用对全局事务特征的更改(请参见第13.3.6节“SET TRANSACTION语法”)。
-
使帐户能够启动和停止复制,包括组复制。
-
通过
PURGE BINARY LOGS和BINLOG语句启用二进制日志控制 。 -
允许在执行视图或存储程序时设置有效的授权ID。具有此权限的用户可以在
DEFINER视图或存储程序的属性中指定任何帐户 。 -
允许使用的
CREATE SERVER,ALTER SERVER和DROP SERVER语句。 -
允许使用mysqladmin debug 命令。
-
启用
InnoDB加密密钥轮换。 -
允许通过该
DES_ENCRYPT()函数读取DES密钥文件 。 -
允许执行版本标记用户定义的函数。
-
允许控制不允许非
SUPER帐户的客户端连接:-
允许使用
KILLstatement或 mysqladmin kill命令来终止属于其他帐户的线程。(帐户总是可以杀死自己的线程。) -
客户端连接
init_connect时 ,服务器不执行 系统变量内容SUPER。 -
SUPER即使max_connections达到系统变量配置的连接限制 ,服务器也会接受来自客户端的 一个连接 。 -
处于脱机模式(已
offline_mode启用)的服务器不会SUPER在下一个客户端请求时终止 客户端连接,并接受来自SUPER客户端的新连接 。 -
即使
read_only启用了系统变量,也可以执行更新 。这适用于明确的表的更新,并使用账户管理语句如GRANT与REVOKE该更新的表隐。
-
SUPER如果启用了二进制日志记录,则 可能还需要创建或更改存储函数的权限,如 第23.7节“存储程序的二进制日志记录”中所述。 -
-
启用触发器操作。您必须拥有此表的权限才能创建,删除,执行或显示该表的触发器。
当触发器被激活(由谁拥有特权执行用户
INSERT,UPDATE或DELETE与触发器关联的表的语句),触发器执行要求谁定义触发器的用户仍然有TRIGGER对表的特权。 -
允许在数据库的表中更新行。
-
此权限说明符代表“ 没有特权。“它在全局级别
GRANT用于修改帐户属性,例如资源限制或SSL特征,而无需在特权列表中命名特定帐户特权。SHOW GRANTS显示USAGE以指示帐户在特权级别没有特权。
特权授予指南
最好只向帐户授予它所需的权限。在授予FILE和管理权限时应特别小心:
-
FILE可以滥用MySQL服务器可以在服务器主机上读取的任何文件来读入数据库表。这包括服务器数据目录中的所有世界可读文件和文件。然后可以使用该表SELECT将其内容传输到客户端主机来访问该表 。 -
GRANT OPTION使用户能够将其权限授予其他用户。具有不同权限和权限的两个用户GRANT OPTION可以组合权限。 -
ALTER可用于通过重命名表来破坏权限系统。 -
SHUTDOWN可以滥用通过终止服务器完全拒绝向其他用户提供服务。 -
PROCESS可用于查看当前正在执行的语句的纯文本,包括设置或更改密码的语句。 -
SUPER可用于终止其他会话或更改服务器的运行方式。 -
为
mysql系统数据库本身授予的权限可用于更改密码和其他访问权限信息:-
密码以加密方式存储,因此恶意用户无法简单地读取密码以了解明文密码。但是,对
mysql.user系统表authentication_string列具有写访问权限的用户 可以更改帐户的密码,然后使用该帐户连接到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具有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范围列表示存储程序到各行适用。 -
权限列指示表行授予的权限; 也就是说,它允许执行哪些操作。服务器将各种授权表中的信息组合在一起,形成用户权限的完整描述。 第6.2.5节“访问控制,第2阶段:请求验证”,描述了相关规则。
服务器以下列方式使用授权表:
-
的
user表范围列确定是否拒绝或允许传入连接。对于允许的连接,user表中授予的任何权限都 表示用户的全局权限。此表中授予的任何权限都适用于 服务器上的所有数据库。警告
由于任何全局特权都被视为所有数据库的特权,因此任何全局特权都允许用户使用
SHOW DATABASES或查看SCHEMATA表 来查看所有数据库名称INFORMATION_SCHEMA。 -
该
db表范围列决定哪些用户可以访问哪些数据库从哪个主机。权限列确定允许的操作。在数据库级别授予的权限适用于数据库和数据库中的所有对象,例如表和存储的程序。 -
在
tables_priv与columns_priv表类似于db表,但是更精致:他们在申请表和列级应用而非在数据库级。在表级别授予的权限适用于表及其所有列。在列级别授予的权限仅适用于特定列。 -
该
procs_priv表适用于存储的例程(存储过程和函数)。在例程级别授予的权限仅适用于单个过程或函数。 -
该
proxies_priv表指示哪些用户可以充当其他用户的代理以及用户是否可以将该PROXY特权授予其他用户。
服务器在 访问控制的第一和第二阶段使用数据库中的
user和db表mysql(请参见第6.2节“MySQL访问权限系统”)。这里显示了user和db表中的列。表6.3用户和数据库表列
表名
userdb范围列
HostHostUserDbUser权限列
Select_privSelect_privInsert_privInsert_privUpdate_privUpdate_privDelete_privDelete_privIndex_privIndex_privAlter_privAlter_privCreate_privCreate_privDrop_privDrop_privGrant_privGrant_privCreate_view_privCreate_view_privShow_view_privShow_view_privCreate_routine_privCreate_routine_privAlter_routine_privAlter_routine_privExecute_privExecute_privTrigger_privTrigger_privEvent_privEvent_privCreate_tmp_table_privCreate_tmp_table_privLock_tables_privLock_tables_privReferences_privReferences_privReload_privShutdown_privProcess_privFile_privShow_db_privSuper_privRepl_slave_privRepl_client_privCreate_user_privCreate_tablespace_priv安全专栏
ssl_typessl_cipherx509_issuerx509_subjectpluginauthentication_stringpassword_expiredpassword_last_changedpassword_lifetimeaccount_locked资源控制列
max_questionsmax_updatesmax_connectionsmax_user_connections该
user表plugin和authentication_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 USER,ALTER USER和SET PASSWORD报表,并通过GRANT创造一个帐户或更改帐户密码的语句。password_lifetime表示帐户密码的有效期,以天为单位。如果密码超过其生命周期(使用password_last_changed列评估),则服务器会在客户端使用该帐户连接时认为密码已过期。值N大于零意味着必须每天更改密码N。值为0将禁用自动密码到期。如果值为NULL(缺省值),则应用全局过期策略,如default_password_lifetime系统变量所定义 。account_locked指示帐户是否已锁定(请参见第6.3.11节“用户帐户锁定”)。在访问控制的第二阶段,服务器执行请求验证以确保每个客户端对其发出的每个请求具有足够的权限。除了
user和dbgrant表之外,服务器还可以查询表tables_priv和columns_priv涉及表的请求。后面的表在表级和列级提供更好的权限控制。它们具有下表中显示的列。表6.4 tables_priv和columns_priv表列
表名
tables_privcolumns_priv范围列
HostHostDbDbUserUserTable_nameTable_nameColumn_name权限列
Table_privColumn_privColumn_priv其他专栏
TimestampTimestampGrantor的
Timestamp和Grantor列被设置为当前时间戳和CURRENT_USER值,分别,但其他未使用的。为了验证涉及存储例程的请求,服务器可以查询该
procs_priv表,该表具有下表中显示的列。表6.5 procs_priv表列
表名
procs_priv范围列
HostDbUserRoutine_nameRoutine_type权限列
Proc_priv其他专栏
TimestampGrantor该
Routine_type列是一个ENUM值为'FUNCTION'或的 列,'PROCEDURE'表示行引用的例程类型。此列允许为具有相同名称的函数和过程单独授予权限。在
Timestamp与Grantor列未使用。该
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设置代理用户,以及委托其他帐户设置代理用户的权限。请参见第6.3.10节“代理用户”。授权表中的范围列包含字符串。每个的默认值是空字符串。下表显示了每列中允许的字符数。
表6.6授权表范围列长度
列名称
允许的最大字符数Host,Proxied_host
60User,Proxied_user
32Password
41Db
64Table_name
64Column_name
64Routine_name
64对于访问检查的目的,进行比较
User,Proxied_user,Password,authentication_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.7 Set-Type权限列值
-
-
只有
user表指定管理权限,例如RELOAD和SHUTDOWN。管理操作是服务器本身的操作,不是特定于数据库的,因此没有理由在其他授权表中列出这些特权。因此,服务器只需要查阅user表以确定用户是否可以执行管理操作。该
FILE权限也仅在user表中指定。它本身不是管理权限,但用户在服务器主机上读取或写入文件的能力与所访问的数据库无关。服务器在启动时将授权表的内容读入内存。您可以通过发出
FLUSH PRIVILEGES语句或执行mysqladmin flush-privileges或 mysqladmin reload命令来告诉它重新加载表 。对授权表的更改将在第6.2.6节“特权更改生效时”中指示生效 。修改帐户时,最好验证您的更改是否具有预期效果。要检查给定帐户的权限,请使用该
SHOW GRANTS语句。例如,要确定与用户名和主机名值授予一个帐户的权限bob和pc84.example.com使用下面的语句:SHOW GRANTS FOR 'bob'@'pc84.example.com';要显示帐户的非特权属性,请使用
SHOW CREATE USER:SHOW CREATE USER 'bob'@'pc84.example.com';
-

浙公网安备 33010602011771号