【发布时间】: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 权限。无需使用拒绝使事情变得过于复杂,因为除非被授予,否则用户将没有权限。
标签: sql sql-server tsql sql-server-2008-r2