我们有一个带有 DBO 的登录/用户到单个数据库,现在我们正在添加一个查询,该查询提供一些基本的监控信息,需要将权限稍微扩展到系统管理员端。
基本上,查询需要能够运行(只读)以下命令:
DBCC SQLPERF(logspace)
EXEC master..xp_fixeddrives
dbo.sysfiles
sys.master_files
tempdb.sys.database_files
tempdb.sys.dm_db_file_space_usage
sys.dm_exec_requests
sys.dm_tran_locks
sys.partitions
sys.indexes
sys.dm_os_waiting_tasks
sys.dm_os_tasks
sys.dm_exec_sessions
sys.dm_exec_sql_text
其中大部分内容都需要诸如查看服务器状态、查看任何定义等权限,所有这些都可以用于授予所需的权限,而无需进入系统管理员服务器角色。但是我们只想将这些权限限制在这个单一的查询中。
所以我们正在寻找的是选项。我最后的首选选项是向登录名/用户添加各种权限,因为这样它就可以访问超出其需要的权限(sysadmin 服务器角色的各种子权限),所以我尝试使用 EXECUTE AS 创建一个过程子句,显然只是因为内部的动态 SQL(我们需要将 DBCC SQLPERF 的结果输出到表变量中),所有权链接变得困难。即便如此,允许使用边界系统管理员凭据执行过程似乎也很棘手。
我浏览了更多关于这个主题的内容,但我无法理解,但我仍然无法让它发挥作用。基本上,你们能告诉我如何在不产生安全漏洞的情况下做到这一点吗?
只是一个运行这个查询的批处理,只能由系统管理员更改,并且可以被任何有权运行它的人读取/执行?谢谢!
编辑:
我目前正在研究创建代理登录和/或使用证书签署程序的可能性。似乎是一个很有趣的选项。
我认为你最简单的选择是一份工作。
您可以通过 msdb 中的 SQLAgentOperatorRole 角色授予启动作业的权限。该角色的成员可以启动系统管理员登录所拥有的作业,该作业可以执行您需要的命令。
这是根据您的要求的示例:
虽然授予 SQLAgentOperatorRole 仍然是一个(次要的)安全问题,但我发现它比其他解决方案更令人担忧。