TDSQL 账户加固会影响到视图无法访问?

  • 回答 (1)
  • 关注 (0)
  • 查看 (34)

账户加固后,实例视图却无法访问了,该怎么处理呢?

好耶网络好耶网络提问于
酒当歌趁年轻,多折腾回答于
推荐

回答来自于问答智囊团成员:vkyzhao

专栏:https://cloud.tencent.com/developer/column/86410

背景

用户反馈实例视图无法访问,与用户沟通后,了解到近期安全变更将部分用户绑定的ip从%转换客户端ip地址,发生故障后,用户紧急进行了回滚,查看访问恢复正常,业务恢复。

分析

首先mysql族的关系数据库,帐户组成由用户@ip共同决定,对其中任意结构的变更都将破坏原来帐户的定义。针对于用户的描述,包括关键行为:1,删除帐户(变更相当于删除之前的帐户); 2,视图无法使用; 3,修复帐户后又恢复。我们估计是视图的definer被删除导致,查看用户故障视图,果然发现其定义者就是被删除的用户。换一种说话,由于进入definer(由user @ ip组成)在mysql.user表中被删除,导致该视图无法正常提供访问。

### https :// // mariadb 。com / kb / zh /创建视图/ 

如果指定DEFINER子句,则这些规则将确定合法的DEFINER用户值:

如果你也没有SUPER权限,只有合法用户价值是你自己的帐号,从字面上或使用CURRENT_USER要么指定。您不能将定义器设置为其他帐户。
如果您具有SUPER特权,则可以指定任何语法上合法的帐户名。如果该帐户实际上不存在,则会生成警告。
如果SQL SECURITY值为DEFINER,但是在引用该视图时定义器帐户不存在,则会发生错误。

其流程图可以展示为:

故障流程图

扩展

我们以一个测试的mariadb视图创建语句来做分析

MariaDB的[阿兰] >示出创建视图AAA \ G变
** ** ** ** ** ** ** ** ** ** ** ** ** *  1 。行** ** ** ** ** ** ** ** ** ** ** ** ** *
                视图: aaa
         创建视图: CREATE ALGORITHM = UNDEFINED DEFINER = `vky` @ `%` SQL安全性定义视图`aaa`作为select`alan`。哈。`id` AS `id`,`alan`。哈。`name` AS `name` 从 `ha` 
character_set_client字符: UTF8
collat​​ion_connection是: utf8_general_ci
 1行中 集合, 1个 警告 (0.00秒)

其中view列的意义是视图的名称,character_set_client列和collat​​ion_connection列为视图使用到的字符集和排序规则;创建视图其中包含了视图的主体结构,分类如下:1,ALGORITHM =未定义的算法表示实例对视图的处理算法,这个参数有三个值,包括MERGE,TEMPTABLE以及未定义值,其中合并可以简单地理解为将外部的sql语句和视图定义的语句合并起来,到原表进行查询; TEMPTABLE与合并相对应,他将视图中的结果先存储到临时表,外部sql直接调用临时表中的结果;至于未定义,可以理解为实例按照场景自己决定使用哪一个处理算法。2,DEFINER =`vky` @`% DEFINER表示视图的定义者(包括用户名以及绑定的ip),通常可以显式的指定,转换到当前用户,也就是选择current_user();返回的用户。3,SQL SECURE DEFINER SQL SECURITY约束视图的安全性策略,他的值有DEFINER和INVOKER。其中DEFINER的策略为如果引用者存有引用该视图的权限(该视图的选择权限),通常可以成功返回结果;如果为INVOKER,他需要引用视图的账户也需要同时对视图中的原表具有选择的权限,否则也会返回报错。

回到我们故障场景,用户修改了视图定义者的主机之后,导致视图无法访问,这里我们前面也进行了充分的解释,更进一步,既然不能破坏user @ host这个结构,那我们破坏掉这个用户的我们对SQL安全性进行解释,中定义definer策略下,当前帐户只需要有尝试的选择权限即可以正常的引用,其中对原表数据访问实际上使用到了定义者的权限,如果我们对定义者的权限进行完全破坏,实际上也是会失去对视图的使用。以下截屏是我们测试的结果:

MariaDB的[阿兰] >示出了补助为vky @ '%' ; 
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - + 
| 赠款用于vky @ %                                                                                   | 
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - + 
| *允许使用。* TO 'vky' @ '%' IDENTIFIED BY PASSWORD '* 96A12F0614169E80CC46E92BDE3DBF0FD4751D7C'  | 
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - - - - - - - - + 
1行于 集 (0.00秒)

MariaDB [ alan ] >从aaa中选择*  ;          
ERROR 1356 ( HY000 ):查看“alan.aaa”引用了无效的表(小号)或列(小号)或函数(小号)或定义者/调用者的观点缺乏权限来使用它们 

MariaDB的[阿兰] >示出了补助为vky @ '%' \ G变
** ** ** ** ** ** ** ** ** ** ** ** ** *  1 。排** ** ** ** ** ** ** ** ** ** ** ** ** *
拨款用于vky @ %: GRANT SELECT , INSERT , UPDATE , DELETE, CREATE , DROP ,工艺,参考文献,索引, ALTER , SHOW DATABASES ,创建临时表, LOCK TABLES , EXECUTE , REPLICATION SLAVE , REPLICATION CLIENT , CREATE VIEW , SHOW VIEW , CREATE ROUTINE , ALTER ROUTINE ,事件,触发* 。* TO 'vky' @ '%' IDENTIFIED BY PASSWORD'* 96A12F0614169E80CC46E92BDE3DBF0FD4751D7C' 
1行中 集合 (0.00秒)

MariaDB [ alan ] >从aaa中选择*  ;+ - - + - - - + | id | 名称| + - - + - - - + | 1 | 艾伦| | 2 | 笑话| | 3 | 汤姆  | + - - + - - - + 3行           



   
   
   

在 组 (0.00秒)

同样的逻辑,在invoker策略下,虽然删除定义者不会影响其他拥有权限的用户引用视图,但是这里也跑偏了创建视图的初衷。

那要如何完成变更definer操作呢?

由于云上实例通常不存在超级权限,因此无法直接使用超级帐户直接将视图从a关联到b名下,但是却可以使用b帐户登录实例,对视图进行definer的变更操作。如截屏:

MariaDB的[阿兰] >示出创建表AAA \ G变
** ** ** ** ** ** ** ** ** ** ** ** ** *  1 。行** ** ** ** ** ** ** ** ** ** ** ** ** *
                视图: aaa
         创建视图: CREATE ALGORITHM = UNDEFINED DEFINER = `vky` @ `%` SQL安全性定义视图`aaa` AS select`ha`。`id` AS `id`,`ha`。`name` AS `name` 从 `ha` 
character_set_client字符: UTF8
collat​​ion_connection是: utf8_general_ci
 1行中 集合 (0.00秒)

MariaDB [ alan ] > alter ALGORITHM =未定义的定义程序= `vky` @ `10.%` SQL安全定义程序视图`aaa` AS选择`ha`。`id` AS `id`,`ha`。`name` AS `name` 从 `ha` ; 
查询正确, 受影响0行(0.00秒) 

MariaDB的[阿兰] >示出创建表AAA \ G变
** ** ** ** ** ** ** ** ** ** ** ** ** *  1 。行** ** ** ** ** ** ** ** ** ** ** ** ** *
                视图: aaa
         创建视图: CREATE ALGORITHM = UNDEFINED DEFINER = `vky` @ `10.%` SQL安全性定义视图`aaa` AS select`ha`。`id` AS `id`,`ha`。`name` AS `name` 从 `ha` 
character_set_client字符: UTF8
collat​​ion_connection是: utf8_general_ci
 1行中 集合 (0.00秒)

MariaDB [阿兰] >选择current_user (); 
+ - - - - - - - - + 
|  current_user () | 
+ - - - - - - - - + 
| vky @ 10 。%   | 
+ - - - - - - - - + 
1行中 集合 (0.00秒)

MariaDB [阿兰] > 

该操作完成之后,,用户方可进行对高风险用户(绑定%的用户)进行回收操作。

扫码关注云+社区

领取腾讯云代金券