SQL Server:仅允许在某些存储过程上执行的权限

Posted

技术标签:

【中文标题】SQL Server:仅允许在某些存储过程上执行的权限【英文标题】:SQL Server : permissions to only allow execute on some stored procedures 【发布时间】:2018-09-28 20:28:45 【问题描述】:

我会以我从未负责过数据库安全作为开头,这对我来说真的很新鲜,所以如果问题不好,请原谅这个问题 - 我会尝试提供尽可能多的信息。我四处搜索,但没有详细了解我的具体问题。

我正在使用 SQL Server 2008 R2 数据库,我需要能够限制所有域用户,使其只能在明确定义时执行某些存储过程。如在所有数据库表/视图/存储过程上拒绝选择/更新/删除/等,但明确定义的某些存储过程除外(将存储过程上的执行权限授予 USER(以下域用户))。

我认为使用服务器角色会很容易,但似乎自定义服务器角色仅在 SQL Server 2012 及更高版本中可用,并且公共服务器角色授予对我所有表的选择访问权限。我读到拒绝总是优先于授予,因此我设置了一个数据库角色,将选择访问权限设置为拒绝,但用户仍然可以查询表。

这是我当前在包含 2 个数据库的 1 台服务器上的设置:

服务器级别:

登录:[域用户] - AD 组登录,因此所有用户都可以连接到服务器。具有服务器角色 Public。

数据库级别:

用户:[域用户] - AD 组,因此所有用户都可以连接到数据库。 数据库角色:[SP_Reader] - [域用户] 作为角色成员。我将所有表设置为拒绝访问 select,并将我希望用户执行的存储过程设置为在执行时授予。

问题是用户仍然可以从我的表中进行选择,就好像权限不存在一样。知道我在这里做错了什么吗?

【问题讨论】:

dba.stackexchange.com 的人可能更熟悉这个话题 虽然这个问题在这里是允许的,但在 DBA 常去的dba.stackexchange.com 上可能会得到更好的答复。 @JamesZ 好点,我也会在那里发帖。谢谢! 不,不要重复发帖,在你发帖后在这里删除你的帖子。 存储的过程是数据库安全的,所以你需要在数据库级别分配过程权限。为登录创建一个登录名、数据库用户,并仅授予用户可以执行的那些 proc 的 exec 权限。无需使用拒绝使事情变得过于复杂,因为除非被授予,否则用户将没有权限。 【参考方案1】:

问题原来是“db_datareader”角色被分配给数据库用户,而我的自定义数据库角色 (SP_Reader) 只提供对某些存储过程的执行。

当我查询“sys.database_permissions”时,没有注意到“db_datareader”角色,它不显示隐式授予的权限。

我最终找到了这个Microsoft link,它提供了一个返回所有数据库角色成员的查询:

SELECT DP1.name AS DatabaseRoleName,   
   isnull (DP2.name, 'No members') AS DatabaseUserName   
 FROM sys.database_role_members AS DRM  
 RIGHT OUTER JOIN sys.database_principals AS DP1  
   ON DRM.role_principal_id = DP1.principal_id  
 LEFT OUTER JOIN sys.database_principals AS DP2  
   ON DRM.member_principal_id = DP2.principal_id  
WHERE DP1.type = 'R'
ORDER BY DP1.name;

或者,这个内部存储过程会为您作为参数传递的任何角色返回结果:

EXEC sp_helprolemember 'db_datareader';

【讨论】:

以上是关于SQL Server:仅允许在某些存储过程上执行的权限的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 2005 中的内置数据库角色允许执行存储过程?

SQL Server——存储过程

SQL Server T—SQL 存储过程 触发器

如何在 SQL Developer 中执行 SQL Server 存储过程?

SQL Server基础操作(此随笔仅作为本人学习进度记录七 !--存储过程)

SQL SERVER存储过程一