在数据库级别的权限,如果给一个用户CREATE权限的话,那么这个用户是这个时候就是看到这个数据库了。
grant create on suys.* to sec2@'192.168.124.13'; |
比如这个语句给sec2用户 create 权限在suys数据库上面。但是实际查询的时候可以看见
sec2@192.168.124.13:3306 07:41:24 [suys]>show databases; +--------------------+ | Database | +--------------------+ | information_schema | | suys | | test | +--------------------+ 3 rows in set (0.02 sec)
sec2@192.168.124.13:3306 07:41:34 [suys]> |
这个时候,我们却看见了其他另外2个库(information_schema 和 test)。
1.并不存在的information_schema库
information_schema库比较像Oracle数据库的那些系统V$*视图数据字典。这样所有登陆到MySQL数据库的
用户都应该访问这个库。
需要注意的是,Mysql中的information_schema库并不是真正存在的数据库。在操作系统层面没有与之对应
物理文件。这个数据库及库中的对象完全是由Mysql自动维护的虚拟对象。这些对象用户能看见但是不能修改。
information_schema库对象的另一个特殊之处在于,用户不能对information_schema数据库中的对象做授权。
即使做了操作也会失败,管理员用户也不行。
2.有趣的test库
新建MySql数据库后,默认创建的test数据库比较怪异,所有可连接的用户都能拥有权限访问该库,并操作其中
的对象,这是怎么实现的呢,其实很简单,查看库级权限字段表mysql.db。
root@localhost:mysql.sock 21:40:59 [mysql]> root@localhost:mysql.sock 21:41:00 [mysql]>select * from mysql.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.01 sec) |
从权限上来看,Host=%,User为空。这就说明了不限制的。所有能连接到Mysql的用户,全都拥有test及test开通的数据库的几乎所有权限。
这无疑存在安全上的隐患,先不说在其中创建的重要对象可以被随便访问。在该库如果创建一个很大的对象,就能把空间全部占满。
所以在刚创建完数据库后,在没有任何新用户有新权限的时候,执行下面SQL,删除test的相关权限。如果你已经建了很多用户后,才看见这个问题,用delete删除单条数据好了。
root@localhost:mysql.sock 21:43:16 [mysql]> root@localhost:mysql.sock 21:43:36 [mysql]>truncate table mysql.db; Query OK, 0 rows affected (0.00 sec)
root@localhost:mysql.sock 21:43:49 [mysql]> root@localhost:mysql.sock 21:43:50 [mysql]> |