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

#1 楼


将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

评论


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

–德鲁·查平(Drew Chapin)
15年10月16日在18:07

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

– Agostino
16-10-4在15:56

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

–反向工程师
18年3月16日在16:40

不,两者都是有效的docs.microsoft.com/en-us/sql/t-sql/statements/…

– gbn
18年3月16日在22:13

#2 楼

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

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



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



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

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

评论


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

– Andriy M
16 Mar 1 '16 at 6:58

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

–连面
16-3-2在20:37



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

– Andriy M
16-3-2在20:47

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

–连面
16-3-2在22:54

#3 楼

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

例如,如果您有一个名为MYDOMAIN\APPLICATION SUPPORT的AD组,则可以在服务器级别创建登录名,然后使用到各个数据库的映射

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

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

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

#4 楼

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