跨数据库链接与可信选项

DBA*_*ser 7 sql-server-2008 security sql-server

最近,我们有一个存储过程请求,需要跨多个数据库进行访问。当然,这种情况并不少见,但在我们的案例中,之前我们使用了服务帐户,并且该服务帐户具有对所有数据库的读/写权限。

但是现在我们将所有权限更改为windows登录AD组,AD组中的用户没有对所有数据库的所有权限。

例子:

  • AD 组 UG1 有 10 个用户,它们是数据库 A 上的用户。
  • 存储过程 PROCA 驻留在数据库 A 中,但对属于数据库 B 和数据库 C 的表进行了选择。
  • 执行权限已授予存储过程 PROCA 和 AD 组 UG1,因为已在数据库 B 和数据库 C 上创建用户(没有其他权限)。
  • DatabaseA、DatabaseB 和DatabaseC 的数据库所有者在登录XXX 下。

众所周知,这种跨数据库的权限可以通过

  • 选项 1:在所有数据库上打开数据库跨链,或
  • 选项 2:为 AD 组 UG1 提供所需的数据库(B 和 C)的单个对象权限或
  • 选项 3:在 DatabaseA 上使用 Trustworthy db 选项并更改存储过程 PROCA 以包括作为“dbo”用户执行,以便权限可以模拟。
  • 选项 4:使用证书

我的问题是,关于安全性和保持简单和安全的最佳解决方案是什么?

请注意,没有任何开发人员是任何数据库的数据库所有者,并且提升的权限仅分配给 DBA,因此有人进行黑客攻击或 SQL 注入或冒充系统管理员的可能性是“无”的。

但同样,我想知道在这种情况下你会怎么做?我更喜欢选项3。

Jān*_*nis 3

选项 1 是最糟糕的..不会使用它..

选项 2 需要大量的行政工作..

选项 3(参见最后一句:))

选项 4最近我不得不考虑如何保护数据库。我的解决方案就是这个。这里有一篇关于安全的很棒的文章。即使一开始使用证书有点复杂(之前从未使用过它们),我还是很高兴这个选择。我向证书登录/用户授予权限。我用该证书签署程序,一切正常。我使用相同的系统授予动态 SQL 权限(因此,如果存在 sp_executesql,我会向证书用户授予必要表的最低权限,因此 proc 的调用者看不到表,并且我不必以所有者身份执行或执行)。授予使用非对称密钥的权利也是如此。我总是知道谁是程序的调用者(不执行为),尽管它对我来说不是很重要。

在开发期间签署程序有点麻烦(试图找到解决这个问题的好方法)。目前我正在搜索过程文本(DDL 触发器)以使用其他数据库,如果找到它,我会打印出警告,该过程可能需要签名。

我错过的另一件事是它不可能签署函数或视图(必须有一个很好的理由),所以你不能使用它们来访问其他数据库。

我想说的最后一件事 - 我更愿意用最少的模式解决尽可能多的问题。因此,如果您广泛使用“执行为”和代理用户,那么也许值得信赖的选项是更好的选择。