我在尝试让我的存储过程使用时遗漏了一些东西EXECUTE AS
。存储过程从 读取数据source_db
、聚合数据并将结果存储在target_db
.
sp 本身在target_db
. 我有一个专用的登录名并将其映射到sp 所有者的用户(因此在loginsource_db
和in 中有一个用户)。target_db
app_agent
source_db
target_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
可以解决问题,但这对我来说似乎不是正确的解决方案......
这在通过使用 EXECUTE AS 扩展数据库模拟中进行了解释。EXECUTE AS 上下文仅在当前数据库中受信任,并且允许它溢出到其他数据库是权限升级攻击向量。
有两种解决方案,都在上面链接的文章中描述:
最简单的方法是标记数据库 TRUSTWORTHY:
ALTER DATABASE [source_db] SET TRUSTWORTHY ON;
。虽然很容易,但也很危险,因为它是dbo
事实上source_db
的sysadmin
.安全的是使用代码签名,请参阅调用另一个数据库中的过程以获取示例。这更复杂,但是 100% buletproff 安全。
哪个用户运行 ALTER PROCEDURE 命令?它可能已将所有者(自我)访问级别设置为该用户,而不是您想要的。