`
丁林.tb
  • 浏览: 789216 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

MySQL权限控制的设计缺陷?

阅读更多

这个问题是从被问到information_schema.user_privilegeIS_GRANTABLE字段问题开始查起的,就先从user_privilege表的显示规则说起。

 

1、              IS_GRANTABLE字段

root账号执行如下语句(本文中grant后都接flush privileges, 不赘述)

a) grant all privileges on *.* to `myuser`@localhost with grant option;

 

b) select user,select_priv from mysql.user where user='myuser';

+------------------------------+----------------------------+

| user               | select_priv        |

+------------------------------+----------------------------+

| myuser            | Y                      |

+------------------------------+----------------------------+

 

c) select PRIVILEGE_TYPE, IS_GRANTABLE from information_schema.user_privileges where grantee like '\'myuser\'@\'localhost\'' and PRIVILEGE_TYPE = ‘SELECT’;

+------------------------------+----------------------------+

| PRIVILEGE_TYPE     | IS_GRANTABLE     |

+------------------------------+----------------------------+

| SELECT                    | NO                         |

+------------------------------+----------------------------+

   

 

说明: b)myuser已经有了select_priv。而c) IS_GRANTABLENO,这不是显示错误。 实际上,IS_GRANTABLE并非表示用户是否“拥有此权限”,而是表示用户是否拥有“将此权限赋予其他用户”的权限。它对应的是mysql.user表中的grant_priv字段,此时为NO

  

2user_privileges的显示规则

       当我们创建一个新用户create user myuser2;  时,在mysql.user中看到这个用户的所有权限都为NO,此时user_privileges增加一行

+---------------------+-----------------------+--------------------------+---------------------+

| GRANTEE     | TABLE_CATALOG | PRIVILEGE_TYPE  | IS_GRANTABLE  |

| 'myuser2'@'%' | NULL          | USAGE          | NO           |.

+---------------------+-----------------------+--------------------------+---------------------+

 

什么时候显示USAGE 这篇文章中我们知道对应的显示控制代吗在sql/sql_show.cc 对应的函数为fill_schema_schema_privileges

简单分析源码得到规则如下:

 

    PRIVILEGE_TYPE规则:

       a) 当该用户没有权限,或只有grant_priv的时候,PRIVILEGE_TYPE显示为USAGE

       b) 否则按顺序显示被赋予的权限,每行一个,这些权限包括

UPDATE_ACL | SELECT_ACL | INSERT_ACL | DELETE_ACL | CREATE_ACL | DROP_ACL | GRANT_ACL | REFERENCES_ACL | INDEX_ACL | ALTER_ACL | CREATE_TMP_ACL |  LOCK_TABLES_ACL | EXECUTE_ACL | CREATE_VIEW_ACL | SHOW_VIEW_ACL | CREATE_PROC_ACL | ALTER_PROC_ACL | EVENT_ACL | TRIGGER_ACL), GRANT权限不显示。

 

   IS_GRANTABLE规则:若该用户有grant_priv权限,则在列出的所有行的IS_GRANTABLE都显示YES,否则显示NO

 

================================标题党的分割线================================

 

3、权限控制问题

       从上面的分析中我们知道,用户是否拥有给其他用户赋权的权限,取决于这个用户本身是否拥有grant_priv权限。用一个字段控制一批权限,这样就联想到可能有一个“权限混乱“的现象。

       首先,授权必然是要有范围限制的。用户A赋权给用户B,这些赋予的权限不能超过A的权限范围。

       看以下的操作序列。使用root账户登录。

mysql> grant select,insert,delete,update on *.* to `grant_u2`@localhost  ;     

Query OK, 0 rows affected (0.00 sec)

 

mysql> flush privileges;

Query OK, 0 rows affected (0.00 sec)

 

mysql> select * from information_schema.user_privileges where grantee like '%gran_u%';

Empty set (0.01 sec)

 

mysql> select GRANTEE, PRIVILEGE_TYPE, IS_GRANTABLE from information_schema.user_privileges where grantee like '%grant_u%';

+--------------------------------+----------------------------+--------------------+

| GRANTEE            | PRIVILEGE_TYPE   | IS_GRANTABLE |

+--------------------------------+----------------------------+--------------------+

| 'grant_u1'@'localhost' | SELECT            | YES         |

| 'grant_u2'@'localhost' | SELECT            | NO         |

| 'grant_u2'@'localhost' | INSERT            | NO         |

| 'grant_u2'@'localhost' | UPDATE           | NO         |

| 'grant_u2'@'localhost' | DELETE            | NO         |

+-------------------------------+-------------------------------+-------------------+

 

    说明:上面的操作中,我们给grant_u1赋了查询权限且with grant option. grant_u2赋了增删改查权限,但没有grant权限。

information_schema.user_privileges看出目前权限状态正常。

 

    之后用grant_u1登录, select的“赋权”权限赋给grant_u2.

mysql> grant select on *.* to `grant_u2`@localhost with grant option  ;                    

Query OK, 0 rows affected (0.00 sec)

mysql> select GRANTEE, PRIVILEGE_TYPE, IS_GRANTABLE from information_schema.user_privileges where grantee like '%grant_u%';

+--------------------------------+----------------------------+--------------------+

| GRANTEE            | PRIVILEGE_TYPE   | IS_GRANTABLE |

+--------------------------------+----------------------------+--------------------+

| 'grant_u1'@'localhost' | SELECT            | YES         |

| 'grant_u2'@'localhost' | SELECT            | YES         |

| 'grant_u2'@'localhost' | INSERT            | YES         |

| 'grant_u2'@'localhost' | UPDATE           | YES         |

| 'grant_u2'@'localhost' | DELETE            | YES         |

+-------------------------------+-------------------------------+-------------------+

5 rows in set (0.00 sec)

 

    从结果看出,grant_u2用户拥有了对增删改查的赋权权限。这个已经超出了grant_u1的权限范围。

 

进一步的,再用grant_u2登录,执行grant select,insert,delete,update on *.* to `grant_u1`@localhost with grant option ; grant_u1用户也拥有了增删改查的赋权权限。

实际上,root账号设置的权限中,grant_u1grant_u2都没有对增删改的赋权权限,但经过上述操作后,这两个用户的权限都扩大了,且超过了原有权限的并集。

 

4、分析

实际上这个问题的根源,就在于MySQL在设计上用一个grant_priv来控制是否有赋权权限,而每个概念上将每个权限分开。导致在grant_u1将“查询赋权”权限赋给grant_u2的时候,附带的将其他权限也带进去了。

2
1
分享到:
评论
1 楼 飞鸿无痕 2012-07-12  
对于第一点,select PRIVILEGE_TYPE, IS_GRANTABLE from information_schema.user_privileges where grantee like '\'myuser\'@\'localhost\'' and PRIVILEGE_TYPE = ‘SELECT’;的结果IS_GRANTABLE应该为YES才对吧。因为你上面有加with grant option选项.

相关推荐

    MySQL数据库的权限及其安全缺陷.pdf

    MySQL数据库的权限及其安全缺陷.pdf

    MySQL数据库的权限及其安全缺陷 (1).pdf

    MySQL数据库的权限及其安全缺陷 (1).pdf

    基于SSM+Mysql的软件缺陷管理系统.zip

    基于SSM+MySQL的软件缺陷管理系统是一个用于跟踪和管理软件开发过程中的缺陷和问题的在线平台。...用户权限管理:系统支持多级用户权限管理,可以根据用户角色进行权限的分配和控制,确保数据的安全性和机密性。

    MySql 5.1 参考手册.chm

    7.1.1. MySQL设计局限与折衷 7.1.2. 为可移植性设计应用程序 7.1.3. 我们已将MySQL用在何处? 7.1.4. MySQL基准套件 7.1.5. 使用自己的基准 7.2. 优化SELECT语句和其它查询 7.2.1. EXPLAIN语法(获取SELECT相关信息...

    MySQL 5.1参考手册

    7.1.1. MySQL设计局限与折衷 7.1.2. 为可移植性设计应用程序 7.1.3. 我们已将MySQL用在何处? 7.1.4. MySQL基准套件 7.1.5. 使用自己的基准 7.2. 优化SELECT语句和其它查询 7.2.1. EXPLAIN语法(获取SELECT相关...

    MySQL 5.1中文手冊

    7.1.1. MySQL设计局限与折衷 7.1.2. 为可移植性设计应用程序 7.1.3. 我们已将MySQL用在何处? 7.1.4. MySQL基准套件 7.1.5. 使用自己的基准 7.2. 优化SELECT语句和其它查询 7.2.1. EXPLAIN语法(获取SELECT相关信息...

    MySQL 5.1官方简体中文参考手册

    7.1.1. MySQL设计局限与折衷 7.1.2. 为可移植性设计应用程序 7.1.3. 我们已将MySQL用在何处? 7.1.4. MySQL基准套件 7.1.5. 使用自己的基准 7.2. 优化SELECT语句和其它查询 7.2.1. EXPLAIN语法(获取SELECT相关信息...

    MySQL 5.1参考手册中文版

    7.1.1. MySQL设计局限与折衷 7.1.2. 为可移植性设计应用程序 7.1.3. 我们已将MySQL用在何处? 7.1.4. MySQL基准套件 7.1.5. 使用自己的基准 7.2. 优化SELECT语句和其它查询 7.2.1. EXPLAIN语法(获取SELECT相关...

    MySQL 5.1参考手册 (中文版)

    7.1.1. MySQL设计局限与折衷 7.1.2. 为可移植性设计应用程序 7.1.3. 我们已将MySQL用在何处? 7.1.4. MySQL基准套件 7.1.5. 使用自己的基准 7.2. 优化SELECT语句和其它查询 7.2.1. EXPLAIN语法(获取SELECT相关信息...

    mysql5.1中文手册

    MySQL访问权限系统 5.7.1. 权限系统的作用 5.7.2. 权限系统工作原理 5.7.3. MySQL提供的权限 5.7.4. 与MySQL服务器连接 5.7.5. 访问控制, 阶段1:连接核实 5.7.6. 访问控制, 阶段2:请求核实 ...

    MYSQL中文手册

    7.1.1. MySQL设计局限与折衷 7.1.2. 为可移植性设计应用程序 7.1.3. 我们已将MySQL用在何处? 7.1.4. MySQL基准套件 7.1.5. 使用自己的基准 7.2. 优化SELECT语句和其它查询 7.2.1. EXPLAIN语法(获取SELECT...

    mysql官方中文参考手册

    7.1.1. MySQL设计局限与折衷 7.1.2. 为可移植性设计应用程序 7.1.3. 我们已将MySQL用在何处? 7.1.4. MySQL基准套件 7.1.5. 使用自己的基准 7.2. 优化SELECT语句和其它查询 7.2.1. EXPLAIN语法(获取SELECT相关信息...

    java毕业设计之软件缺陷管理系统源码(ssm后端+mysql+前端+说明文档).zip

    (1)管理员登录:管理员进入软件缺陷管理系统进行各类信息管理之前,为了系统以及用户的安全,管理员必须通过输入密码登录进入后台管理系统,才能进行其他的操作。 (2)欢迎页:登录成功来到系统首页,管理员将看到...

    MySQL5.1参考手册官方简体中文版

    7.1.1. MySQL设计局限与折衷 7.1.2. 为可移植性设计应用程序 7.1.3. 我们已将MySQL用在何处? 7.1.4. MySQL基准套件 7.1.5. 使用自己的基准 7.2. 优化SELECT语句和其它查询 7.2.1. EXPLAIN语法(获取SELECT相关信息...

    SSM项目-软件缺陷管理系统的Java毕业设计(源码+说明+演示视频).zip

    SSM项目-软件缺陷管理系统的Java毕业设计(源码+说明+演示视频).zip 【项目技术】 java+mysql+ssm+b/s 【实现功能】 本系统一共分为管理员、项目经理、调试员以及解决方案人员四大角色,每个角色所具有的权限也不一样...

    基于Java+SSM的软件缺陷管理系统毕业设计(源码+说明+演示视频).zip

    基于Java+SSM的软件缺陷管理系统毕业设计(源码+说明+演示视频).zip 【项目技术】 java+mysql+ssm+b/s 【实现功能】 本系统一共分为管理员、项目经理、调试员以及解决方案人员四大角色,每个角色所具有的权限也不一样...

    Java毕业设计-基于ssm框架的软件缺陷管理系统(源码+说明+演示视频).zip

    Java毕业设计-基于ssm框架的软件缺陷管理系统(源码+说明+演示视频) 【项目技术】 java+mysql+ssm+b/s 【实现功能】 本系统一共分为管理员、项目经理、调试员以及解决方案人员四大角色,每个角色所具有的权限也不一样...

Global site tag (gtag.js) - Google Analytics