• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

mertoo

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

mysql权限的一个细枝

业务需求:对一个用户回收一个表的所有权限,但是之前对这个用户是授权表所在库的整个权。

 背景:某个表后来插入了机密数据,不能再让人随便查阅了。

 

 比如:存在库 test01  库下存在表T1,那mysql是否支持呢,来复盘下整个操作:

 

 首先整库授权:

 grant all privilges on test01.* to test0629;

> show grants for test0629;

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

| Grants for test0629@%                               |

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

| GRANT USAGE ON *.* TO 'test0629'@'%'                |

| GRANT ALL PRIVILEGES ON `test01  `.* TO 'test0629'@'%' |

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

 

2 尝试回收 T1权限

 

revoke  ALL PRIVILEGES on `test01  `.T1 from test0629;

ERROR 1147 (42000): There is no such grant defined for user 'test0629' on host '%' on table 'T1'

可以看到无法回收,因为之前没有对此表单独授权过。

3   那再想一想曲线救国呢,先对这个表授权下,再回收是否就搞定了呢,拭目以待:

 > grant all privileges on Test01.T1 to test0629;                                    

  Query OK, 0 rows affected (0.01 sec)

 

> show grants for test0629;                                   

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

| Grants for test0629@%                                           |

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

| GRANT USAGE ON *.* TO 'test0629'@'%'                            |

| GRANT ALL PRIVILEGES ON `test01  `.* TO 'test0629'@'%'             |

| GRANT ALL PRIVILEGES ON `test01  `.`T1` TO 'test0629'@'%' |

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

 

      再回收该表的权限:

 

     revoke  ALL PRIVILEGES on `test01`.T1 from test0629;

     Query OK, 0 rows affected (0.01 sec)

 

     > show grants for test0629;                                    

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

     | Grants for test0629@%                               |

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

    | GRANT USAGE ON *.* TO 'test0629'@'%'                |

     | GRANT ALL PRIVILEGES ON `test01`.* TO 'test0629'@'%' |

 

回收后再看看是否还有该表访问权限

 

mysql -hxxxx -Pxxx -utest0629

 

> show databases;

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

| Database           |

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

| test01          |

| information_schema |

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

2 rows in set (0.00 sec)

 

> use test01

Reading table information for completion of table and column names

You can turn off this feature to get a quicker startup with -A

 

Database changed

[test01]> show tables;

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

| Tables_in_Test01  |

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

| T1

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

1 rows in set (0.00 sec)

 

> select * from T1;

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

| a             |b | c                |

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

| 1 | 2 | 3|

| 4 | 5 | 6 |

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

 

可见:对整库授权是无法回收库下单表权限的,因为

 

授权和回收的粒度必须一致的,同样的对所有库授权也是不能单独回收一个库的。

 

因为对所有库授权信息是在mysql.user表里的,该权限表最小粒度是全局权限,不能说去掉一个库,剩余某些库,因为该表没有这个库这字段。

对指定库授权信息是mysql.db表里的,该权限表支持的最小授权单位就是库,如果两个库就会有两条记录,同理,没有表字段。

对表授权信息是在mysql.table表里的,该权限表支持的最小授权单位就是表,同理没有列字段。

同样对列权限也是mysql.columns_priv,该权限表支持的最小授权单位就是列

 

      所以结论是不可行的,曲线救国,虽然回收了表的权限,只是回收了table权限表,db表里还有该权限,所以还是可以访问的,因为权限验证顺序是按照 :

 

             user ->db->table->columns_priv

 

           验证的,db里有就直接验证通过了。

 

但是最终还是要解决问题的,怎么办:

 

  把原来整库权限回收了,再对库下的其他表授权。

 

   ---------虽然笨,但有招胜无招。

————————————————

版权声明:本文为CSDN博主「郭烊千玺」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/weixin_42851042/article/details/118335519

posted on 2024-01-23 13:46  mertoo  阅读(21)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3