3.2、数据库
MySQL中的数据库(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.user表决定是否允许或拒绝到来的连接。对于允许的连接,user表授予的权限指出用户的全局(超级用户)权限。这些权限适用于服务器上的all数据库。
- mysql.db表范围列决定用户能从哪个主机存取哪个数据库。权限列决定允许哪个操作。授予的数据库级别的权限适用于数据库和它的表。
- 当你想要一个给定的db表应用于若干主机时,db和host表一起使用。例如,如果你想要一个用户能在你的网络从若干主机使用一个数据库,在用户的db表行的Host值设为空值,然后将那些主机的每一个移入host表。
3.2.1 有趣的test库
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服务的目地。对于这种库没啥好说的,该咋处理就咋处理吧~~
3.2.2 并不存在的INFORMATION_SCHEMA库
如同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用户也不行。
=======================================
查看之前的连载:
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7607759/viewspace-676674/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/7607759/viewspace-676674/