一、背景
有一天我發現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 Agent錯誤記錄檔列表,如Figure13所示。
--Script1:擷取[SQL Server]錯誤記錄檔列表EXEC xp_enumerrorlogsEXEC xp_enumerrorlogs 1
(Figure4:SQL Server 錯誤記錄檔列表)