如何检查SQL Server端点的安全设置?


10

我正在为我们的SQL Server开发人员创建一个TEST环境。

在生产中,我们有3个SQL Server,SQL01其中包含多个镜像到的数据库SQL02SQL03在“具有自动故障转移功能的高安全性”或同步配置中充当见证人。

我已经使用VMWare P2V将所有三台计算机虚拟化到单独的硬件上,重新配置了计算机的SID,并从这些新计算机中清除了生产服务器的IP地址。

我起初忘记给生产见证机器加黑洞,因此​​TEST机器上的数据库仍将SQL03机器用作见证。注意到这个问题,我决定在TEST上重新配置数据库,以指向新虚拟化的TEST见证者,称之为TEST03

要重新配置数据库以使用新的见证服务器,我在主服务器上输入了以下命令TEST01

ALTER DATABASE [TestDB] SET WITNESS = 'TCP://TEST03.domain.inet:5022';

响应是意外的:

The ALTER DATABASE command could not be sent to the remote server instance
'TCP://TEST03.domain.inet:5022'.  The database mirroring configuration was
not changed.  Verify that the server is connected, and try again.

我对这个错误消息非常困惑,因为该配置在生产机器上确实有效,并且在测试机器上没有进行任何修改。

为了使它起作用,我需要LOGIN在测试见证人上创建一个:

CREATE LOGIN [DOMAIN\SQLServiceAccount] FOR WINDOWS WITH DEFAULT_DATABASE [Master];

并且GRANTCONNECT有问题的端点的权利:

GRANT CONNECT ON ENDPOINT::Mirroring TO [DOMAIN\SQLServiceAccount];

然后,我能够成功地将TEST环境上的镜像数据库指向新的测试见证人。

我如何检查生产见证端点,以了解与之关联的安全性?

我假设必须要检查一些系统目录,但是联机丛书似乎没有特定于端点的任何东西,并且Bing很好,Bingless ...


附加信息:

SELECT ep.endpoint_id, p.class_desc, p.permission_name, ep.name, sp.name 
FROM sys.server_permissions p
    INNER JOIN sys.endpoints ep ON p.major_id = ep.endpoint_id
    INNER JOIN sys.server_principals sp ON p.grantee_principal_id = sp.principal_id
WHERE class = '105';

返回:

endpoint_id class_desc  permission_name endpoint_name   principal_name
2           ENDPOINT    CONNECT TSQL    Local Machine   public
3           ENDPOINT    CONNECT TSQL    Named Pipes     public
4           ENDPOINT    CONNECT TSQL    Default TCP     public
5           ENDPOINT    CONNECT TSQL    Default VIA     public

和:

SELECT name, endpoint_id, protocol_desc, type_desc, role_desc 
FROM sys.database_mirroring_endpoints;

返回值:

name        endpoint_id  protocol_desc  type_desc           role_desc 
Mirroring   65536        TCP            DATABASE_MIRRORING  WITNESS

sys.server_permissions镜像端点对象似乎没有任何输入。否major_id,没有minor_id匹配项65536。而且,所有系统数据库都不包含对端点的任何引用。

我很茫然。

Answers:


7

在花了一天的时间处理在DEV环境中从服务器到服务器的镜像数据库为迁移到SQL Server 2012做准备之后,我遇到了这个 MSDN文档,文档解释了ENDPOINT安全性完全取决于帐户类型SQL Server正在运行。如果SQL Server使用域帐户,则该帐户将自动具有对端点的访问权限。如果SQL Server使用内置帐户(例如[网络服务]或[本地系统]等),则必须为端点配置安全证书,并且只有证书持有者才能访问该端点。

该文件的相关部分:

确定数据库镜像端点的身份验证类型

重要的是要了解,服务器实例的SQL Server服务帐户确定可用于数据库镜像端点的身份验证类型,如下所示:

如果每个服务器实例都在域服务帐户下运行,则可以将Windows身份验证用于数据库镜像终结点。如果所有服务器实例均以相同的域用户帐户运行,则两个主数据库中都会自动存在正确的用户登录名。建议您简化可用性数据库的安全配置。

如果承载可用性组的可用性副本的任何服务器实例都以不同的帐户运行,则必须在另一个服务器实例上的master中创建每个帐户的登录名。然后,必须授予该登录名CONNECT权限才能连接到该服务器实例的数据库镜像端点。

如果您的服务器实例使用Windows身份验证,则可以使用Transact-SQL,PowerShell或“新建可用性组向导”来创建数据库镜像终结点。

注意:

如果要承载可用性副本的服务器实例缺少数据库镜像端点,则“新建可用性组向导”可以自动创建使用Windows身份验证的数据库镜像端点。

如果任何服务器实例都在内置帐户(例如本地系统,本地服务或网络服务)或非域帐户下运行,则必须使用证书进行端点身份验证。如果将证书用于数据库镜像端点,则系统管理员必须将每个服务器实例配置为在出站和入站连接上都使用证书。

没有使用证书配置数据库镜像安全性的自动化方法。您将需要使用CREATE ENDPOINT Transact-SQL语句或New-SqlHadrEndpoint PowerShell cmdlet。有关更多信息,请参见CREATE ENDPOINT(Transact-SQL)。

Remus Rusanu(在回答中)正确地确定了如何确定镜像端点上的安全性;如:

SELECT ep.name, sp2.name AS Grantee, sp.name AS Grantor, p.permission_name, ep.state_desc
FROM sys.server_permissions p 
    INNER JOIN sys.endpoints ep ON p.major_id = ep.endpoint_id
    INNER JOIN sys.server_principals sp ON p.grantor_principal_id = sp.principal_id
    INNER JOIN sys.server_principals sp2 ON p.grantee_principal_id = sp2.principal_id
WHERE p.class_desc = 'ENDPOINT' AND ep.type_desc = 'DATABASE_MIRRORING'

但是,以我为例,在SQL Server 2005上,原始镜像端点未显示在该查询的结果中-我认为这是因为它们的默认安全性允许CONNECT访问SQL Server正在其下运行的帐户(如上所述)。

因此,该问题的规范答案是:如何知道谁对ENDPOINT具有CONNECT访问权限,是上述查询的总和,SQL Server正在使用的帐户以及您配置的对端点访问权限的所有可能的证书。


4

我刚好在生产环境中为数据库设置了此功能,并且想知道同一件事,因为我需要将配置与另一个镜像会话进行比较以确保我正确地匹配了它。

sys.dm_db_mirroring_connections应该为您提供您想要的。它包含的principal_name是:

经过连接权限验证的登录名。对于Windows身份验证,此值为远程用户名。对于证书身份验证,此值为证书所有者。

如果您正在使用已暂停的会话,尽管我不确定它是否仍会返回信息,请相信它只有活动的连接。


谢谢,肖恩 这肯定显示了实际上已连接到端点的远程用户名,但是它并没有真正回答允许用户在生产中(而不是在测试中)进行连接的安全设置问题。无论如何,我感谢您的帮助!
马克斯·弗农

3

请参阅联机丛书文档,以了解 sys.database_mirroring_endpoints

对于服务器对象权限,请查看通常的位置sys.server_permissions。与涉及Windows安全性的每种情况一样,由于Windows组成员身份,事情变得更加复杂,并且您还必须考虑权限层次结构


我查看了一下,但是我需要的是具有对端点的CONNECT访问权限的登录列表。sys.database_mirroring_endpoints似乎并不表明这一点-除非我缺少什么!
Max Vernon

1
对于服务器对象权限,请查看通常的位置sys.server_permissions。与涉及Windows安全性的每种情况一样,由于Windows组成员身份,事情变得更加复杂,并且您还必须考虑权限层次结构
Remus Rusanu 2012年

3
您是否有机会在答案本身中对此进行详细说明?
jcolebrand
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.