SQL Server EXECUTE AS故障


13

我在尝试使存储过程使用时丢失了某些东西EXECUTE AS。存储过程正在从中读取数据source_db,对其进行汇总并将结果存储在中target_db

sp本身在中target_db。我有一个专用的登录名,并将其映射到sp的所有者source_dbtarget_dbsp的所有者中(因此,app_agentsource_dbtarget_db登录中都有一个用户app_agent)。

如果我以身份登录app_agent并执行

EXEC target_db.app_agent_schema.import_data

一切正常。但是如果我改变

ALTER PROCEDURE app_agent_schema.import_data WITH EXECUTE AS OWNER` (or `AS SELF`) 

并尝试执行它,它会抛出

服务器主体“ app_agent”在当前安全上下文下无法访问数据库“ source_db”。

我正在使用SQL Server 2008。

有人可以指出我的错误吗?

谢谢

更新 经过一番研究,我发现可以ALTER DATABASE target_db SET TRUSTWORTHY ON解决问题,但对于我来说似乎并不是正确的解决方案...


1
我认为答案是使用数据库级别的跨数据库所有权链选项。我能够在您的情况下重现该错误,但没有给出足够的详细信息来知道我是否准确地重现了该问题……CDOC选项对我而言不起作用,但请尝试一下,看看是否可以。
乔恩·塞格尔

Answers:


24

这在使用EXECUTE AS扩展数据库模拟中进行了说明。EXECUTE AS上下文仅在当前数据库中受信任,并且允许其溢出到其他数据库是特权攻击媒介的升级。

上面链接的文章中介绍了两种解决方案:

  • 简单一个是标记数据库TRUSTWORTHY: ALTER DATABASE [source_db] SET TRUSTWORTHY ON;。虽然简单,也是因为它使危险dbosource_db一个事实上的sysadmin

  • 安全的是使用代码签名,有关示例,请参阅在另一个数据库中调用过程。这比较复杂,但是buletproff具有100%的安全性。


0

哪个用户运行ALTER PROCEDURE命令?它可能已将所有者(自己)访问级别设置为该用户,而不是您想要的用户。


创建过程(app_agent)的同一用户。如果我有app_agent没有创建的过程execute as owner/self,则以身份登录app_agent,SP会正确执行。如果我添加EXECUTE AS SELF(再次是同一用户),并且甚至以身份登录app_agent,我会得到...is not able to access the database...
a1ex07
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.