SQL Server EXECUTE AS trouble

我在尝试使用EXECUTE AS时遇到了一些问题。存储过程从source_db读取数据,对其进行聚合,并将结果存储在target_db中。 存储过程本身位于target_db中。我有一个专用的登录账户,并将其映射到source_dbtarget_db中的用户,以供存储过程的所有者使用(因此在source_dbtarget_db中都有一个名为app_agent的用户,对应登录账户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选项对我来说没有起作用,但您可以尝试一下,看看是否有效。 - Jon Seigel
2个回答

这在通过使用EXECUTE AS扩展数据库模拟中有解释。EXECUTE AS上下文仅在当前数据库中受信任,允许其溢出到其他数据库是特权升级攻击的一种方式。 有两个解决方案,都在上述链接的文章中描述:
  • 简单的方法是将数据库标记为TRUSTWORTHY:ALTER DATABASE [source_db] SET TRUSTWORTHY ON;。虽然简单,但也很危险,因为它使source_dbdbo成为事实上的sysadmin

  • 安全的方法是使用代码签名,请参见在另一个数据库中调用存储过程以获取示例。这更复杂,但是百分之百安全。


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

同一个用户创建了存储过程(app_agent)。如果我使用app_agent创建的存储过程没有使用execute as owner/self,以app_agent身份登录后,存储过程可以正常执行。但是,如果我添加了EXECUTE AS SELF(同样是该用户),即使以app_agent身份登录,我会收到“...无法访问数据库...”的错误提示。 - a1ex07