SQL Server EXECUTE AS 问题

a1e*_*x07 13 sql-server-2008 security

我在尝试让我的存储过程使用时遗漏了一些东西EXECUTE AS。存储过程正在从中读取数据source_db、聚合数据并将结果存储在 中target_db

sp 本身在target_db. 我有一个专用的登录名并将它映射到用户source_dbtarget_dbsp 的所有者(所以有一个用户app_agentsource_dbtarget_db登录app_agent)。

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

EXEC target_db.app_agent_schema.import_data
Run Code Online (Sandbox Code Playgroud)

一切正常。但如果我改变

ALTER PROCEDURE app_agent_schema.import_data WITH EXECUTE AS OWNER` (or `AS SELF`) 
Run Code Online (Sandbox Code Playgroud)

并尝试执行它,它抛出

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

我正在使用 SQL Server 2008。

有人能指出我的错误吗?

谢谢

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

Rem*_*anu 26

这在使用 EXECUTE AS 扩展数据库模拟中进行了解释。EXECUTE AS 上下文仅在当前数据库中受信任,允许它溢出到其他数据库是特权攻击向量的升级。

有两种解决方案,均在上面链接的文章中进行了描述:

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

  • 安全的方法是使用代码签名,示例参见调用另一个数据库中的过程。这更复杂,但 100% buletprooff 安全。