MySQL权限控制的设计缺陷?

这个问题是从被问到information_schema.user_privilege的IS_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_GRANTABLE是NO,这不是显示错误。 实际上,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_u1、grant_u2都没有对增删改的赋权权限,但经过上述操作后,这两个用户的权限都扩大了,且超过了原有权限的并集。

4、分析

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

时间: 2024-12-21 02:50:50

MySQL权限控制的设计缺陷?的相关文章

MySQL之权限控制

最近在研究MySQL的权限,比较头疼,把一些相关的知识点和想法整理好,记录下来. ------------------------------------------------------------------------------------------------------------正文---------------------------------------------------------------------------------------------------

《MySQL DBA修炼之道》——1.4 MySQL权限

1.4 MySQL权限 1.4.1 MySQL权限机制 MySQL权限控制包含如下两个阶段. 阶段1:服务器检查是否允许你连接. 阶段2:假定你能连接,服务器将检查你发出的每一个请求,查看你是否有足够的权限实施它.例如,如果你从数据库表中选择(SELECT)行或从数据库中删除表,那么服务器要确定你是否对表有SELECT权限或对数据库有DROP权限. MySQL是通过用户名.密码.IP(主机名) 3个要素来验证用户的.当你想要访问MySQL服务器时,MySQL客户端程序一般会要求你指定如下参数.

Winform开发框架之字段权限控制

在我的很多Winform开发项目中(包括混合框架的项目),统一采用了权限管理模块来进行各种权限的控制,包括常规的功能权限(按钮.菜单权限).数据权限(记录的权限),另外还可以进行字段级别的字段权限控制,字段权限是我们在一些对权限要求比较严格的系统里面涉及到的,可以对部分用户隐藏一些敏感的信息.本篇主要介绍字段权限的控制思路及实现机制,以便大家对这个字段权限的控制有一个直观的了解. 如果需要对权限系统的功能进行一定的了解,可以先回顾下我前面的文章<Winform开发框架之权限管理系统功能介绍>.

认证鉴权与API权限控制在微服务架构中的设计与实现(一)

作者: [Aoho's Blog] 引言: 本文系<认证鉴权与API权限控制在微服务架构中的设计与实现>系列的第一篇,本系列预计四篇文章讲解微服务下的认证鉴权与API权限控制的实现. 1. 背景 最近在做权限相关服务的开发,在系统微服务化后,原有的单体应用是基于session的安全权限方式,不能满足现有的微服务架构的认证与鉴权需求.微服务架构下,一个应用会被拆分成若干个微应用,每个微应用都需要对访问进行鉴权,每个微应用都需要明确当前访问用户以及其权限.尤其当访问来源不只是浏览器,还包括其他服务

WebGIS中快速整合管理多源矢量服务以及服务权限控制的一种设计思路

 文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 在真实项目中,往往GIS服务数据源被其他多个信息中心或者第三方公司所掌控,当需要快速搭建一套能够对所有GIS数据,根据权限不同.需求不同.而进行展示的系统.为了避免在代码层面上过多的定制化开发,我们需要能提出一种可以整合管理多源矢量服务并进行权限控制的架构. 目前商业GIS软件中,Esri公司给出了其Portal产品,可以对arcgis Server发布的各

MySql用户权限控制

MySql用户权限控制 本文将介绍MySql创建帐号,删除帐号,设置和介绍各种帐号的权限 创建用户帐号:  www.bitsCN.com [sql] CREATE USER user_name IDENTIFIED BY 'your_password'; 改名 [sql] RENAME USER old_name TO new_name; 删除用户帐号 [sql] DROP USER user_name; 查看用户的权限可以用  www.bitsCN.com SHOW GRANTS FOR us

.NET平台下带权限控制的TreeView控件节点生成算法

treeview|控件|控制|算法 一.引言 在应用系统开发中,TreeView是一种使用频率很高的控件.它的主要特点是能够比较清晰地实现分类.导航.浏览等功能.因而,它的使用方法与编程技巧也一直受到技术人员的关注.随着应用需求的变化,在很多情况下我们需要实现数据显示的权限控制,即用户看到的数据是经过过滤的,或是连续值,或是一些离散的值.就TreeView而言,原先可能显示出来的是完整的具有严格父子关系得节点集,而经权限过滤后所要显示的节点可能会变得离散,不再有完整的继承关系.本文针对这一问题,

通过可视化继承和页面模板控制站点设计

继承|控制|模板|设计|页面|站点 作者:Fritz Onion相关技术:模板.ASP.NET,Master Pages难度:★★★☆☆读者类型:ASP.NET开发人员     [导读]本文首先介绍了在传统的Web开发下"模板"的实现,包括了ASP和ASP.NET 1.x的实现,然后介绍了ASP.NET 2.0下模板的实现方式--Master Pages,最后阐述了母版页的实现原理.     多年以来,Web开发人员一直在努力通过多种技术来"模板化"他们的站点,但没

AOP下的权限控制实现

OOP应用开发面临的问题 面向对象技术很好地解决了软件系统中角色划分的问题.借助于面向对象的分析.设计和实现技术,开发者可以将问题领域的"名词"转换成软件系统中的对象,从而很自然地完成从问题到软件的转换. 但是,问题领域的某些需求却偏偏不是用这样的"名词"来描述的.比如遇到这样的问题:需要对系统中的某些方法进行权限检验,这种需要权限检验的方法散布在40多个类中.面对这种需求,应该怎么办呢?最直接的办法就是:创建一个起类(或接口),将权限检验的功能放在其中,并让所有需