SQL 授予自身 EXECUTE 权限的服务器存储过程

SQL Server stored procedure that grants itself EXECUTE permission

尝试搜索此内容,但找不到任何内容。我在生产数据库中有一些存储过程,开发人员在最后添加了一个

GRANT EXECUTE ON [ProcName] to [USER1] AS [dbo]

我的敏锐感觉告诉我不应该这样做,因为所有用户访问都应该(并且正在)在 SSMS 中以适当的级别进行管理。如果数据库开始真正变得繁忙并且没有必要每次都不断授予此访问权限,这也会引入死锁。

除了确保用户在开发过程中获得许可之外,我一辈子都想不出为什么需要这样做的正当理由。我打算删除它,但我只是想知道我是否遗漏了什么?

99.999% 的可能性这是一个错误。存储过程在批处理结束时 结束。开发人员可能使用这样的 DDL 批处理创建过程:

create procedure foo
as
begin
  print 'foo'
end

grant execute on foo to User1 as dbo  --this is still part of the procedure!
go

默认情况下,存储过程作为调用者执行,如果不是管理员,调用者将无法 运行 GRANT。

在您的 DDL 脚本中包含 GRANT 是一种很好的做法,但是为每个对象设置单独的 GRANT 是一种可以追溯到良好工具(如 SSDT)之前和用户模式分离之前的做法。

如今,更好的做法是在模式级别授予 GRANT,因此无需为每个对象设置权限。虽然 GRANT 应该是架构设计的一部分,并且在不同环境中是相同的,但这些授权通常应该是对 SCHEMA 上的 ROLE 的 GRANT。然后在不同的环境中,ROLE 可能有不同的成员,但 GRANT 永远不会改变。

所以生产 DBA 可能 运行

ALTER ROLE APP_FRONT_END ADD MEMBER [MyDomain\AppPoolIdentity]

但不是

GRANT EXECUTE ON FOO TO [MyDomain\AppPoolIdentity]

不……你没有遗漏任何东西。对于很多 "developers" 来说,这实际上是一件很常见的事情,开发人员需要为此付出代价。 CTO、开发经理和 DBA 应该加入他们,如果其中之一通过并且是主要原因之一...

  1. 绝不允许开发人员将代码部署到暂存、UAT 或 Prod
  2. 为什么应该有 100% 的代码审查过程
  3. 为什么要对这样的事情有书面规定,绝对不能容忍这样的事情。恕我直言,"one and done, you're out'a here".

如果没有他们付钱的人做这种愚蠢的事情,公司就会有足够的安全问题。对这种事情应该零容忍。

如果这一切让我在这个问题上听起来很残酷,那么我已经成功地说出了关于这个问题需要说的话,但是你(reader)可能是问题的一部分。

{编辑} 让我再限定一下...

这作为部署脚本的一部分可能是合法的,但它绝不能成为实际存储过程的一部分,因为没有理由不断地向给定的存储过程授予相同的权限。这对我来说仍然是 "violation",因为开发人员不应该通过代码或任何其他方式分配权限。只有 DBA 应该分配这样的权限,并且需要有一张票或一些其他可追溯性来说明为什么需要权限才能通过安全审计。

也没有理由向给定用户授予 DBO 级别的执行权限。您应该只向用户授予 EXECUTE 权限,并且存储过程中应该包含正确的 WITH EXECUTE AS xxxxx 语句,以便能够完成存储过程需要执行的操作。

如果授权代码中的 "user1" 是开发人员,那么是时候让开发人员当场了解他们为什么要做这样的事情了。但是,正如我所说,这段代码实际上不应该存在。应该由 DBA 授予此类权限。

如果它是合法用户需要它以 "dbo" 级别权限执行的现有存储过程,则可能需要使用 WITH EXECUTE AS xxxxx 修复存储过程,而不是授予个人此类权限。

与 SQL 服务器中的所有其他内容一样,"IT DEPENDS" 我所说的内容可能有一个非常罕见的例外,但我会找到一种不同的方法来使其工作,尤其是如果引用的 "user1" 是 public 人脸应用程序。