SQL 服务器:仅允许在某些存储过程上执行的权限
SQL Server : permissions to only allow execute on some stored procedures
首先,我从来没有负责过数据库安全,这对我来说真的很陌生,所以请原谅这个问题是否不好 - 我会尽量提供尽可能多的信息。我四处搜索,但没有详细了解我的具体问题。
我正在使用 SQL Server 2008 R2 数据库,我需要能够限制所有域用户在明确定义时只能执行某些存储过程。就像在所有数据库 tables/views/stored 过程上拒绝 select/update/delete/etc,除了明确定义的一些存储过程(将存储过程授予用户(下面的域用户)执行)。
我认为使用服务器角色这会很容易,但似乎自定义服务器角色仅在 SQL Server 2012 及更高版本中可用,并且 public 服务器角色授予 select 访问权限在我所有的桌子上。我读到拒绝总是优先于授予,所以我设置了一个数据库角色,将 select 访问权限设置为拒绝,但用户仍然可以查询表。
这是我在包含 2 个数据库的 1 台服务器上的当前设置:
服务器等级:
- 登录:[域用户] - AD 组登录,这样所有用户都可以连接到服务器。具有服务器角色 Public.
数据库级别:
- 用户:[域用户] - AD 组,因此所有用户都可以连接到数据库。
- 数据库角色:[SP_Reader] - [域用户] 作为角色成员。安全对象我将所有表都设置为拒绝对 select 的访问,并将我希望用户执行的存储过程设置为在执行时授予。
问题是用户仍然可以从我的表中select,就好像权限不存在一样。知道我在这里做错了什么吗?
问题原来是 'db_datareader' 角色除了我的自定义数据库角色 (SP_Reader) 之外还分配给了数据库用户,该角色仅提供对某些存储过程的执行。
'db_datareader' 角色未被注意到,因为我正在查询 'sys.database_permissions',它不显示隐式授予的权限。
我最终找到了这个 Microsoft link,它提供了一个查询 returns 所有数据库角色的成员:
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;
或者,此内部存储过程 returns 为您作为参数传递的任何角色生成结果:
EXEC sp_helprolemember 'db_datareader';
首先,我从来没有负责过数据库安全,这对我来说真的很陌生,所以请原谅这个问题是否不好 - 我会尽量提供尽可能多的信息。我四处搜索,但没有详细了解我的具体问题。
我正在使用 SQL Server 2008 R2 数据库,我需要能够限制所有域用户在明确定义时只能执行某些存储过程。就像在所有数据库 tables/views/stored 过程上拒绝 select/update/delete/etc,除了明确定义的一些存储过程(将存储过程授予用户(下面的域用户)执行)。
我认为使用服务器角色这会很容易,但似乎自定义服务器角色仅在 SQL Server 2012 及更高版本中可用,并且 public 服务器角色授予 select 访问权限在我所有的桌子上。我读到拒绝总是优先于授予,所以我设置了一个数据库角色,将 select 访问权限设置为拒绝,但用户仍然可以查询表。
这是我在包含 2 个数据库的 1 台服务器上的当前设置:
服务器等级:
- 登录:[域用户] - AD 组登录,这样所有用户都可以连接到服务器。具有服务器角色 Public.
数据库级别:
- 用户:[域用户] - AD 组,因此所有用户都可以连接到数据库。
- 数据库角色:[SP_Reader] - [域用户] 作为角色成员。安全对象我将所有表都设置为拒绝对 select 的访问,并将我希望用户执行的存储过程设置为在执行时授予。
问题是用户仍然可以从我的表中select,就好像权限不存在一样。知道我在这里做错了什么吗?
问题原来是 'db_datareader' 角色除了我的自定义数据库角色 (SP_Reader) 之外还分配给了数据库用户,该角色仅提供对某些存储过程的执行。
'db_datareader' 角色未被注意到,因为我正在查询 'sys.database_permissions',它不显示隐式授予的权限。
我最终找到了这个 Microsoft link,它提供了一个查询 returns 所有数据库角色的成员:
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;
或者,此内部存储过程 returns 为您作为参数传递的任何角色生成结果:
EXEC sp_helprolemember 'db_datareader';