如何防止 sysadmin 服务器角色执行存储过程

use*_*136 4 sql-server permissions role sql-server-2012

我有一个使用 SQL Server 身份验证的 SQL Server 默认实例和两个用户 User1 和 User2。

User1 具有公共服务器角色,而 User2 具有公共服务器角色 + sysadmin 服务器角色。

我创建了一个数据库 sptest1。在该数据库中,我创建了一个存储过程,sp_viewtbl并创建了一个架构。使用模式我已禁用为 User1 执行存储过程并且它可以工作。

如何拒绝具有 sysadmin 服务器角色的 User2 执行存储过程?

假设我创建了 User3 并授予了 sysadmin 和 public 权限。那么如何防止新用户执行相同的存储过程呢?sp_viewtbl即使他们具有系统管理员权限,我也必须防止其他人登录。

Ton*_*kle 14

不能拒绝 sysadmin 角色的成员对 SQL Server 中的任何内容的权限。DENY (Transact-SQL)的文档指出:

...除了 DENY 不适用于对象所有者或 sysadmin 固定服务器角色的成员。

因此,为了防止系统管理员运行存储过程,您需要将代码放入存储过程以检查用户是否为系统管理员,如果是则返回错误。但是,系统管理员可以通过以下方式轻松解决此问题:

  • 修改存储过程
  • 使用相同的代码创建一个新的存储过程并删除检查系统管理员的部分
  • 从 SQL 客户端运行相同的代码,减去检查 sysadmin 的部分
  • 使用 EXECUTE AS 以不同的用户身份运行该过程

如果您的目标是防止 sysadmin 用户看到敏感数据,那么实现的方法是使用Always Encrypted。这使用只有应用程序可以访问的密钥对数据进行加密和解密。如果系统管理员读取该表,他们只会看到加密的数据。