在企業環境中,為了強化資料庫安全性,常需限制 SQL Server 僅接受特定用戶端 IP 連線。本文將介紹三種不同層級的實作方式:防火牆規則、SQL Server 2005 端點限制,以及登入觸發器,並說明各自的適用場景與優缺點。
最直接且效能最好的方式是在網路層級攔截。在 Windows 防火牆或前端網路防火牆建立規則,僅允許特定 IP 位址存取 SQL Server 的連接埠(預設為 TCP 1433)。
若使用 SQL Server 2005,可透過「端點」功能,將 TCP 通訊綁定至特定網卡 IP,達到類似效果。此法需伺服器擁有專用網卡(範例 IP:192.168.1.1)。
TCP/IP 以外的所有協定。ALTER ENDPOINT [TSQL Default TCP] STATE = STOPPED;
USE master;
GO
CREATE ENDPOINT [TSQL User TCP]
STATE = STARTED
AS TCP (
LISTENER_PORT = 1433,
LISTENER_IP = (192.168.1.1) -- 監聽的網卡 IP
)
FOR TSQL();
GO
GRANT CONNECT ON ENDPOINT::[TSQL User TCP] TO [public];
完成後,僅透過 192.168.1.1 這張網卡連入的用戶端能存取 SQL Server。若搭配登入授權,可進一步限制特定帳號。
利用 LOGON 觸發器,在登入階段攔截非授權 IP。此法彈性高,可寫入複雜邏輯,但會增加每次連線的額外負擔。
USE master;
GO
CREATE TRIGGER tr_LoginCheck
ON ALL SERVER
FOR LOGON
AS
BEGIN
IF EVENTDATA().value('(/EVENT_INSTANCE/ClientHost)[1]', 'varchar(15)') <> '192.168.1.1'
ROLLBACK TRAN;
END;
GO
注意:觸發器內發生錯誤會導致所有登入失敗,部署前務必充分測試,並保留專用管理連線 (DAC) 以便緊急處理。
| 方法 | 層級 | 效能影響 | 維護性 | 適用版本 |
|---|---|---|---|---|
| 防火牆 | 網路層 | 極低 | 高(集中管理) | 所有版本 |
| 端點限制 | SQL Server 服務層 | 低 | 中(需 T-SQL 管理) | SQL Server 2005+ |
| 登入觸發器 | 資料庫引擎層 | 中(每次連線觸發) | 中(邏輯集中在觸發器) | SQL Server 2005 SP2+ |
最佳實務:採用「防火牆為主,端點/觸發器為輔」的纵深防禦策略,並定期稽核連線日誌。