msdb 中的 EXECUTE AS OWNER 是否存在安全风险?

Han*_*non 3 security sql-server best-practices

我的任务是创建一个允许非特权用户启动和停止 SQL Server 代理作业的系统。我正在使用构造运行等dbomsdb数据库的架构中创建存储过程。WITH EXECUTE AS OWNEREXEC dbo.sp_start_job <JobID>;

联机丛书主题EXECUTE AS说,这是一个“最佳实践”:

指定具有执行模块中定义的操作所需的最低权限的登录名或用户。例如,除非需要这些权限,否则不要指定数据库所有者帐户。

在我的情况下,EXECUTE AS OWNER表示[sa],因为这些模块在dbo架构中,在 msdb 数据库中,该数据库始终归[sa].

我这样做是否无意中造成了安全风险?

我没有传入任何可用于 SQL 注入攻击的参数因为传入的唯一参数是UNIQUEIDENTIFIER表示受影响的作业。

运行存储过程的用户EXECUTE AS OWNER除了我明确创建的数据库角色的成员资格外,无权访问 msdb 数据库,他们拥有对存储过程GRANTsEXECUTE权限。

其中一个项目的条件是有问题的用户应该能够以任何方式运行SQL Server代理GUI工具。这排除了为他们提供内置SQLAgentUserRole角色的成员资格。我也宁愿不修改 等的权限dbo.sp_start_job,因为我试图不修改 SQL Server 本身所依赖的任何内容(除了显然将项目添加到 msdb 数据库本身之外)。

有问题的代码在这里

Ken*_*her 5

就其本身而言,不,您可能不会增加安全风险。只要除了系统管理员之外没有人可以更改程序,并且只要程序可以做的唯一一件事就是开始一项工作,我就看不到问题。

MSDB 被(并且应该)标记为TRUSTWORTHY. 这意味着通过使用EXECUTE AS OWNER您可以模拟 SERVER 级别的权限。在这种情况下,因为这sa意味着您可以创建一个过程来授予另一个用户 sysadmin。

这确实意味着您确实希望限制对 MSDB 的权限。