SQL Server 內建無直接功能 限制連線來源 IP/機器,亦無「連線觸發預存程序」機制 (Logon Trigger 為 2005 SP2+ 引入)。需從網路層、中介層、資料庫層輔助實現。
sysprocesses (事後清理、有風險)master..sysprocesses 的 net_address (MAC 位址) 或 host_name/program_nameKILLCREATE PROCEDURE dbo.usp_KillUnauthorizedConnections
AS
BEGIN
DECLARE @spid SMALLINT, @sql NVARCHAR(100);
DECLARE cur CURSOR FOR
SELECT spid FROM master..sysprocesses
WHERE host_name NOT IN ('APP_SERVER_1', 'APP_SERVER_2') -- 白名單
AND spid <> @@SPID; -- 排除自身
OPEN cur;
FETCH NEXT FROM cur INTO @spid;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sql = 'KILL ' + CAST(@spid AS VARCHAR(5));
EXEC sp_executesql @sql;
FETCH NEXT FROM cur INTO @spid;
END
CLOSE cur; DEALLOCATE cur;
END;
嚴重缺陷:
CREATE TRIGGER trg_RestrictLogon
ON ALL SERVER
FOR LOGON
AS
BEGIN
IF ORIGINAL_LOGIN() NOT IN ('sa', 'svc_account') -- 排除系統帳戶
AND HOST_NAME() NOT IN ('APP_SERVER_1', 'APP_SERVER_2')
BEGIN
ROLLBACK; -- 直接終止登入嘗試
END
END;
優點: 登入階段即攔截、無連線建立開銷、支援 IP 判斷 (透過 EVENTDATA() 取得 ClientHost)。
-- 僅授予特定登入存取 TSQL 預設端點
DENY CONNECT ON ENDPOINT::[TSQL Default TCP] TO [Public];
GRANT CONNECT ON ENDPOINT::[TSQL Default TCP] TO [Allowed_Login];
| 層級 | 方案 | 推薦等級 | 備註 |
|---|---|---|---|
| 網路 | 防火牆/安全群組白名單 | ★★★★★ | 必要基礎防護 |
| 資料庫 (2005+) | Logon Trigger + 端點權限 | ★★★★☆ | 深度防禦第二層 |
| 應用 | 連線字串加密、憑證驗證 | ★★★★☆ | 防止認證盜用 |
| 資料庫 (2000) | 排程 KILL (不推薦) | ★☆☆☆☆ | 唯有無他選擇時備用 |
「防火牆 + Logon Trigger」雙層防禦為企業級部署標準配置,SQL Server 2000 環境務必優先實施網路層隔離。