默認安裝下 SQL Server 以 LocalSystem 或 Administrators 高權限運行,一旦遭注入攻擊 (如 xp_cmdshell),攻擊者即獲得系統級控制權。本文演示在 Windows Server 2003 上創建專用低權限服務賬號、配置文件系統 ACL、修改服務登錄身份,將 SQL Server 降權運行,構建纏深防御第一道防線。
核心原則
- 最小權限:服務賬號僅具備運行 SQL Server 所需的最小文件/註冊表/網絡權限。
- 隔離性:專用賬號不屬於任何內建組 (Users/Power Users/Administrators),無交互登錄權限。
- 可審計:專用賬號行為可單獨審計,異常即時告警。
步驟 1:創建專用服務賬號
開始 → 管理工具 → 計算機管理 → 系統工具 → 本地用戶和組 → 用戶
- 右鍵「新用戶」:
- 用戶名:
mssqlrun
- 密碼:強複雜密碼 (16+ 字符,大小寫數字符號)
- ✅ 「密碼永不過期」 (服務賬號建議)
- ✅ 「用戶不能更改密碼」
- ❌ 「用戶下次登錄時必須更改密碼」
- 點擊「創建」→「關閉」
步驟 2:配置 SQL Server 安裝目錄 ACL (關鍵)
安裝盤根目錄 (如 D:\):
- 右鍵屬性 → 安全 → 編輯 → 添加
mssqlrun
- 權限:✅ 讀取、✅ 列出文件夾內容、❌ 讀取和執行、❌ 寫入、❌ 修改、❌ 完全控制
- 目的:服務啟動需讀取二進制文件,無需執行/寫入根目錄。
安裝程序目錄 (如 D:\MSSQL\):
- 移除
SYSTEM、Administrators (保留備份)
- 添加
mssqlrun → ✅ 完全控制
- 遞應用到子文件夾/文件
- 目的:數據文件、日志文件、備份目錄、錯誤日志均需讀寫刪除權限。
步驟 3:修改 SQL Server 服務登錄身份
打開 服務 (services.msc) → 找到 MSSQLSERVER (或命名實例 MSSQL$InstanceName) → 右鍵屬性 → 登錄標籤
- 選中「此賬戶」
- 瀏覽 → 輸入
mssqlrun → 檢查名稱 → 確定
- 輸入密碼、確認密碼
- 點擊「應用」→ 系統彈出:「新的登錄名只有在您停止並重啟服務時才可生效」→ 確定
- 右鍵服務 → 重新啟動
步驟 4:驗證與後續加固
- 任務管理器 → 進程 →
sqlservr.exe → 用戶名顯示 mssqlrun ✅
- SSMS 連接正常,業務功能測試通過 ✅
- 禁用 xp_cmdshell:
sp_configure 'xp_cmdshell', 0; RECONFIGURE (若業務確需,見文章 48736 受控開放方案)
- 禁用 OLE Automation:
sp_configure 'Ole Automation Procedures', 0; RECONFIGURE
- 審計登錄失敗:本地安全策略 → 審計策略 → 審計登錄事件 → 成功/失敗 ✅
- 防火牆限制:僅開放 1433 (或自定義端口) 給應用服務器 IP 段。
常見問題排查
| 現象 | 可能原因 | 解決 |
| 服務啟動失敗 (錯誤 1069/1053) | 密碼錯誤、賬號被鎖定、無「作為服務登錄」權限 | 本地安全策略 → 用戶權限分配 → 作為服務登錄 → 添加 mssqlrun |
| 數據庫掛載/備份失敗 | 數據/日志/備份目錄 ACL 缺失 | 檢查步驟 2 程序目錄權限是否遞歸生效 |
| SQL Agent 無法啟動 | Agent 服務仍用 LocalSystem,需同步修改為 mssqlrun 或獨立代理賬號 | 修改 SQLSERVERAGENT 服務登錄身份同步 |
| 連接鏈接服務器失敗 | 鏈接服務器映射賬號權限不足 | 配置鏈接服務器安全性映射為具體遠程賬號 |
現代系統適用性說明
Windows Server 2003 已停止主流支持 (2015),生產環境禁止使用。但「專用低權限服務賬號 + 目標目錄 ACL + 禁用高危擴展」此核心加固模式**完全適用於 Windows Server 2012/2016/2019/2022 + SQL Server 2012/2014/2016/2017/2019/2022**。新版本額外享有:
- 托管服務賬號 (gMSA) 自動密碼輪換
- 虛擬帳號 (NT SERVICE\MSSQLSERVER) 無需建立賬號即享最小權限
- Windows Defender ATP / Defender for Identity 行為監控
降權運行是資料庫服務器安全的基石。哪怕應用層存在注入漏洞,攻擊者也僅能獲得 mssqlrun 權限,無法直接控制作業系統,為應急響應贏得寶貴時間窗口。
- 上一篇文章: SQL Server 臨時表刪除正確姿勢:OBJECT_ID + tempdb 避坑指南
- 下一篇文章: SQL Server 2012 行轉列 (PIVOT) 實戰:動態列、UNPIVOT 組合、參數化模板
Copyright ©
程式碼之家 All Rights Reserved