SQL Server 使用每个服务的安全标识符(SID),也称为 服务安全主体,以允许直接向特定服务授予权限。 SQL Server 使用此方法分别授予引擎和代理服务(NT SERVICE\MSSQL$<InstanceName> 和 NT SERVICE\SQLAGENT$<InstanceName> )的权限。 使用此方法,这些服务只能在服务运行时访问数据库引擎。 有关详细信息,请参阅KB2620201(存档链接)。
向其他服务授予权限时,可以使用此方法。 使用服务 SID 可以消除管理和维护服务帐户的开销,并更严格、更精细地控制授予系统资源的权限。
可以使用服务 SID 的服务示例包括:
- System Center Operations Manager Health Service(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) 或 Transact-SQL 查询创建 Windows 登录名来实现的。 创建登录名后,可以向其授予权限、添加到角色,并像任何其他登录名一样映射到数据库。
小窍门
如果收到错误 Login failed for user 'NT AUTHORITY\SYSTEM' ,请验证所需的服务是否存在服务 SID,在 SQL Server 中创建服务 SID 登录名,并向 SQL Server 中的服务 SID 授予相应的权限。
安全性
消除服务帐户
传统上,服务帐户已用于允许服务登录到 SQL Server。 服务帐户增加了额外的管理复杂性层,因为必须维护和定期更新服务帐户密码。 此外,服务帐户凭据可以被试图在实例中执行操作时掩饰其活动的个人使用。
对系统帐户的细粒度权限
系统帐户以前已通过为 LocalSystem (en-us中的 NT AUTHORITY\SYSTEM )或 NetworkService (en-us中的 NT AUTHORITY\NETWORK SERVICE )帐户创建登录名并授予这些登录权限来授予权限。 此方法向作为系统帐户运行的 SQL 授予任何进程或服务权限。
使用服务 SID 可向特定服务授予权限。 服务在运行时仅能访问其已被授予权限的资源。 例如,如果HealthService以LocalSystem身份运行且被授予View Server State,则LocalSystem账户只有在其在HealthService的上下文中运行时,才有权限View Server State。 如果任何其他进程尝试访问 SQL LocalSystem的服务器状态,将被拒绝访问。
例子
答: 创建服务 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 为群集服务创建登录名。 直接向群集服务授予权限无需向 SYSTEM 帐户授予过多权限。
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 代理无法启动或连接到 SQL Server 服务
- SQL Server 安装程序遇到以下Microsoft知识库文章中提到的问题: https://mskb.pkisolutions.com/kb/955813
对于 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 服务帐户和权限”。