SQL Server 服務啟動帳號權限過高是重大安全隱患:一旦駭客取得 sysadmin 或透過 SQL 注入執行 xp_cmdshell、xp_regdeletekey 等擴展預存程序,即可以服務帳號身分執行任意作業系統指令。本文詳述如何建立最小權限的專用服務帳號,並透過企業管理器/Configuration Manager 正確套用。
風險根源:擴展預存程序的執行身分
- 擴展預存程序 (
xp_cmdshell, sp_OA*, xp_reg*...) 在 SQL Server 進程空間內載入 DLL 執行。
- 其作業系統存取權限 完全繼承自 SQL Server 服務啟動帳號的 SID。
- 若服務帳號屬於 Administrators 群組 → 駭客可刪除系統檔案、修改登錄、建立後門、橫向移動。
最小權限服務帳號建立步驟 (成員伺服器)
1. 建立本地/網域專用帳號
-- 本地帳號範例
User: sqlsvc
Password: 複雜長密碼 (16+ 字元)
Description: SQL Server 服務專用帳號 - 最小權限
2. 指派必要的三項基礎權限
| 權限項目 | 用途 | 設定位置 |
| 資料庫安裝目錄 讀寫權限 | 存取 .mdf/.ldf/.bak/錯誤日誌/FTData 等 | 檔案總管 → 安全性 → 編輯 → 加入 sqlsvc → 修改/讀取/寫入 |
| 以服務登入 (SeServiceLogonRight) | 允許帳號啟動 Windows 服務 | secpol.msc → 本地原則 → 使用者權利指派 |
| 讀取登錄權限 | 讀取 HKLM\Software\Microsoft\MSSQLServer 等啟動參數 | regedit → 權限 → 加入 sqlsvc → 讀取 |
3. 進階權限 (視功能需求額外授予)
-- 以下權限僅在必要時授予 (透過 secpol.msc)
SeBatchLogonRight -- SQL Agent 作業步驟需求
SeLockMemoryPrivilege -- AWE / 大頁面 / 記憶體鎖定
SeChangeNotifyPrivilege -- 繞過遍歷檢查 (效能優化)
SeAssignPrimaryTokenPrivilege -- 取代程序 Token (部分擴展程序需求)
4. 使用企業管理器 / Configuration Manager 套用 (關鍵步驟)
- 開啟 SQL Server Configuration Manager (SQL 2005+) 或企業管理器 (SQL 2000)。
- 右鍵 SQL Server (MSSQLSERVER) 服務 → 「屬性」 → 「登入」分頁。
- 選擇「此帳號」,輸入
.\sqlsvc (本地) 或 DOMAIN\sqlsvc 及密碼。
- 按下「確定」 → 工具會自動完成:
- 授予資料庫目錄完整控制權
- 授予「以服務登入」等使用者權利
- 設定登錄機碼 ACL
- 註冊 SPN (網域環境)
- 重啟 SQL Server 服務生效。
驗證與審計
- 確認服務啟動成功:錯誤日誌無 7000/7038 事件。
- 檢查有效權限:以 sqlsvc 身分登入 → 執行
whoami /priv 核對權限清單。
- 滲透測試驗證:使用
sysadmin 執行 xp_cmdshell 'whoami' → 應回傳 sqlsvc 而非 administrator。
常見錯誤與避坑指南
| 錯誤做法 | 後果 | 正確做法 |
| 直接在 services.msc 變更帳號 | 遺漏 ACL/權限自動設定,導致服務啟動失敗或權限不足 | 必須用 Configuration Manager / 企業管理器變更 |
| 頻繁更換服務帳號 | 登錄殘留大量舊帳號 SID,膨脹 Registry、潛在安全風險 | 固定專用帳號,極少變更 |
| 授予本機 Administrators | 喪失最小權限防護,擴展程序可任意控制作業系統 | 僅授予上表三項基礎權限 + 功能必要權限 |
| 忽略 SQL Agent 帳號 | Agent 作業步驟 (CmdExec/PowerShell) 同樣繼承高權限 | Agent 同樣使用最小權限帳號 (可共用或分離) |
網域控制站 (DC) / 叢集環境補充
- DC 上運行 SQL Server:服務帳號需具備「以服務登入」+「允許本地登入」+ 網域控制站特定權限,建議不要在 DC 安裝 SQL Server。
- 容錯移轉叢集:服務帳號需為網域帳號,於叢集所有節點具備相同權限;建立時勾選「叢集服務帳號」選項。
- 群組受控服務帳號 (gMSA, Windows 2012+):自動密碼輪換、SPN 管理,為現代最佳選擇。
總結
「最小權限服務帳號」是纖深防禦的關鍵一環。配合 停用 xp_cmdshell、移除高風險擴展程序、啟用稽核、定期修補,可將 SQL Server 攻擊面壓縮至最小。請立即檢視您的生產環境服務帳號權限,若為 Administrator/Local System,請排程變更為專用最小權限帳號。
- 上一篇文章: 使用 T-SQL 批次匯入目錄下所有檔案到 SQL Server (BULK INSERT / BCP)
- 下一篇文章: SQL Server CHARINDEX 與 PATINDEX 字串搜尋函數深度解析
Copyright ©
程式碼之家 All Rights Reserved