一、背景
有一天我發現SQL Server服務器的錯誤日志中包括非常多關於sa用戶的登陸錯誤信息:“Login failed for user 'sa'. 原因: 評估密碼時出錯。[客戶端: XX.XX.XX.XX]”。可是我很久之前就已經禁用了sa用戶,怎麼還會有那麼多的sa用戶登陸信息呢?我猜想是有人在暴力破解我們數據庫的sa用戶的密碼;關於這種攻擊,大家有沒好的解決方案呢?
我查找了一些資料,暫時沒有找到好的解決方案。我只想到一個暫時緩解壓力的辦法,那就是從錯誤信息中統計出登陸sa用戶的客戶端IP地址,再設置防火牆把這些IP過濾掉。
那現在如何解決IP的統計呢?使用SSMS是根本無法進行統計,因為錯誤日志的記錄太多了。SSMS打開錯誤日志的方式如下圖Figure1和Figure2所示;
(Figure1:SQL Server 日志)
(Figure2:sa登陸信息)
經過資料的查找,發現有兩種方式可以對錯誤日志進行過濾:
1. 利用SQL Server系統存儲過程xp_readerrorlog進行過濾;
2. 利用默認跟蹤(Default Trace)進行過濾;
二、xp_readerrorlog實現錯誤日志過濾
(一) 關於錯誤日志的基本操作可以參考:SQL Server錯誤日志收縮(ERRORLOG)。首先了解錯誤日志文件的路徑和大小,可以通過Figure3的方式找到文件,查看大小。
(Figure3:SQL Server ErrorLog文件信息)
除了Figure3直接找到錯誤日志的方式之外,我們還可以通過執行存儲過程EXEC xp_enumerrorlogs返回表的形式進行查看信息,如Figure4所示。xp_enumerrorlogs存儲過程還提供參數,默認值為1(如果沒有提供參數表示傳入的參數為1),2的時候表示查詢SQL Server 代理錯誤日志列表,如Figure13所示。
--Script1:獲取[SQL Server]錯誤日志列表 EXEC xp_enumerrorlogs EXEC xp_enumerrorlogs 1
(Figure4:SQL Server 錯誤日志列表)