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

Han*_*non 11 sql-server-2005 sql-server mirroring

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

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

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

我一开始忘记了生产见证机器的黑洞,所以测试机器上的数据库仍然使用SQL03机器作为见证。注意到这个问题,我决定重新配置 TEST 上的数据库以指向新虚拟化的 TEST 见证,称之为TEST03.

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

ALTER DATABASE [TestDB] SET WITNESS = 'TCP://TEST03.domain.inet:5022';
Run Code Online (Sandbox Code Playgroud)

反应出乎意料:

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.
Run Code Online (Sandbox Code Playgroud)

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

为了让它工作,我需要LOGIN在测试见证上创建一个:

CREATE LOGIN [DOMAIN\SQLServiceAccount] FOR WINDOWS WITH DEFAULT_DATABASE [Master];
Run Code Online (Sandbox Code Playgroud)

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

GRANT CONNECT ON ENDPOINT::Mirroring TO [DOMAIN\SQLServiceAccount];
Run Code Online (Sandbox Code Playgroud)

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

如何检查生产见证端点以查看与其关联的安全性?

我假设必须有一些我可以检查的系统目录,但是 Books-on-Line 似乎没有任何特定于 Endpoints 的东西,而且 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';
Run Code Online (Sandbox Code Playgroud)

返回:

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
Run Code Online (Sandbox Code Playgroud)

和:

SELECT name, endpoint_id, protocol_desc, type_desc, role_desc 
FROM sys.database_mirroring_endpoints;
Run Code Online (Sandbox Code Playgroud)

返回:

name        endpoint_id  protocol_desc  type_desc           role_desc 
Mirroring   65536        TCP            DATABASE_MIRRORING  WITNESS
Run Code Online (Sandbox Code Playgroud)

sys.server_permissions镜像端点对象似乎没有条目。Nomajor_id和 nominor_id匹配 65536。此外,没有任何系统数据库包含对端点的任何引用。

我不知所措。

Han*_*non 7

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

文件中的相关部分:

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

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

如果每个服务器实例都在域服务帐户下运行,则可以对数据库镜像端点使用 Windows 身份验证。如果所有服务器实例都以相同的域用户帐户运行,则两个 master 数据库中都会自动存在正确的用户登录名。这简化了可用性数据库的安全配置,建议这样做。

如果托管可用性组的可用性副本的任何服务器实例以不同帐户运行,则必须在另一个服务器实例的 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'
Run Code Online (Sandbox Code Playgroud)

但是,在我在 SQL Server 2005 上的情况下,原始镜像端点不会出现在此查询的结果中 - 我认为这是因为它们的默认安全性允许对运行 SQL Server 的帐户进行 CONNECT 访问(如上所述)。

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