Mysql安全配置

mysql中存在4个控制权限的表,分别为

1
2
3
4
1. mysql.USER表
2. mysql.DB表
3. mysql.TABLES_PRIV表
4. mysql.COLUMNS_PRIV表

要注意的是,Mysql中有一个数据库”information_schema“,似乎里面保存的也是一些权限信息,但是要明白的是,这个数据库”information_schema“是为系统管理员提供元数据的一个简便方式,它实际上是一个视图,可以理解为对Mysql中的一个信息的封装,对于Mysql主程序来说,身份认证和授权的信息的来源只有一个,就是”mysql“。

在我们进行数据库连接、登录的时候,mysql权限表的验证过程为:

  1. 先从user表中的:
1
2
3
1) Host
2) User
3) Password

这3个字段中判断连接的ip、用户名、密码是否存在,存在则通过验证。

  1. 通过身份认证后,进行权限分配,按照下面的顺序进行验证。
1
2
3
4
1) user
2) db
3) tables_priv
4) columns_priv

即先检查全局权限表user,如果user中对应的权限为Y,则此用户对所有数据库的权限都为Y,将不再检查db,tables_priv,columns_priv
如果全局权限表user对应的权限为N,则到db表中检查此用户对应的具体数据库,并得到db中为Y的权限
如果db中为N,则检查tables_priv中此数据库对应的具体表,取得表中的权限Y,以此类推。逐级下降

用自己的话讲就是因为查找他们权限是否配置好根据情况查看mysql这个数据库中的user,db,tables_priv,columns_pri,一旦在某个级别设置好了权限就不需要网下一级去看他是否存在权限了,因为下面一级的表都不会显示,这是为了防止数据库数据冗余。就是例如你设置的是所有数据库及表的权限的话,到时候就直接select * from user;就可以查看对应的程序啦
PNNSfK.md.png

对于Mysql中的账户权限相关的安全配置,总结如下:

  1. 针对每个网站建立一个单独的账户
  2. 为每个网站单独建立一个专属数据库(虽然DEDE、DZ普通采用表前缀的方法来实现”一库多站”,但好的做法还是”一库一站”)
  3. 按照user->db->tables_priv->columns_pri的顺序进行细粒度的权限控制
  4. 为每个用户单独配置一个专属数据库,保证当前用户的所有操作只能发生在它自己的数据库中,防止SQL注入发生后,黑客通过注入点访问到系统表

账户权限安全配置需要的常用命令
1)新建一个用户并给予相应数据库的权限

1
2
grant select,insert,update,delete,create,drop privileges on 数据库名字.表名 to user@localhost identified by 'passwd';    //如果是*号就是代表全部*.*代表所有数据库下的全部表名
grant all privileges on database.* to user@localhost identified by 'passwd';

2) 刷新权限

1
flush privileges;

3)显示授权

1
show grants;  //这句话只显示当前登录用户的权限

4) 移除授权

1
revoke delete on *.* from 'user'@'localhost';

5) 删除用户

1
drop user 'user'@'localhost';

6) 给用户改名

1
rename user 'jack'@'%' to 'jim'@'%';``

7) 给用户改密码

1
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('123456');

听说,打赏我的人最后都成了大佬。



文章目录