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 Developer 中执行 SQL Server 存储过程?