Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1206529
  • 博文数量: 350
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 5668
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-23 17:53
文章分类

全部博文(350)

文章存档

2013年(350)

分类: Mysql/postgreSQL

2013-04-11 15:34:21

3.2、

  中的数据库(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)---工作原理


阅读(1428) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~