MySQL数据库权限体系入门(5)—管理数据库权限

  • Post author:
  • Post category:mysql


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用户也不行。

=======================================

查看之前的连载:


MySQL数据库权限体系入门(4)—管理全局权限


MySQL数据库权限体系入门(3)—管理用户权限


MySQL数据库权限体系入门(2)—创建用户


MySQL数据库权限体系入门(1)—工作原理

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7607759/viewspace-676674/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/7607759/viewspace-676674/