問題背景
SQL Server 本身不提供內建「依來源 IP/機器限制連線」的功能,也無法在連線觸發時執行預存程式進行攔截。需從網路層、應用層或稽核層面實作。
三種可行方案
方案一:防火牆層級封鎖 (最推薦,最安全)
- 在 SQL Server 前端部署網路防火牆 (硬體或軟體),設定規則僅允許授權 IP 存取 TCP 1433 (或自訂埠)。
- 優點:透明於資料庫、效能零損耗、集中管理、支援深度封包檢測。
- Windows 防火牆進階安全性也可建立「輸入規則」限制遠端 IP。
方案二:自訂 ODS Gateway (中介層攔截)
- 開發一個 ODS (Open Data Services) 應用程式作為 Gateway,客戶端連線至 Gateway,Gateway 驗證來源 IP 後再代理連線至 SQL Server。
- 缺點:開發維護成本高;無法阻止繞過 Gateway 直連 SQL Server (需配合防火牆限制 SQL Server 僅接受 Gateway IP)。
- 參考:SQL Programmer's Toolkit 含 ODS 範例碼 (Microsoft 下載中心免費取得)。
方案三:排程稽核 + 強制中斷 (事後補救,非預防)
- 建立 SQL Agent Job,每分鐘執行預存程式掃描 `sys.sysprocesses` (或 `sys.dm_exec_connections`),檢查 `client_net_address`。
- 發現非授權 IP 的連線,執行 `KILL ` 強制中斷。
- 缺點:僅支援 MAC 地址識別 (早期版本) 或 IP;連線已建立並可能已執行操作才被發現;屬事後清理非預防。
進階補充:SQL Server 2005+ 內建功能
- 登入觸發器:`CREATE LOGON TRIGGER` 可在登入時檢查 `EVENT_DATA()` 中的 `ClientHost`,不符合則 `ROLLBACK` 終止登入。此為原生最佳方案。
- 連線加密與憑證:強制 TLS 加密並驗證客戶端憑證,僅受信任機器持有有效憑證。
- 端點權限:`GRANT CONNECT ON ENDPOINT::TSQL Default TCP TO [login]` 配合防火牆。
最佳實踐建議
- 網路層:防火牆僅開放應用伺服器 IP 存取 SQL Server 埠 (纏深度防禦)。
- 資料庫層:啟用登入觸發器雙重驗證來源主機名/IP。
- 審計層:開啟 SQL Server Audit 或 Extended Events 記錄所有登入成功/失敗事件。
- 最小權限:應用程式使用專用低權限帳號,禁用 `sa` 遠端登入。
綜上,「防火牆 + 登入觸發器」組合提供最完整、效能最好、維護成本最低的解決方案,適用於所有支援觸發器的 SQL Server 版本 (2005 以降)。