暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL存储过程的权限问题分析

760

这是学习笔记的第 2296 篇文章

  前几天和同事快速分析了一个小案例,是关于MySQL存储过程权限相关的,有一些技巧和思路可以借鉴。

  问题的背景是有个开发同学提交了一个存储过程,但是反馈执行的时候报了access denied的报错,提示权限不足,想让DBA同学来做下确认和检查。 

  我们查看了相关存储过程代码,好几百行的感觉,整体扫了一遍逻辑,没有看起来很生僻的操作,都是一些看起来常规的数据处理操作。

  对于这个问题,我们首先需要确认的就是存储过程的基础权限,比如SQL SECURITY,默认创建是definer,如果需要开放给其他的用户调用,则建议是设置为invoker,但是经过确认,这个部分的配置是正常的。

  第二个排查点是外键,因为我们的环境中基本上是没有外键的,但是不排除历史遗留业务还是存在这种情况,外键是需要references相关的权限的,这个权限在我们标准化的管理配置中是没有的,检查了数据字典information_schema.TABLE_CONSTRAINTS和information_schema.REFERENTIAL_CONSTRAINTS没有得到任何收获。

  所以我们有点怀疑是否是存储过程的逻辑有些问题,和业务同学确认了存储过程可以进行测试执行,我们使用默认的统一的管理员账号做了测试,执行失败,还是提示access denied, 于是使用root用户做了一次测试,当超级管理员root的执行时成功的,也就排除了逻辑层和权限不清晰的可能,所以排查目标进一步确认,还是需要确认权限。

   这个时候问题来了,超级管理员root的权限是最大的,那么和默认的管理员账号还存在哪些差异呢,我们简单对比了下,貌似细小的权限项还有不少差异的。怎么能够快速进行测试呢。 

   这里我们可以使用反证法来做,首先我们不能对已有的管理员账号做任何变更,假设管理员账号是dba_admin,那么我们可以创建一个临时账号test_proc@'127.0.0.1',将dba_admin的权限都复制过来,如果得到的报错是相同的,我们可以正式开始。

>>create user test_proc@'127.0.0.1' identified by 'xxxxx';

Query OK, 0 rows affected (0.01 sec)

>>grant all privileges on xxxx.* to test_proc@'127.0.0.1';

Query OK, 0 rows affected (0.00 sec)

>>show grants for test_proc@'127.0.0.1';

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

| Grants for test_proc@127.0.0.1                                            |

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

| GRANT USAGE ON *.* TO 'test_proc'@'127.0.0.1'                             |

| GRANT ALL PRIVILEGES ON `xxxx`.* TO 'test_proc'@'127.0.0.1' |

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

怎么得到ALL Privileges的权限明细呢,我们可以通过revoke来实现,比如我们就回收常见的insert权限。

>>revoke insert on xxxx.* from test_proc@'127.0.0.1';

Query OK, 0 rows affected (0.00 sec)

>>show grants for test_proc@'127.0.0.1';                           

 GRANT SELECT, UPDATE, DELETE, CREATE, DROP, REFERENCES, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, EVENT, TRIGGER ON `xxxx`.* TO 'test_proc'@'127.0.0.1' 

可以明确,除了insert的权限,这些是组成ALL Privilegs的权限集合了。

接下来要做的是横向对比,根据整体存储过程的逻辑进行比对,我们很快发现CREATE TEMPORARY TABLES是一个潜在的权限,进行了多次验证,很快锁定了这个权限细节。问题就得到了妥善解决。 

通过这个小问题的分析,也让自己对于一些不明确问题的分析有了一些思想上的提升,当然也需要做很多快捷的改进工作。

1)对于数据字典的总结和分析还不够,需要进一步完善mysql_lite这个项目的使用

2)自己最开始也意识到了是temporary tables相关的操作,但是通过搜索没有很快定位到这个问题,导致线索最开始断了之后就逐步偏离了方向

3)线上环境之前也碰到过这个问题,但是没有直接进行比对和分析,在分析方向上耽误了一些时间。

4)对于基础权限的管理还是不够规范,比如统一的管理员账号其实是应该统一接入create temporary tables这个权限的

5)应该引导业务尽可能放弃存储过程

近期热文:

使用图表分析2020北京积分落户的数据

MySQL 8.0给开发方向带来的一些困扰

关于故障复盘的一些总结

迁移到MySQL的业务架构演进实战

MySQL业务双活的初步设计方案

如何优化MySQL千万级大表,我写了6000字的解读

一道经典的MySQL面试题,答案出现三次反转

小白学MySQL要多久?我整理了10多个问题的答案

转载热文:

SQLcl这个可爱的小工具,来了解一下呀~

CPU占用又爆了?MySQL到底在干什么

这个MySQL优化原理剖析,比照X光还清楚

自己动手写SQL执行引擎

最受欢迎的微服务框架概览

程序员,保住你的钱袋子!

QQ群号:763628645

QQ群二维码如下, 添加请注明:姓名+地区+职位,否则不予通过


在看,让更多人看到

文章转载自杨建荣的学习笔记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论