文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

存储过程的细粒度访问控制

2024-11-29 20:58

关注

审校 | 重楼

概要

现代的企业数据库具有全面的安全机制,可以对图表和视图中的数据实施细粒度访问控制。

然而,当涉及到存储过程时,访问控制机制可能相对粗略:能够执行存储过程,或者不能。

本文将展示一种使用可编程代理的更灵活的方法,该方法允许基于所有可用信息(例如参数值、返回值等)精确控制存储过程的调用。对于那些在管理对企业数据库的访问时需要更多粒度和灵活性的人来说,这种方法可能会引起他们的兴趣。

细粒度访问控制

大多数企业数据库都提供了细粒度的安全机制,确保只有经过授权的用户才能对数据进行访问和修改,而且可以控制到具体的行和列级别。例如:

在所有情况下,概念都是相同的:应该能够在非常细粒度的级别上指定哪些操作可以由哪些用户对哪些数据执行。

但是,当涉及到存储过程时,所有数据库都有一个简单的访问/不访问机制。用户可以执行给定的存储过程,也可以不执行。

是否需要对存储过程进行细粒度访问控制?

许多组织大量使用存储过程,有时甚至会完全阻止对图表和视图的直接访问,所有数据访问都必须通过存储过程。

存储过程本身通常必须提供复杂的访问控制作为其实现的一部分,以确保调用有效,即使底层数据本身受到细粒度访问控制的保护。这使得存储过程更加复杂,调用成本更高,更改也更频繁。

对许多人来说,这只是开展业务的成本,但在某些情况下,基于代理的方法在以下情况下很有用:

即使这些方法都不适合,也可以寻求其他方法以开辟新的道路。

可以使用代理控制什么?

可编程数据库代理可以控制数据库服务器和客户机之间的任何事项,但本文将重点讨论存储过程。

通过引入可编程代理,可以控制存储过程调用的三个关键方面:

(1)控制调用

代理可以拒绝或修改存储过程的调用。这可能有以下几个原因:

(2)控制参数值

代理还可以对客户端传递的参数执行逻辑:

(3)控制返回值和结果集

一旦执行了存储过程,它可能会返回一些数据,这些数据可能是单独的值,也可能是一个或多个结果集。

基于这些值或结果集,代理可以:

如何向数据库添加代理?

向数据库添加代理通常只需启动一个或多个代理,并将客户端引导到代理即可。因此,与通常的连接不同:

在中间添加代理,并开始在代理中添加需要的任何逻辑:

让我们看一个简单的例子。将使用SQL Server作为数据库,使用Gallium Data作为代理。

给定一个简单的存储过程:

SQL 
 CREATE PROCEDURE DEMO.CREATE_PRODUCT ( 
 IN NAME VARCHAR(50), 
 IN PRICE DECIMAL(10,2),
 IN TYPEID INT)

希望实现以下要求:

(1)只有MGMT组中的用户可以创建type为98或99的产品

(2)只有type > 100的产品价格才能超过5000美元

(3)type16和type17的产品实际上必须使用CREATE_SPECIAL_PRODUCT过程创建

使用代理中的RPC筛选器很容易满足第一个要求:

JavaScript 
 let typeId = context.packet.parameters[2].value;
 if (typeId === 98 || typeId === 99) {
 let rs = context.mssqlutils.executeQuery("select is_member('MGMT') as res");
 let isMember = rs.rows[0].res;
 if ( ! isMember) {
 context.result.errorMessage = "User is not a member of the MGMT group";
 return;
 }
 }

如果需求没有得到满足,这将导致客户端接收到错误提示。

第二个示例要求是一个简单的扩展:

JavaScript 
 let price = context.packet.parameters[1].value;
 if (price > 5000 && typeId <= 100) {
 context.result.errorMessage = "Price is too high for this type of product";
 return;
 }

第三个示例要求更简单:

JavaScript 
 if (typeId === 16 || typeId === 17) {
 context.packet.procName = "CREATE_SPECIAL_PRODUCT";
 }

在最后一个示例中,假设CREATE_SPECIAL_PRODUCT过程采用与CREATE_PRODUCT相同的参数,但是如果情况并非如此,其逻辑当然可以根据需要更改参数。

这些都是简单的示例,但可以让人们了解:使用可编程数据库代理保护存储过程相当简单,如果不能(或不想)更改存储过程,那么它尤其有用。

Fine-Grained Access Control for Stored Procedures,作者:Max Tardiveau

来源:51CTO内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯