SQL Server 使用各服務的安全識別碼(SID),也稱為 服務安全主體,允許直接授予特定服務權限。 SQL Server 使用此方法授予引擎與代理服務權限(分別為 NT SERVICE\MSSQL$<InstanceName> 與 NT SERVICE\SQLAGENT$<InstanceName> )。 透過此方法,這些服務只能在服務運行時存取資料庫引擎。 更多資訊請參閱KB2620201(存檔連結)。
同樣的方法也可用於授予其他服務權限。 使用服務 SID 可以消除管理和維護服務帳號的負擔,並對系統資源授權提供更嚴格、更細緻的控制。
可用於服務 SID 的服務範例包括:
- 系統中心營運經理健康服務(NT SERVICE\HealthService)
- Windows Server 故障轉移叢集(WSFC)服務(NT SERVICE\ClusSvc)
有些服務預設沒有服務 SID。 服務 SID 必須使用 SC.exe建立。 此方法 已被 Microsoft 系統中心營運管理管理員採用,以授權 SQL Server 中的 HealthService 權限。
一旦服務 SID 建立並確認,必須在 SQL Server 中獲得權限。 授權透過使用 SQL Server Management Studio(SSMS) 或 Transact-SQL 查詢建立 Windows 登入來完成。 一旦建立登入,就可以被授予權限、加入角色,並像其他登入一樣映射到資料庫。
小提示
若收到錯誤 Login failed for user 'NT AUTHORITY\SYSTEM' ,請確認所需服務的服務 SID 是否存在,服務 SID 登入已在 SQL Server 中建立,且在 SQL Server 中已授予該服務 SID 適當的權限。
安全性
取消服務帳號
傳統上,服務帳號是用來讓服務登入 SQL Server。 服務帳號因為必須維護並定期更新服務帳號密碼,增加了額外的管理複雜度。 此外,服務帳號憑證也可能被個人用來隱藏其行為,當在該實例中執行操作時。
系統帳號的細粒權限
系統帳號歷來會透過建立LocalSystem(在en-us中為NT AUTHORITY\SYSTEM)或NetworkService(在en-us中為NT AUTHORITY\NETWORK SERVICE)的登入帳號並授予這些登入權限來獲得權限。 此方法可賦予任何程序或服務訪問 SQL 的權限,而 SQL 是以系統帳號形式執行。
使用服務 SID 可以授予特定服務權限。 服務只有在執行時才有權限存取它被賦予權限的資源。 例如,如果 HealthService 以 LocalSystem 執行並被授予 View Server State,那麼該 LocalSystem 帳號只有在 HealthService 的上下文中運行時才有權限View Server State。 若其他程序嘗試存取標示為 LocalSystem 的 SQL 伺服器狀態,則存取將被拒絕。
範例
A。 建立服務 SID
以下 PowerShell 指令將在系統中心營運管理員健康服務上建立服務 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. 授予服務安全識別碼權限
將管理可用性群組所需的權限授予叢集服務。
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 登入或將其從系統管理員伺服器角色中移除,可能會對連接 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 服務帳號與權限」。