“撩”一下mysql权限的一个细枝但不末节

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

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

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

  1.  首先整库授权:  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 |
+----------------+------+---------------------+

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

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

  1. 因为对所有库授权信息是在mysql.user表里的,该权限表最小粒度是全局权限,不能说去掉一个库,剩余某些库,因为该表没有这个库这字段。
  2. 对指定库授权信息是mysql.db表里的,该权限表支持的最小授权单位就是库,如果两个库就会有两条记录,同理,没有表字段。
  3. 对表授权信息是在mysql.table表里的,该权限表支持的最小授权单位就是表,同理没有列字段。
  4. 同样对列权限也是mysql.columns_priv,该权限表支持的最小授权单位就是列

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

             user ->db->table->columns_priv

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

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

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

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值