如何在SQL Server 2008中分配整个Active Directory组安全访问权限?


40

我想在我的内部应用程序中使用集成安全性,这些应用程序都在一个域中。不幸的是,我从来没有能够使它正常工作。我想在SQL Server中为整个Exchange(活动目录)组分配一个角色,以对某些表进行读/写访问。这样,我就不必在雇用某人时就创建一个运算符,也不必在被解雇时就删除一个运算符。这可能吗?我要采取什么步骤?

Answers:


48
  • 将AD组设置为登录名。“登录”表示服务器级别登录,而不是用户/登录的AD概念。用SQL Server来说,这是服务器级别的主体
  • 在中创建一个映射用户。您不应真正允许用户直接在表上使用。“用户”是指数据库用户,不是AD用户的概念:在SQL Server中,这是“数据库级主体”
  • 将用户添加到角色(也是“数据库级主体”)
  • 对表上的角色的GRANT权限(表或proc等是“安全的”)

样例脚本

USE master;
GO
CREATE LOGIN [MYDOMAIN\APPLICATION SUPPORT] FROM WINDOWS;
GO
USE mydb;
GO
CREATE USER [MYDOMAIN\APPLICATION SUPPORT] FROM LOGIN [MYDOMAIN\APPLICATION SUPPORT];
GO
CREATE ROLE rSupport;
GO
EXEC sp_addrolemember 'rSupport', 'MYDOMAIN\APPLICATION SUPPORT';
GO
GRANT SELECT, INSERT,UPDATE, etc ON Mytable TO rSupport;
GO

sp_addrolemember从SQL Server 2012开始不推荐使用,ALTER ROLE应改为在其中使用。


3
有助于解释为什么您应该为角色而不是SQL用户(在本例中为AD组)分配权限。
德鲁·查平

也许您的意思是“ 登录[...] 创建用户”,而不是“从登录”?
Agostino

创建用户... 用于登录...; 和CREATE USER ... FROM LOGIN ...; 两者都对我有用(MSSQL2016)。不确定是否有区别?
反向工程师


4

在SQL Server中向AD组授予权限相对简单。可以通过T-SQL或Management Studio来完成。

例如,如果您有一个名为的AD组MYDOMAIN\APPLICATION SUPPORT,则可以在服务器级别创建登录名,然后使用到各个数据库的映射来提供更细化的权限,例如数据读取器。

理想情况下,所有应用程序访问都应通过存储过程*进行,因此只需要对该数据库中的那些存储过程具有执行权限。

*从安全角度考虑,要允许特定用户查看某些特定数据,您可以创建一个过程并授予该用户对该过程的执行权限,而不能执行其他任何操作。允许用户直接查询将意味着对所有涉及的表给予选择权限。使用过程也更容易,调试也更容易。

存储过程将表访问抽象化并限制了访问。对于DBA类型,这就像“让我看到您所有的实例变量:我不想使用方法,getter或setter”。


3

marc_s回答“如何在SQL Server中添加Active Directory用户组作为登录名”

在SQL Server Management Studio中,转到Object Explorer > (your server) > Security > Logins并右键单击New Login

在此处输入图片说明

然后在弹出的对话框中,选择要查看的对象类型(Groups默认情况下处于禁用状态-选中它!),然后选择要在其中查找对象的位置(例如使用Entire Directory),然后找到广告组。

在此处输入图片说明

现在,您具有常规的SQL Server登录名-就像为单个AD用户创建登录名一样。给该新登录名所需的数据库权限,然后就可以使用!

该AD组的任何成员现在都可以登录SQL Server并使用您的数据库。


2
链接到该SO答案可能很有用,但是您没有在帖子中添加任何新内容。您可能刚刚将链接发布为评论。
Andriy M

2
答案有一个不错的屏幕截图,用于检查“对象类型”下的“组”,因为这是我在尝试执行此操作时所缺少的。我认为,链接没有以有用的方式显示它。只是想帮助下一个人...
甚至Mien

你什么意思?通常会在其后出现一个链接,并且每个跟随该链接的人都会看到您在说的漂亮截图,以及您在此处重新发布的所有其他内容。不过,我不会争论,只是让您知道我的观点是不变的:链接(在评论中)也一样。
Andriy M

4
我的看法也没有改变。评论中的链接所传达的信息与网页上的实际图像所传达的信息不同。“显示,不要告诉。”
甚至Mien

1

如果用户是在SQL中具有Sysadmin权限的DOMAIN \ SecurityGroup的成员,则在访问数据库时将使用该成员。否则,您需要查看在每个数据库中赋予了DOMAIN \ SecurityGroup哪些权限。如果用户是2个SecurityGroups的成员,并且SecGroupA具有选择权限,而SecGroupB具有插入权限,则用户可以选择并插入。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.