MySQL安全配置详解(2)_MySQL教程

编辑Tag赚U币
教程Tag:暂无Tag,欢迎添加,赚取U币!

推荐:MySQL中实现高性能高并发计数器方案
现在有很多的项目,对计数器的实现甚是随意,比如在实现网站文章点击数的时候,是这么设计数据表的,如:article_id, article_name, article_content, article_author, article_view在article_view中记录该文章的浏览量。诈一看似乎没有问题。对于小站,比如本博客,就


select * from TABLES_PRIV;
desc TABLES_PRIV;
mysql> desc TABLES_PRIV;
+------------------+------+-----+--------------------+
| Field | Type | Null | Key | Default | Extra |
+------------------+------+-----+--------------------+
| Host | char(60) | NO | PRI | | |
| Db | char(64) | NO | PRI | | |
| User | char(16) | NO | PRI | | |
| Table_name | char(64) | NO | PRI | | |
| Grantor | char(77) | NO | MUL | | |
| Timestamp | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
| Table_priv | set('Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter','Create View','Show view','Trigger') | NO | | | |
| Column_priv | set('Select','Insert','Update','References') | NO | | | |
+------------------+------+-----+--------------------+

0×4. mysql.COLUMNS_PRIV表


select * from COLUMNS_PRIV;
desc COLUMNS_PRIV;
mysql> desc COLUMNS_PRIV; +----+------+-----+--------------------+
| Field | Type | Null | Key | Default | Extra |
+----+------+-----+--------------------+
| Host | char(60) | NO | PRI | | |
| Db | char(64) | NO | PRI | | |
| User | char(16) | NO | PRI | | |
| Table_name | char(64) | NO | PRI | | |
| Column_name | char(64) | NO | PRI | | |
| Timestamp | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
| Column_priv | set('Select','Insert','Update','References') | NO | | | |
+----+------+-----+--------------------+

以上是这4个表的基本结构,在我们进行数据库连接、登录的时候,mysql权限表的验证过程为:


1. 先从user表中的:
1) Host
2) User
3) Password
这3个字段中判断连接的ip、用户名、密码是否存在,存在则通过验证。
2. 通过身份认证后,进行权限分配,按照:
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安全配置详解

MySQL安全配置详解 模板无忧

了解了Mysql的账户权限原理和判断流程,我们接下来需要了解就是应该以怎样的方式去进行权限配置,才能达到所谓的"最小权限原则"呢?Mysql的账户权限优先级顺序是:


user->db->tables_priv->columns_pri

稍作思考,我们可以发现,这些表的作用本质上是一样的,区别就在于它们的作用域范围不同,从user到columns_pri逐级作用域范围降低,因此控制粒度也增大,它们的配置遵循"就近原则",即以优先级最低的那个为准,所以,我们在进行Mysql的账户权限安全配置的时候会发现"我们似乎在做很多重复性的工作"。但我们要明白的,Mysql的这种逐层次的权限配置体系为我们提供了一个细粒度的控制方法。所以我们的权限配置也应该按照这个顺序来有规划地进行。

0×1. USER表

从表格中可以看到,USER表主要针对数据库的账户进行粗粒度的权限控制,定义了"某人允许做什么事"。

0×2. DB表

DB表可以看成是USER表对权限控制的一个补充,一个更细粒度地、针对数据库库级别的权限控制。

同时,DB表也隐式包含了将账户限定在某个数据库的范围内这个配置,即限制某个用户只能用对它自己的数据库的控制权,对不属于它的数据库禁止操作,这能有效防止横向越权的发生。


mysql> select host,db,user from db;
+------+---------+------+
| host | db | user |
+------+---------+------+
| % | test | |
| % | test\_% | |
+------+---------+------+

可以看到,user字段为空,表示当前不对用户做任何数据库属权限制,在网站的部署过程中,应该单独针对网站建立一个账户一个独立的数据库,并为这个账户分配唯一的专属数据库,防止网络被入侵后的横向、纵向提权。

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


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

账户权限安全配置需要的常用命令


1. 新建一个用户并给予相应数据库的权限
grant select,insert,update,delete,create,drop privileges on database.* to user@localhost identified by 'passwd';
grant all privileges on database.* to user@localhost identified by 'passwd';

2. 刷新权限
flush privileges;

3. 显示授权
show grants;

4. 移除授权
revoke delete on *.* from 'user'@'localhost';

5. 删除用户
drop user 'user'@'localhost';

6. 给用户改名
rename user 'jack'@'%' to 'jim'@'%';

7. 给用户改密码
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('123456');

3. Mysql数据的网络安全配置

对数据库所在的DMZ的网络拓朴的安全配置也是我们在进行安全评估的时候需要考虑的一个方面,这对防御内网扫描、网络攻击有一定帮助。

0×1: 限制访问Mysql端口的IP

对Mysql的访问IP的限制,可以从应用层和主机层来分别达到目的

分享:创建MySQL从库
我们知道Oracle有DataGuard实时备份数据,可以做主备切换,而MySQL也有自己的一套备库方案,称之为主从复制。 搭建MySQL从库是为了实时同步主库数据,同时也可以分担主库的读压力,对数据库端做成读写分离结构。 搭建MySQL主从库注意点: 1.主库和从库的 server-id 一

来源:模板无忧//所属分类:MySQL教程/更新时间:2014-11-03
相关MySQL教程