「作者简介」:冬奥会网络安全中国代表队,CSDN Top100,就职奇安信多年,以实战工作为基础著作 《网络安全自学教程》,适合基础薄弱的同学系统化的学习网络安全,用最短的时间掌握最核心的技术。
这一章节我们需要知道MySQL的用户权限是如何划分的,怎么修改用户权限。
实际生产环境中,应按照软件安全设计的最小特权原则配置用户权限。
- 查看权限
show grants for root@localhost;
- 查看权限
select * from mysql.user where user='root'\G
- 设置权限
grant select on *.* to test@localhost;
- 删除权限
revoke select on *.* from test@localhost;
MySQL权限体系
- 1、权限级别划分
- 2、权限列表
- 3、查看用户权限
- 4、设置用户权限
- 5、删除用户权限
- 6、新用户的默认权限
- 7、实战操作
1、权限级别划分
MySQL用户的权限分为5个级别:全局、库、表、字段、程序和函数。
- 全局级别:对整个MySQL服务器的权限。存储在
mysql.user
表中,xx.priv字段表示具体的权限,Y表示有权限,N表示没权限。 - 数据库级别:对某个数据库的权限。存储在
mysql.db
表中,xx.priv字段表示具体的权限,Y表示有权限,N表示没权限。 - 表级别:对某个表的权限。存储在
mysql.priv
表中,xx.priv字段表示具体的权限,这里不再用YN表示,而是具体的Select、Delete这种。 - 字段级别:对某个字段的权限。存储在
columns_priv
表中。 - 程序和函数级别:对某个程序或函数的权限。存储在
procs_priv
表中。
权限看起来很复杂,但实际分配权限时却很简单:
- 设置全局权限,就写成
*.*
。 - 设置某个数据库的权限,就写成
database.*
。 - 设置某个表的权限,就写成
database.table
。 - 设置某个字段的权限,就写成
database.table.column
。
2、权限列表
- ALL:所有权限
- ALTER:可以使用 alter 修改表结构
- ALTER TOUTINE:可以使用 alter toutine 修改存储过程和函数
- CREATE:可以使用 create 创建表
- CREATE ROUTINE:可以使用 create routine 创建存储过程和函数
- CREATE TEMPORARY TABLES:可以使用 create temporary tables 创建临时表
- CREATE USER:可以使用 create user、drop user、rename user、revoke all privileges 创建、删除、修改用户。
- CREATE VIEW:可以使用 create view 创建视图
- DELETE:可以使用 delete 删除数据
- DROP:可以使用 drop 删除数据库和表
- EXECUTE:可以使用 execute 执行存储过程
- FILE:可以使用 select into outfile 和 load data infile 读写文件
- INDEX:可以使用 create index 和 drop index 创建和删除索引
- INSERT:可以使用 insert 插入数据
- LOCK TABLES:可以对拥有 SELECT 权限的表 使用 lock tables 锁表
- PROCESS:可以使用 show full processlist 查看服务器的进程信息
- RELOAD:可以使用 flush 刷新表和日志
- REPLICATION CLIENT:可以查询主从服务器信息
- REPLICATION SLAVE:可以从主服务器中读取日志
- SELECT:可以使用 select 查询数据
- SHOW DATABASE:可以使用 show database 显示所有数据库
- SHOW VIEW:可以使用 show create view 显示视图信息
- SHUTDOWN:可以使用 mysqladmin shutdown 关闭MySQL服务器
- SUPER:可以使用超级用户操作,包括change master,kill,purge master logs,set global,mysqladmin debug
- UPDATE:可以使用 update 修改数据
- USAGE:无权限
- GRANT OPTION:可以使用 grant 将自己的权限授权给其他用户
3、查看用户权限
方式一:以权限设置记录的形式展示用户权限,多条权限配置可叠加生效。
show grants for root@localhost;
方式二:只看权限结果。\G
可以让每个字段显示为一行。
select * from mysql.user where user='root'\G
4、设置用户权限
设置权限的语法格式:
grant select on *.* to test@localhost;
- grant:设置权限的关键字
- select:给用户设置的权限
- on:权限对哪些范围生效,
*.*
就是对所有数据库.所有表
都生效。 - to:给哪个用户设置权限
- test@localhost:
用户名@主机
5、删除用户权限
删除权限的语法格式:
revoke select on *.* from test@localhost;
- revoke:删除权限的命令
- select:删除哪个权限
- on:删除权限的范围
- from:删除谁的权限
- test@localhost:
用户名@主机
6、新用户的默认权限
创建一个新用户,可以发现,用户默认是 USAGE 没有权限。
create user test@localhost;
show grants for test@localhost;
登录进去可以发现,新用户连访问mysql库的权限都没有,也无法创建数据库。
quit
mysql -u test
show database;
7、实战操作
我们切换root,给新用户加一个SELECT权限
quit
mysql -u root -p1234567
grant select on *.* to test@localhost;
show grants for test@localhost;
再登录新用户,就能查询所有数据库了。
quit
mysql -u test
show databases;
再切回root用户,取消新用户的 select,再次查看,可以看到,用户有回到USAGE没有权限的状态了。
quit
mysql -u root -p1234567
revoke select on *.* from test@localhost;
show grants for test@localhost;