2013年(350)
分类: Mysql/postgreSQL
2013-04-11 15:34:21
中的数据库(DB)从功能上来看,有点儿类似ORACLE数据库中的表空间,都是一个提供对象存储的空间(information_schema除外,该db比较特殊,后面章节将专门描述),但是MySQL中的数据库与ORACLE中的表空间不同也表现的非常突出。比如说,MySQL中的数据库,不过是对应操作系统中的一个目录,也就是说,不必通过create database语句创建,直接在操作系统一级指定位置创建一个目录,然后到mysql命令行下show databases,也是能看到的。
设置数据库级别的权限,是指在指定的数据库中,拥有[所有]对象的[所有]权限,这部分权限信息记录mysql.db和mysql.host表。
这里特别提一下mysql.host表,该表在5.1版本及之前版本中的设计也比较特殊,默认情况下GRANT/REVOKE语句并不触发该表数据的读写,因此多数情况下该表基本没啥用,不过某些特殊情况下,DBA可以手动操作(insert/update)该表来实现某些特殊的需求,比如说将内网中的某些加入该表并授予所有权限,所有操作都通过这些服务器进行,又或者明确指定某些服务器不具备管理权限等等诸如此类,换个角度来看的话,如果没有类似需求,那就可以完全不考虑mysql.host表了,起码在5.1版本中是这样。
先收回jss@%在全局的create权限,收回权限使用revoke语句,语法跟grant很像,操作如下:
mysql> revoke create on *.* from jss@'%';
Query OK, 0 rows affected (0.00 sec)
mysql> select * from user where user='jss'\G
*************************** 1. row ***************************
Host: %
User: jss
Password: *284578888014774CC4EF4C5C292F694CEDBB5457
Select_priv: N
Insert_priv: N
Update_priv: N
Delete_priv: N
Create_priv: N
Drop_priv: N
Reload_priv: N
Shutdown_priv: N
Process_priv: N
File_priv: N
Grant_priv: N
References_priv: N
Index_priv: N
Alter_priv: N
Show_db_priv: N
Super_priv: N
Create_tmp_table_priv: N
Lock_tables_priv: N
Execute_priv: N
Repl_slave_priv: N
Repl_client_priv: N
Create_view_priv: N
Show_view_priv: N
Create_routine_priv: N
Alter_routine_priv: N
Create_user_priv: N
Event_priv: N
Trigger_priv: N
ssl_type:
ssl_cipher:
x509_issuer:
x509_subject:
max_questions: 0
max_updates: 0
max_connections: 0
max_user_connections: 0
1 row in set (0.00 sec)多说一句,jss@%只具有create权限,因此执行revoke时,直接revoke all privileges也是可行的。
尝试授予jss@%操作jssdb库的create权限,操作如下:
mysql> grant create on jssdb.* to jss@'%';
Query OK, 0 rows affected (0.00 sec)
mysql> select * from db where user='jss'\G;
*************************** 1. row ***************************
Host: %
Db: jssdb
User: jss
Select_priv: N
Insert_priv: N
Update_priv: N
Delete_priv: N
Create_priv: Y
Drop_priv: N
Grant_priv: N
References_priv: N
Index_priv: N
Alter_priv: N
Create_tmp_table_priv: N
Lock_tables_priv: N
Create_view_priv: N
Show_view_priv: N
Create_routine_priv: N
Alter_routine_priv: N
Execute_priv: N
Event_priv: N
Trigger_priv: N
1 row in set (0.00 sec)这样,jss就拥有了在jssdb库中创建表对象的权限,当然,也仅限于创建。
综合来看,全局和数据库都是两个粒度比较粗的权限级别,我们再来总结一下与之相关的数据字典:
Mysql安装后,默认创建的test数据库权限比较怪异,所有可连接的用户都能够拥有权限访问该库,并操作其中的对象。这是怎么实现的呢,其实很简单,查看一下mysql.db即可明了:
mysql> 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服务的目地。对于这种库没啥好说的,该咋处理就咋处理吧~~
如同ORACLE中那堆all_*/user_*表并非真正的表,MySQL中的Information_schema也并不是真正的库,而是由MySQL自动维护的一组虚拟表,跟ORACLE数据库中的数据字典表非常类似,都是用户能看却不能改(不能直接改)。
所有登录到MySQL的用户都能访问INFORMATION_SCHEMA数据库,以及其中的表,当然,看到的都是自己有权限看到的对象。比如说拥有jssdb数据库所有权限的jss用户,use information_schema数据库后,能够查看jssdb下的所有表、视图、触发器、过程等所有相关对象的元数据。
用户不能对INFORMATION_SCHEMA数据库中的对象做授权,比如说授予information_schema.tables的select权限给jss用户,这样操作肯定会失败,即使是root用户也不行。
=======================================
查看之前的连载: