授予表
MySQL 服务器在启动时将 mysql 数据库中的授权表读取到内存中,并根据这些表做出所有访问控制决策。
表对应于权限级别:
Privilege Level/ Table | Contents and Privileges |
---|---|
user | Contains a record for each account known to the server |
db | Database-specific privileges |
tables_priv | Table-specific privileges |
columns_priv | Column-specific privileges |
procs_priv | Stored procedures and functions privileges |
用户表包含服务器已知的每个帐户的记录,以及它的全局权限。
它还指示有关帐户的其他信息,例如:
- 它所受的任何资源限制
- 使用该帐户的客户端连接是否必须通过使用 SSL 的安全连接进行
每个账户必须有一个用户表记录;服务器通过读取该表的内容来确定是接受还是拒绝每个连接尝试。
如果每个帐户在全局级别以外的级别拥有权限,则它在其他授权表中也有记录。
撤销账户权限
使用 REVOKE 语句撤销特定的 SQL 语句权限:
REVOKE DELETE, INSERT, UPDATE ON world_innodb.* FROM 'Amon'@'localhost';
使用 REVOKE 语句撤销帐户的权限。
我们可以出于各种原因选择撤销权限,例如减少用户所需的访问权限。
REVOKE 语句的语法具有以下子句:
- REVOKE 关键字:指定要撤销的权限列表。
- ON 子句:指示要撤销权限的级别。
- FROM 子句:指定帐户名。
上面显示的示例,假设 Amon 对 world_innodb 数据库具有 SELECT、DELETE、INSERT 和 UPDATE 权限,但我们想更改帐户以便他只有 SELECT 访问权限。
第一个示例撤销使他能够进行更改的特权。
要撤消向其他用户授予权限的权限:
REVOKE GRANT OPTION ON world_innodb.* FROM 'Jan'@'localhost';
上面的示例通过撤销 Jan 帐户的 GRANT OPTION 权限,撤销了 Jan 向其他用户授予他对 world_innodb 数据库的任何权限的能力。
撤销所有权限,包括授予他人权限:
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'Sasha'@'localhost';
上面的示例通过从她的帐户中撤消所有特权和 GRANT OPTION 来撤消 Sasha 帐户(在任何级别)拥有的所有权限。
MySQL 授权系统的主要功能是将经过身份验证的用户与数据库上的权限相关联,例如 SELECT、INSERT、UPDATE 和 DELETE。
授权系统的功能包括拥有匿名用户和启用特定功能(如 LOAD DATA INFILE 和各种管理操作)的能力。
此授权可确保用户只能执行已被授予适当权限的操作。
授予管理权限
以下全局权限适用于管理用户:
- FILE :允许用户指示 MySQL 服务器在服务器主机文件系统中读写文件。
- PROCESS :允许用户使用 SHOW PROCESSLIST 语句查看客户端正在执行的所有语句。
- SUPER :允许用户终止其他客户端连接或者更改服务器的运行时配置。
- ALL :授予所有权限,但不能向其他用户授予权限。
SUPER 管理权限使用户能够执行其他任务,包括设置全局变量和终止客户端连接。
还有一些特殊权限说明符:
使用 ALL 和 ALL PRIVILEGES 授予所有权限,但不能授予其他帐户权限。
使用 GRANT ALL ... WITH GRANT OPTION 授予所有权限,包括向其他帐户授予权限的能力。
使用 USAGE 授予连接到服务器的能力。
此权限会在用户表中为帐户创建一条记录,但没有任何权限。
然后,该帐户可用于出于有限目的访问服务器,例如发出 SHOW VARIABLES 或者 SHOW STATUS 语句。
该帐户不能用于访问诸如表之类的数据库内容,尽管可以稍后授予此类权限。
其他管理权限包括 CREATE USER 、 CREATE TEMPORARY TABLES 、 SHOW DATABASES 、 LOCK TABLES 、 RELOAD 和 SHUTDOWN 。
管理权限(包括幻灯片中的权限)可用于破坏安全性、访问特权数据或者对服务器执行拒绝服务攻击。
谨慎授予管理权限,因为它们可能会被恶意或者粗心的用户滥用。
显示 GRANT 权限
SHOW GRANTS 显示为指定用户重新创建权限的语句。
它仅显示语句中指定的确切帐户的权限。
下面的示例仅显示 kari@myhost.example.com 的权限,而不显示 kari@% 的权限。
SHOW GRANTS; SHOW GRANTS FOR CURRENT_USER();
我们还可以指定一个帐户名称来显示以下项目的赠款:
mysql>SHOW GRANTS FOR 'kari'@'myhost.example.com'; +----------------------------------------------------------------+ | Grants for kari@myhost.example.com | +----------------------------------------------------------------+ | GRANT FILE ON *.* TO 'kari'@'myhost.example.com' | | GRANT SELECT ON `world_innodb`.* TO 'kari'@'myhost.example.com‘| | IDENTIFIED BY PASSWORD | | '*E74858DB86EBA20BC33D0AECAE8A8108C56B17FA' | +----------------------------------------------------------------+
上面显示的输出由两个 GRANT 语句组成。
它们的 ON 子句分别显示全局和数据库级别的权限。
如果帐户有密码,则 SHOW GRANTS 在 GRANT 语句的末尾显示 IDENTIFIED BY PASSWORD 子句;该子句列出了帐户的全局权限。
IDENTIFIED BY 后面的 PASSWORD 表示显示的密码值是存储在用户表中的加密值,而不是实际密码。
因为密码是使用单向加密存储的,MySQL 无法显示未加密的密码。
如果该帐户可以将其部分或者全部权限授予其他帐户,则输出会在它适用的每个 GRANT 语句的末尾显示 WITH GRANT OPTION。
用户权限限制
我们不能明确拒绝对特定用户的访问。
我们不能将密码与特定对象(例如数据库、表或者例程)相关联。
授权声明
GRANT 语句创建新帐户或者修改现有帐户。
授予语法:
GRANT SELECT ON world_innodb.* TO 'kari'@'localhost' IDENTIFIED BY 'Abc123';
在上面的语法/示例中,该语句将 world_innodb 数据库中所有表的 SELECT 权限授予名为 kari 的用户,该用户必须从本地主机连接并使用密码 Abc123.
声明条款:
- 授予的特权
- 权限级别:
- 全球的: 。
- 数据库:[db_name].*
- 表:[db_name].[table_name]
- 存储的例程:[db_name].[routine_name]
我们授予权限的帐户。
可选密码。
GRANT 语句的子句具有以下作用:
- GRANT 关键字:指定一个或者多个权限名称,指示我们授予哪些权限。权限名称不区分大小写。要列出多个权限,请用逗号分隔它们。
- ON 子句:指定我们授予的权限级别。
- TO 子句:指定我们要授予权限的帐户。如果该帐户尚不存在,则该语句会创建它。
- IDENTIFIED BY 子句:(可选)为帐户分配指定的密码。如果该帐户已存在,则密码将替换任何旧的。
省略 IDENTIFIED BY 子句具有以下效果:
- 如果 TO 子句中的帐户存在,则其密码保持不变。
- 如果 TO 子句中的帐户不存在,则使用空白密码创建它。
作为安全措施,当我们未指定 IDENTIFIED BY 子句时,启用 NO_AUTO_CREATE_USER SQL 模式以防止 GRANT 语句创建新帐户。
确定适当的用户权限
我们可以在不同级别向 MySQL 帐户授予多种类型的权限:全局或者特定数据库、表或者列。
例如,我们可以通过授予用户全局级别的 SELECT 权限,使用户能够从任何数据库中的任何表中进行选择。
我们可以让帐户完全控制特定数据库,而无需对其他数据库拥有任何权限。
然后,该帐户可以创建数据库、创建表和其他数据库对象、从表中进行选择以及添加、删除或者更新新记录。
影响权限更改
服务器在其启动序列期间将授权表读取到内存中,并使用内存中的副本来检查客户端访问。
服务器在以下条件下刷新其内存中的授权表副本:
- 我们可以通过发出帐户管理语句(例如 CREATE USER、GRANT、REVOKE 或者 SET PASSWORD)来修改用户帐户。
- 我们可以通过发出 FLUSH PRIVILEGES 语句或者执行 mysqladmin flush-privileges 或者 mysqladmin reload 命令来显式地重新加载表。
避免直接更改授权表,原因如下:
- 帐户管理报表的语法旨在清晰明了。
- 如果我们在帐户管理报表中出错,该报表将失败并且不会更改任何设置。
- 如果直接更改授权表时出错,则可以将所有用户锁定在系统之外。
何时应用更改
- 对全局权限和密码的更改仅适用于该帐户的后续连接。
- 在客户端的下一个 USE db_name 语句之后应用对数据库级权限的更改。
- 对表和例行权限的更改会立即生效。
授权表的使用
服务器根据用户表的主机、用户和密码列确定客户端是否可以连接。
要成功连接,MySQL 必须将用户表中的记录与客户端连接的主机、客户端提供的用户名以及匹配记录中列出的密码进行匹配。
客户端连接后,MySQL 通过将帐户的身份与权限表的 Host 和 User 列进行匹配来检查每个语句的访问权限。
- 用户表每一行中的权限全局应用于由其主机和用户列标识的帐户。
- db、tables_priv、columns_priv 和 procs_priv 表的匹配记录中的权限适用于由特定权限表的名称标识的级别。
例如,db 表记录中的权限适用于记录中命名的数据库,但不适用于其他数据库。
MySQL 安装过程会创建授权表。
- 授予表使用 MyISAM 存储引擎。
- MyISAM 保证可用。