15.3 权限管理
权限管理主要是对登录到数据库的用户进行权限验证。所有用户的权限都存储在MySQL的权限表中。数据库管理员要对权限进行管理。合理的权限管理能够保证数据库 系统的安全,不合理的权限设置可能会给数据库系统带来意想不到的危害。本节将为读者介绍权限管理的内容。
15.3.1 MySQL的各种权限
MySQL数据库中有很多种类的权限,这些权限都存储在mysql数据库下的权限表屮。 其中,user表中的权限种类最多。本小节将为读者介绍MySQL中的各种权限。
下表列出了MySQL的各种权限、user表中对应的列和权限的对象等信息。
权限名称 | 对应user表中的列 | 权限的范围 |
---|---|---|
CREATE | Create_priv | 数据库、表或索引 |
DROP | Drop_priv | 数据库或表 |
GRANT OPTION | Grant_priv | 数据库、表、存储过程或函数 |
REFERENCES | References_priv | 数据库或表 |
ALTER | Alter_priv | 修改表 |
DELETE | DeIete_priv | 删除表 |
INDEX | Index_priv | 用索引查询表 |
INSERT | Insert_priv | 插入表 |
SELECT | Select_priv | 查询表 |
UPDATE | Update_priv | 更新表 |
CREATE VIEW | Create_view_priv | 创建视图 |
SHOW ViEW | Show_view_priv | 查看视图 |
ALTER ROUTINE | Alter_routine_priv | 修改存储过程或存储函数 |
CREATE ROUTINE | Create_routine_priv | 创建存储过程或存储函数 |
EXECUTE | Execute_priv | 执行存储过程或存储函数 |
EXECUTE | Execute_priv | 执行存储过程或存储函数 |
FILE | File_priv | 加载服务器主机上的文件 |
CREATE TEMPORARY TABLES | Create_tmp_table_priv | 创建临时表 |
LOCK TABLES | Lock_tables_priv | 锁定表 |
CREATE USER | Create_user_priv | 创建用户 |
PROCESS | Process_priv | 服务器管理 |
RELOAD | Reload_priv | 重新加载权限表 |
REPLICATION CLIENT | Repl_client_priv | 服务器管理 |
REPLICATION SLAVE | Repl_slave_priv | 服务器管理 |
SHOW DATABASES | Show_db_priv | 查看数据库 |
SHUTDOWN | Shutdown_priv | 关闭服务器 |
SUPER | SUPER_priv | 超级权限 |
上表中对user表中的各个字段及权限进行了介绍。通过权限设置,用户可以拥有不同的权限。拥有GRANT权限的用户可以为其用户设置权限。REVOKE权限的用户可以收回自己设置的权限。合理的设置权限能够保证MySQL数据库的安全。
15.3.2 授权
授权就是为某个用户赋予某些权限。例如,可以为新建的用户赋予查询所有数据库和 表的权限。合理的授权能够保证数据库的安全。不合理的授权会使数据库存在安全隐患。 MySQL中使用GRANT关键字来为用户设置权限。本小节将为读者介绍授权的方法。
MySQL中,必须拥有GRANT权限的用户才可以执行GRANT语句。GRANT语句的基本语法如下:
GRANT priv_type [(column_list)] ON database.table TO user [ IDENTIFIED BY [PASSWORD] 'password'] [,user [ IDENTIFIED BY [PASSWORD] 'password']]... with_option [with_option] ...]
其中,priv_type参数表示权限的类型;column_list参数表示权限作用于哪些列上,没有该参数时作用于整个表上;user参数由用户名和主机名构成,形式是“'username'@ ’hostname'”;IDENTIFIED BY参数用来为用户设置密码;password参数是用户的新密码。
WITH关键字后面带有一个或多个with_option参数。这个参数有5个选项,详细介绍如下:
-
GRANT OPTION:被授权的用户可以将这些权限赋予给别的用户;
-
MAX_QUERIES_PER_HOURcount:设置每个小时可以允许执行count次查询;
-
MAX_UPDATES_PER_HOUR count:设置每个小时可以允许执行count次更新;
-
MAX CONNECTIONS_PER HOURcount:设置每小时可以建立count连接;
-
MAX_USER_CONNECTIONS count:设置单个用户可以同时具有的count个连接数。
【示例15-17】下面使用GRANT命令来创建一个新的用户'test5'。'test5'对所有数据库有SELECT和UPDATE的权限。密码设置为'test5',而且加上WITH GRANT OPTION子句。GRANT语句的代码如下:
GRANT SELECT, UPDATE ON *.* TO 'test5'@'localhost' IDENTIFIED BY 'test5' WITH GRANT OPTION;
这些代码执行结果如下:
mysql> GRANT SELECT, UPDATE ON *.* -> TO 'test5'@'localhost' IDENTIFIED BY 'test5' -> WITH GRANT OPTION ; Query OK, 0 rows affected (0.00 sec)
结果显示,GRANT语句执行成功。可以使用SELECT语句来查询user表,以查看test5用户的信息。SELECT语句执行结果如下:
mysql> SELECT Host,User,Password,Select_priv,Update_priv,Grant_priv FROM user WHERE user='test5'\G ****************************1.row*************************** Host: localhost User test5 Password: *30B3620A8C3D75549E8B7F077424EF88B6C798E6 Se!ect_priv: Y Update_priv: Y Grant_priv: Y 1 row in set (0.00 sec)
查询结果显示,User值为test5;Select_priv,Update_priv和Grant_priv的值为Y;Password值为加密后的值。
【示例15-18】下面使用test5用户登录,然后GRANT命令来为用户test3设置权限。设置test6用户对mysql数据库有SELECT权限。GRANT语句的代码如下:
GRANT SELECT ON mysql.* TO 'test3'@'localhost';
这些代码执行结果如下:
mysql> GRANT SELECT ON mysql.* -> TO 'test3'@'localhost'; Query OK, 0 rows affected (0.00 sec)
结果显示,GRANT语句执行成功。使用SELECT语句查看test3用户的信息。SELECT语句执行结果如下:
mysql> SELECT Host,User,Password,Select_priv FROM mysql.user WHERE user='test3' \G *********************************1.row************************ Host: localhost User: test3 Password: *A8BE55A78C83239B88A218DEE9C26D1A6A137A51 Select_priv: Y 1 row in set (0.00 sec)
查询结果显示,User值为test3; Select_priv的值为Y。这说明test5用户可以将自己的权限赋给别的用户。原因是WITH GRANT OPTION子句可以使test5用户具有GRANT权 限。test5用户可以使用GRANT语句将自己的权限授权给别的用户。
15.3.3收回权限
收回权限就是取消某个用户的某些权限。例如,如果数据库管理员觉得某个用户不应该拥有DELETE权限,那么就可以将DELETE权限收回。收回权限的方式可以保证数据库的安全。MySQL中使用REVOKE关键字来为用户设置权限。收回指定权限的REVOKE语句的基本语法如下:
REVOKE priv_type [(column_list)]... ON database.table FROM user [,user]...
REVOKE语句中的参数与GRANT语句的参数意思相同。其中,priv_type参数表示权限的类型;column_list参数表示权限作用于哪些列上,没有该参数时作用于整个表上;user参数由用户名和主机名构成,形式是“’usemame’@'hostname’”。 收回全部权限的REVOKE语句的基本语法如下:
REVOKE ALL PRIVILEGES, GRANT OPTION FROM user [, user]...
【示例15-19】下面收回test5用户的UPDATE权限。REVOKE语句的代码如下:
REVOKE UPDATE ON *.* FROM 'test5'@'localhost';
这些代码执行结果如下:
mysql> REVOKE UPDATE ON *.* ->FROM 'test5'@'localhost'; Query OK, 0 rows affected (0.00 sec)
结果显示,REVOKE语句执行成功。使用SELECT语句查看test5用户的UPDATE权 限。SELECT语句执行结果如下:
mysql> SELECT Host,User,Password,Update_priv FROM mysql.user WHERE user='test5' \G *************************1.row********************* Host: localhost User: test5 Password: *30B3620A8C3D75549E8B7F077424EF88B6C798E6 Update_priv: N 1 row in set (0.00 sec)
查询结果显示,Update_priv的值为N。
【示例15-20】下面收回test5用户的所有权限。REVOKE语句的代码如下:
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'test5'@'localhost';
这些代码执行结果如下:
mysql> REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'test5'@'localhost'; Query OK, 0 rows affected (0.06 sec)
结果显示,REVOKE语句执行成功。使用SELECT语句查看test4用户的SELECT权限、UPDATE权限和GRANT权限。SELECT语句执行结果如下:
mysql> SELECT Host,User,Password,Select_priv,Update_priv,Grant_priv -> FROM mysql.user WHERE user='test5' \G ****************1.row************************* Host: localhost User: test5 Password: *30B3620A8C3D75549E8B7F077424EF88B6C798E6 Select_priv: N Update_priv: N Grant_priv: N 1 row in set (0.00 sec)
结果显示,Select_priv,Updatejpriv和Grant_priv的值都为N。
技巧:数据库管理员给普通用户授权时一定要特别小心,如果授权不当,可能会给数据库带来致命的破坏。一旦发现给用户的授权太多,应该尽快使用REVOKE语句将权限收回。此处特别注意,最好不要授予普通用户SUPER权限、GRANT权限。
15.3.4 查看权限
在MySQL中,可以使用SELECT语句来查询user表中各用户的权限,也可以直接使用SHOW GRANTS语句来查看权限。mysql数据库下的user表中存储着用户的基本权限,可以使用SELECT语句来查看。SELECT语句的代码如下:
SELECT * FROM mysql.user;
要执行该语句,必须拥有对user表的查询权限。除了使用SELECT语句以外,还可以使用SHOW GRANTS语句来查看权限。SHOW GRANTS语句的代码如下:
SHOW GRANTS FOR 'username'@ 'hostname';
其中,username参数表示用户名;hostname参数表示主机名或者主机。
【示例15-21】下面查看root用户的权限。代码如下:
SHOW GRANTS FOR 'root'@'localhost';
这些代码执行结果如下:
mysql> SHOW GRANTS FOR 'root'@'localhost' \G *************************** 1. row *************************** Grants for root@localhost: GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD '*348F870E4E4ADE95D0 72D3699C6CB6D89F2620F2' WITH GRANT OPTION 1 row in set (0.02 sec)
结果显示授权语句,从授权语句可以看出root的用户拥有的权限。