使用服务 SID 授予对 SQL Server 中的服务的访问权限

SQL Server 使用每个服务的安全标识符 (SID)(也称为服务安全主体)来允许直接授予对特定服务的访问权限。 SQL Server 使用此方法来授予对引擎和代理服务的访问权限(分别为 NT SERVICE\MSSQL$<InstanceName> 和 NT SERVICE\SQLAGENT$<InstanceName> )。 若使用此方法,这些服务只能在服务运行时访问数据库引擎。 有关详细信息,请参阅 KB2620201(存档链接)

授予对其他服务的访问权限时,可以使用相同的方法。 使用服务 SID 可以消除管理和维护服务帐户的开销,并对授予系统资源的权限提供更严格、更精细的控制。

可以使用服务 SID 的服务示例包括:

  • System Center Operations Manager 运行状况服务 (NT SERVICE\HealthService)
  • Windows Server 故障转移群集 (WSFC) 服务 (NT SERVICE\ClusSvc)

默认情况下,某些服务没有服务 SID。 必须使用 SC.exe 创建服务 SID。 Microsoft System Center Operations Manager 管理员已采用此方法授予对 SQL Server 中的 HealthService 的访问权限。

创建并确认了服务 SID 后,必须授予它在 SQL Server 中的权限。 使用 SQL Server Management Studio (SSMS) 或查询创建 Windows 登录名,从而完成权限授予。 创建登录名后,就可以像其他登录名一样授予其权限、将其添加到角色以及映射到数据库。

提示

如果收到错误 Login failed for user 'NT AUTHORITY\SYSTEM',请验证所需服务的服务 SID 是否存在、是否在 SQL Server 中创建了服务 SID 登录名,以及是否已在 SQL Server 中为该服务 SID 授予了相应权限。

安全性

消除服务帐户

传统上,服务帐户已用于允许服务登录到 SQL Server。 由于必须维护和定期更新服务帐户密码,因此服务帐户会增加额外的管理复杂性。 此外,在实例中执行操作时,个人可能会尝试使用服务帐户凭据来掩盖其活动。

系统帐户的具体权限

系统历来通过为 LocalSystemNT AUTHORITY\SYSTEM,语言为 en-us)或 NetworkServiceNT AUTHORITY\NETWORK SERVICE,语言为 en-us)帐户创建登录名并授予这些登录名权限,来授予系统帐户权限。 此方法在以系统帐户运行的 SQL 中授予任何进程或服务权限。

使用服务 SID 允许对特定服务授予权限。 该服务在运行时只能访问已授予权限的资源。 例如,如果 HealthService 作为 LocalSystem 运行并被授予 View Server State,则 LocalSystem 帐户仅在 HealthService 的上下文中运行时才具有对 View Server State 的权限。 如果任何其他进程尝试像 LocalSystem 一样访问 SQL 的服务器状态,则将被拒绝访问。

示例

A. 创建服务 SID

以下 PowerShell 命令将在 System Center Operations Manager 运行状况服务上创建服务 SID。

sc.exe --% sidtype "HealthService" unrestricted

重要

--% 告诉 PowerShell 停止解析命令的其余部分。 这在使用旧版命令和应用程序时很有用。

B. 查询服务 SID

要检查服务 SID 或确保存在服务 SID,请在 PowerShell 中执行以下命令。

sc.exe --% qsidtype "HealthService"

重要

--% 告诉 PowerShell 停止解析命令的其余部分。 这在使用旧版命令和应用程序时很有用。

°C 添加新创建的服务 SID 作为登录名

以下示例使用 T-SQL 为 System Center Operations Manager 运行状况服务创建登录名。

CREATE LOGIN [NT SERVICE\HealthService] FROM WINDOWS
GO

D. 添加现有服务 SID 作为登录名

以下示例使用 T-SQL 为群集服务创建登录名。 授予群集服务权限可避免向系统帐户授予过多权限。

CREATE LOGIN [NT SERVICE\ClusSvc] FROM WINDOWS
GO

E. 授予服务 SID 权限

向群集服务授予管理可用性组所需的权限。

GRANT ALTER ANY AVAILABILITY GROUP TO [NT SERVICE\ClusSvc]
GO

GRANT CONNECT SQL TO [NT SERVICE\ClusSvc]
GO

GRANT VIEW SERVER STATE TO [NT SERVICE\ClusSvc]
GO

注意

删除服务 SID 登录名或将其从 sysadmin 服务器角色中删除可能会导致连接到 SQL Server 数据库引擎的各种 SQL Server 组件出现问题。 一些问题如下:

对于 SQL Server 的默认实例,可以通过使用以下 Transact-SQL 命令添加服务 SID 来纠正这种情况:

CREATE LOGIN [NT SERVICE\MSSQLSERVER] FROM WINDOWS WITH DEFAULT_DATABASE=[master], DEFAULT_LANGUAGE=[us_english]

ALTER ROLE sysadmin ADD MEMBER [NT SERVICE\MSSQLSERVER]

CREATE LOGIN [NT SERVICE\SQLSERVERAGENT] FROM WINDOWS WITH DEFAULT_DATABASE=[master], DEFAULT_LANGUAGE=[us_english]

ALTER ROLE sysadmin ADD MEMBER [NT SERVICE\SQLSERVERAGENT]

对于 SQL Server 的命名实例,可以使用以下 Transact-SQL 命令:

CREATE LOGIN [NT SERVICE\MSSQL$SQL2019] FROM WINDOWS WITH DEFAULT_DATABASE=[master], DEFAULT_LANGUAGE=[us_english]

ALTER ROLE sysadmin ADD MEMBER [NT SERVICE\MSSQL$SQL2019]

CREATE LOGIN [NT SERVICE\SQLAgent$SQL2019] FROM WINDOWS WITH DEFAULT_DATABASE=[master], DEFAULT_LANGUAGE=[us_english]

ALTER ROLE sysadmin ADD MEMBER [NT SERVICE\SQLAgent$SQL2019]

在此示例中,SQL2019 是 SQL Server 的实例名称。

后续步骤

有关服务 SID 结构的详细信息,请参阅 SERVICE_SID_INFO 结构

了解创建登录名时可用的其他选项。

要将基于角色的安全性与服务 SID 一起使用,请参阅 SQL Server 中的创建角色

了解向 SQL Server 中的服务 SID 授予权限的不同方法。

有关配置 SQL Server 服务帐户的详细信息,请参阅配置 Windows 服务帐户和权限