分类: Mysql/postgreSQL
2014-04-27 11:35:31
由于开发员人员需要一个只读权限的数据库帐号:readonly,创建好之后,开发人员用这个帐号在mysql的test库中进行测试,发现能够创建数据表,当时觉得非常奇怪,又检查了一下,改帐号的权限:show grants for 'readonly'@'localhost' 发现只有select权限,并没有create 权限,那为何能在test库中创建表呢? 当时以为权限的授予的有问题,就先把帐号readonly的权限都收回, revoke all privileges from 'readonly'@'localhost' ,这时该账户只有USAGE权限, 使用该账户登录到数据库,进入test库,居然还是能创建表,从这现象看应该不是权限的问题,应该是这个test库的问题.
查了一些资料,mysql默认创建的test数据库权限比较怪异,所有可连接的用户都能够拥有权限访问该库,并操作其中的对象。这是怎么实现的呢,其实很简单,查看一下mysql.db即可明了:
select * from db where db like 'test%'\G;
*************************** 1. row ***************************
Host: %
Db: test
User:
Select_priv: Y
Insert_priv: Y
Update_priv: Y
Delete_priv: Y
Create_priv: Y
Drop_priv: Y
Grant_priv: N
References_priv: Y
Index_priv: Y
Alter_priv: Y
Create_tmp_table_priv: Y
Lock_tables_priv: Y
Create_view_priv: Y
Show_view_priv: Y
Create_routine_priv: Y
Alter_routine_priv: N
Execute_priv: N
Event_priv: Y
Trigger_priv: Y
*************************** 2. row ***************************
Host: %
Db: test\_%
User:
Select_priv: Y
Insert_priv: Y
Update_priv: Y
Delete_priv: Y
Create_priv: Y
Drop_priv: Y
Grant_priv: N
References_priv: Y
Index_priv: Y
Alter_priv: Y
Create_tmp_table_priv: Y
Lock_tables_priv: Y
Create_view_priv: Y
Show_view_priv: Y
Create_routine_priv: Y
Alter_routine_priv: N
Execute_priv: N
Event_priv: Y
Trigger_priv: Y
2 rows in set (0.00 sec)
从权限上来看,host为%,user为空,这就说明了不限制的,所有能连接到MySQL的用户,几乎都拥有test库的所有权限。
这无异存在安全上的隐患,先不说在其中创建的重要对象可被任何人访问,就算该库中没有任何对象,假如有人想恶意破坏DB服务,只要登录,然后在该库创建一个超大对象,把空闲空间全部占满,就相当于变相达到了破坏db服务的目地。所以像这库就要DROP掉。