“真正的”数据库授予用户什么权限?

时间:2011-12-28 13:05:45

标签: database security database-permissions

在阅读@ PerformanceDBA对Historical / auditable database的回答时,他发表了这样的声明:

  

在真实(标准ISO / IEC / ANSI SQL)数据库中,我们不会授予权限   INSERT / UPDATE / DELETE用户权限。我们授予选择和   仅参考(对于所选用户)所有INSERT / UPDATE / DELETE都被编码   在Transactions中,这意味着存储过程。然后我们就各自进行GRANT EXEC   存储过程到选定用户(使用ROLES减少管理)。

这是真的吗?如何使用ORM工具动态生成INSERT / UPDATE?

更新

好的,所以这是一个例子。我有一个带有两个接口的Web应用程序,一个 Admin 和一个 User 。管理员端使用 heavy ORM,能够动态生成数百个(如果不是数千个)不同的SQL命令。

用户交互要简单得多,而且我有十几个SP可以处理几个投票按钮的UPDATE / INSERT。显然,运行应用程序的用户具有非常不同的权限集。在管理员方面,ORM的数据库用户对相关表具有完全的CRUD访问权限,此应用程序根本没有使用SP - 我不会想到在没有通过域模型中的业务逻辑的情况下触摸数据。甚至批量数据导入也通过ORM进行处理。用户方面的SP我认为这个原则只是一个小小的让步,因为它们是一个特例。

现在,我发现原始问题中的上述陈述有些令人不安,因为我认为这是一个“真正的”数据库,或者至少接近它。

2 个答案:

答案 0 :(得分:1)

我想说这是最好的设计,也是我通常喜欢练习的。因为来自应用程序的即席查询可能很混乱,难以调整,甚至更难以进行故障排除和跟踪,所以使用存储过程获取抽象级别是最容易的。应用程序只能进行存储过程调用。将存储过程视为数据库的API。

因此,如果以上是设计目的,那么应用程序用户只需要数据库上的SELECTEXECUTE。这就是原因:

create procedure MyTestProcedure
with execute as 'UserWithDMLRights'
as

    -- your CRUD code

go

如果典型的应用程序用户只有SELECTEXECUTE,那么执行上述存储过程的权限就足够了。存储过程中的INSERT/UPDATE/DELETE将在UserWithDMLRights的安全上下文中执行,该数据库用户必须具有INSERT/DELETE/UPDATE权限。

至于ORM,我很同意你。我相信L2S只是使用sp_executesql进行了大量的即席查询调用,所以我相信你会遇到这个理论并使用上述安全实践的问题。

答案 1 :(得分:1)

它像狂欢节中的格兰帕一样。 ORM可以使用SP,但它不能充分利用它们。

SP只是生活的方式,它就像第十一条诫命一样,但正如你指出的那样,ORM并没有真正起作用。我曾经认为整个SP层本身就是一种预制的ORM,你带走了你的关系数据库,做了一堆连接并返回了一组数据,其中包含填充对象所需的列/属性。

现在,对于动态ORM类型的应用程序,需要在表上指定权限,如果您的DBA正在执行其工作,那就不那么安全了,这只是一些工作,需要有更多关于允许的内容的沟通在表上,如果您不需要DELETE,那么您的DBA需要知道不为其授予权限。

良好的DBA知道具有表访问权限的安全数据库与仅具有SP访问权限的数据库一样安全。相信不那么自信的DBA更难以解决问题。