MySQL存储过程,没错,看起来就是一个奇怪的使用场景。问题源于一个开发同学,提交了申请权限的工单,需要开通一些权限。本来是一个很正常的操作,但是在我看来,却是更加的紧急和紧迫。说来惭愧,忙于方向规划和开发,却忽略了这个基本的操作功能,所以看了一些目前的实现。方式,我还是希望能够做一些小事来解放这些重复性的工作。当然,我决定接手一些基础工作。一方面是为了减轻同事的压力,另一方面我是在做一个完整的体验,因为很多需求和痛点都可以很容易的通过实践来捕捉。如果我觉得不合理,那么这个过程肯定有一些改进。比如部署安装,比如权限激活。数据库的授权是一个比较典型的案例,存储过程的授权甚至有点可疑。问题场景仍然非常基本。开发人员需要启用一些基本权限。在标记权限的时候,声明需要增删改查的权限,还有DDL权限,比如drop、alter、create等。看到这里,感觉不妥,什么样的操作需要这样的大权威。我简要说明了我的立场。培养学生的想法是方便管理,所以直接招了。经过简单的交流,发现他们的需求场景还是很常规的。他们需要动态的创建一些日常的表,所以需要createpermissions可以在评估之后给。对于一般用户,不建议开启create的权限。主要出发点是能够对SQL进行一些基本的审计,哪怕是人工审计或者平台审计。所需的过程。于是经过一轮沟通,发现启用的权限可以快速修剪。对于他们来说,修改存储过程的逻辑也是很有必要的,因为在一些特定的场景下,他们希望在逻辑的控制上更加灵活。好了,基本背景介绍到此结束。grantbasictablepermissions,grantpermissiontostoredprocedures,存储过程这个地方需要注意的一个重点是SQLSECURITY,默认创建的是definer,如果需要开放给其他用户,建议设置调用者。所以很简单的一句话:grantexecute,alterprocedureonxxx.xxxtoxxx@'xxxx';但不幸的是,开发同学反映,通过SQLyog或Navicator打开时,无法看到存储过程的内容。因为我们没有权限选择程序或查看程序,所以我们几乎没有办法干预。这个问题可以用命令行重现:没有实质性的存储过程内容。在那里折腾了一会,发现是个老问题,10多年前的老问题。https://bugs.mysql.com/bug.php?id=20235解决问题其实很简单,只需要这么一句话:grantselectonmysql.proctoxxxx@'xxxx'这么细粒度的权限控制这么纠结,但它是真正有效的。比如我们举一反三,我们知道MySQL中的所有权限是一个非常大的权限,但是对于它包含多少权限我们可能没有一个清晰的概念。我们完全可以通过细粒度的权限控制来逆向推送。例如,创建一个用户并授予所有特权权限。mysql>grantallprivilegesontest.*to'jeanron'@'%'identifiedby'jeanron100';QueryOK,0rowsaffected,1warning(0.00sec)包含以下权限:mysql>showgrantsforjeanron;+------------------------------------------------+|Grantsforjeanron@%|+-------------------------------------------------+|GRANTUSAGEON*.*TO'jeanron'@'%'||GRANTALLPRIVILEGESON`test`.*TO'jeanron'@'%'|+----------------------------------------------+2rowsinset(0.00sec)让我们缩小。mysql>revokeinsertontest.*fromjeanron@'%';QueryOK,0rowsaffected(0.00sec)好了,所有权限的权限就会原形毕露了。mysql>showgrantsforjeanron;|Grantsforjeanron@%+------------------------------------------------------------------------------------------------|GRANTUSAGEON*.*TO'jeanron'@'%'|GRANTSELECT、更新、删除、创建、删除、引用、索引、更改、创建临时表、锁定表、执行、创建视图、显示视图,CREATEROUTINE,ALTERROUTINE,EVENT,TRIGGERON`test`.*TO'jeanron'@'%'|所以在上面的问题中,其实如果selecton*.*已经包含了我们需要的mysql.proc的细粒度权限,想要抽茧,基本上就是这么个套路。
