是否可以在“dbo 用户/管理员登录”权限下获得“WITH EXECUTE AS”(需要查看服务器状态)?
Posted
技术标签:
【中文标题】是否可以在“dbo 用户/管理员登录”权限下获得“WITH EXECUTE AS”(需要查看服务器状态)?【英文标题】:Is it possible to get "WITH EXECUTE AS " working under "dbo user/Administrator login" permissions (VIEW SERVER STATE needed)? 【发布时间】:2014-02-10 12:05:56 【问题描述】:问题可以这样模拟:
DECLARE @C1 BIGINT,@C2 BIGINT;
PRINT SUSER_NAME()+ ' '+ USER_NAME();
SELECT @C1=transaction_id from sys.dm_tran_current_transaction (nolock)
PRINT @C1
EXECUTE AS USER = 'dbo';
PRINT SUSER_NAME()+ ' '+ USER_NAME();
SELECT @C2=transaction_id from sys.dm_tran_current_transaction (nolock)
PRINT @C2
REVERT;
从“管理员”登录调用(db 所有者,链接到 dbo 用户)返回:
Administrator dbo
2209599
Administrator dbo
Msg 297, Level 16, State 1, Line 7
The user does not have permission to perform this action.
相同的用户,但不同的结果。为什么?
详情:
我有一个包含 select from sys.dm_os_sys_info 的 SP,因此这个 SP 的调用者应该有 VIEW SERVER STATE 权限。
我用“WITH EXECUTE AS OWNER”修改了 SP 标头。所有者是链接到“管理员”服务器登录的标准“dbo”数据库用户。管理员是 sysadmin 的成员并具有有效权限“查看服务器状态”,但执行我修改过的过程会导致“用户无权执行此操作”错误...我看到了自 DBO 数据库用户以来的逻辑没有服务器权限(即使管理员登录有)。但是接下来呢?
我试过了:
-
向 DBO 授予查看服务器状态 - 由于 'dbo 无法正常工作
不是用户定义的服务器角色的错误。
创建链接到“管理员”的新用户“ServerStateViewer” - 因为“登录名已经有一个不同用户名下的帐户”而不起作用(据我了解 - dbo 用户在 dabatabse 中退出)
创建未链接到任何登录名的新用户“ServerStateViewer” - 不起作用,因为我无法向该用户添加任何服务器权限。
以“管理员身份”执行 - 由于“管理员不是数据库用户”错误而无法工作。
看来我不得不创建新的服务器登录。我很有趣,可能还有其他方法可以让 WITH EXECUTE AS 在 dbo 用户/管理员登录权限下工作吗?
【问题讨论】:
谁是数据库所有者?你?系统管理员? 我相信 SP 的调用者(正如你提到的)是不相关的。 SP 消除了将所有内容授予调用者和所有权链接控制可以访问的内容的要求。只要调用者可以执行它,那么 SP 中的所有内容都应该触发,前提是它在自己的模式中调用对象。数据库所有者是谁/什么建立了模拟用户的身份,因此根据数据库所有者,它可能会失败。 @Ben: 数据库所有者是管理员(sql server login 'Administrator'); 'dbo' 用户在我的数据库中链接到它。我的 SP WITH EXECUTE AS OWNER 在任何调用者的情况下返回权限错误:“管理员”、“YetAnotherMemberOfSysadminAndDbOwner”等。你能建议我应该创建和测试什么样的调用者吗? 【参考方案1】:您需要使用代码签名。这不是问题,因为您应该使用代码签名来开始授予程序权限......正确的顺序是这样的:
检查过程代码以确保您信任它 将过程更改为具有 EXECUTE AS OWNER 子句 在 SP 的数据库中使用私钥创建证书 使用您创建的证书的私钥对过程进行签名 删除证书的私钥(以防止它再次被使用) 将证书复制到主数据库中 从证书创建登录 将 AUTHENTICATE SERVER 授予证书派生登录 将过程所需的任何其他权限(例如查看服务器状态)授予证书派生登录有关示例,请参阅Signing an activate procedure。
请注意,在开发过程中,代码签名可能会很痛苦,因为您必须在每次对过程进行更改后重新签名。出于开发目的,请勿在签名后立即删除私钥,以便可以重复使用。
【讨论】:
Remus,我能否请您解释一下为什么签名程序有效以及为什么“只是”作为所有者执行无效? 我文章第一行的链接给出了答案。以上是关于是否可以在“dbo 用户/管理员登录”权限下获得“WITH EXECUTE AS”(需要查看服务器状态)?的主要内容,如果未能解决你的问题,请参考以下文章