從遠端透過帳號及密碼驗證登入系統進行管理雖然方便,但也因此經常遭受惡意攻擊者透過猜測帳號∕密碼型式的暴力攻擊手法來試圖登入。本文將介紹一套開源碼的解決方案IPBan,利用監控系統日誌的方式來確認暴力攻擊的來源端並加以封鎖。
為了系統管理上需求,管理者通常會開啟遠端登入,例如遠端桌面或SSH(Secure Shell Protocol)服務的功能,以便管理者可從遠端透過帳號及密碼驗證即可登入系統進行操作,但也因此常會遭受到惡意攻擊者利用猜測帳號∕密碼型式的暴力攻擊手法來試圖登入,而讓系統面臨潛在的風險。
對此,本文將介紹一套開源碼的解決方案「IPBan」,其官方網址是「https://github.com/DigitalRuby/IPBan/」,IPBan利用監控系統日誌(Log)的方式來確認在進行暴力攻擊的來源端並加以封鎖。
IPBan提供Linux與Windows系統(分為基本版及進階版)的版本,本文將說明Windows系統基本版的使用。
何謂IPBan
IPBan主要是利用監控並解析系統上的日誌紀錄的樣式特徵(例如帳號暴力攻擊會產生大量登入錯誤的紀錄)來確認是否遭受到暴力攻擊,並在確認之後進行即時的阻擋與記錄。其主要功能如下所述:
‧利用解析事件檢視器或日誌檔案中的失敗登錄資訊來決定是否要封鎖該來源端。在Linux系統上,預設會監控SSH服務的登入狀況,而在Windows系統上預設會監控遠端桌面(RDP Remote Desktop Protocol)或SQL Server等重要服務的登入狀況。
‧提供簡易組態化的設定,使用者可利用組態設定的方式來設定監控的相關條件(如登入失敗次數、封鎖時間等設定)的門檻值,例如可設定同一個來源端,如果在一分鐘內登入失敗次數超過5次,便設定封鎖該來源端一段時間(如5分鐘)。
‧提供完整正規表示式支援。使用者可利用正規表示式強大的字串樣式比對功能來設定相關條件,並可自行定義解析事件記錄的樣式。
‧支援多樣化的作業系統,包括Windows和Linux等作業系統。
‧支援IPV4與IPV6通訊協定。
安裝IPBan
在簡單了解IPBan的功能後,接著安裝Windows版本的IPBan。安裝過程很簡單,直接至IPBan的官方網站取得最新版本(檔名為IPBan-Windows-x64_1_9_0.zip)。解壓縮後,會產生如圖1所示的執行檔與組態檔(ipban.config)。其中,所使用的組態檔(檔名為ipban.config)為XML格式(圖2)。
組態檔常用設定
ipban.config組態檔中常用的設定,分別說明如下:
LogFilesToParse
此區段主要定義進行定期監控並解析的日誌檔案相關資訊。
LogFile
此區段即為實際定義日誌檔案的詳細資訊,提供下列常用的組態:
‧Source:設定要監控的網路服務名稱,例如SSH、RDP。
‧PathAndMask:設定要監控的檔案名稱的遮罩(Mask)資訊,在系統上有些日誌檔案的名稱可能會以日期的形式來個別儲存(例如secure-yyyy-mm-dd),因此無法以固定的檔案名稱設定,在這種情況下,即可利用此組態以正規表示法來設定要監控的相關檔案,例如設定「secure*」即表示監控檔案名稱開頭為secure的所有檔案。
‧FailedLoginRegex:以正規化表示法來設定符合登入錯誤的字串樣式,要特別注意的是,此樣式必須要有一個IP位址資訊,另外也建議最好有一個使用者名稱,如此才可表達某個來源IP使用某個使用者名稱來嘗試登入,如下範例為SSH登入錯誤的字串樣式,其中即表示為IP資訊的樣式:
(?failed\s+password)\ s+for\s+(?:invalid\s+user\ s+)?(?[^\s]+)\s+from\ s+(?[^\s]+)\s+port\s+[0- 9]+\s+ssh|
‧SuccessfulLoginRegex:以正規化表示法來設定符合登入成功的字串樣式,此樣式必須要有一個IP位址資訊,另外也建議最好有個使用者名稱,如此才可表達某個來源IP使用某個使用者名稱登入成功,以下為SSH登入成功的字串樣式:
\s+Accepted\s+(?:password|publickey)\ s+for\s+(?[^\s]+)\s+from\ s+(?[^\s]+)\s+port\s+[0- 9]+\s+ssh
‧FailedLoginRegexTimestampFormat:如果欲解析的登入失敗日誌資訊中具有時間戳記(Timestamp)的資料,即可根據該時間戳記的格式來定義相關的樣式。若無設定此組態,就表示以通用的時間戳記格式來解析。
‧SuccessfulLoginRegexTimestampFormat:如果欲解析的登入成功日誌格式具有時間戳記的資訊,即可根據該時間戳記的格式來定義相關的樣式。若無設定此組態,即表示以通用的時間戳記格式來解析。
‧FailedLoginLogLevel:定義IPBan在監控登入失敗日誌的執行過程中,所要記錄的日誌層級,其提供了如下的設定:
Trace:將運作的所有過程均記錄下來,此為最詳盡之資訊。
Debug:記錄相關偵錯層級以上(包括Info、Warn、Error、Critical)的資訊。
Info:記錄一般資訊層級以上(如Warn、Error、Critical)的資訊。
Warn:記錄相關警告層級以上(包括Error、Critical)的資訊,此為預設組態。
Error:記錄錯誤層級以上(包括Critical)的資訊。
Critical:記錄嚴重錯誤層級的資訊。
‧SuccessfulLoginLogLevel:定義IPBan在監控登入成功的執行過程中,所要記錄的日誌層級(同FailedLoginLogLevel的日誌層級)。
‧PlatformRegex:定義欲運作的作業系統名稱,常用的設定有Linux或Windows等知名的作業系統。
‧PingInterval:設定輪詢日誌檔(即每隔多久須解析)的間隔時間,單位為毫秒(milliseconds)。以下設定表示每10秒輪詢一次日誌資訊:
<PingInterval>10000</PingInterval>
‧MaxFileSize:設定能夠監控並解析日誌檔的最大容量,單位為位元組(bytes)。例如以下的設定表示日誌檔案容量不能超過16MB:
<MaxFileSize>16777216</MaxFileSize>
ExpressionsToBlock
此區段設定僅適用於Windows系統,主要是用來監控Windows事件檢視器中關於服務登入失敗的日誌(Event Log),並設定相關的條件,常用的組態如下所示:
‧Source:設定所要檢查的網路服務名稱,例如RDP或SSH。
‧Path:設定所要檢查事件檢視器的事件種類,例如Security為安全事件、Application為應用程式事件、System為系統事件。
‧Expressions:設定相關的比對條件式,可利用XPath語法與正規化表示式來設定條件,如下例即表示若Windows系統發生的EventID編號為4625(登入失敗)的事件即條件成立:
<Expression><XPath>//EventID</ XPath><Regex>^(4625)$</Regex></Expression>
ExpressionsToNotify
此區段僅適用於IPBan Pro版本,基本上與ExpressionsToBlock設定雷同,只不過此組態為尋找登入成功的紀錄而非登入失敗的紀錄,主要的目的在於當有成功登入的事件發生時,即發出通知(例如Email)給管理者,以便能夠即時掌握系統成功登入的狀態。
appSettings
此區段可用來設定封鎖的相關屬性資訊,例如設定條件成立的門檻值,當條件成立時要進行封鎖的時間等等,常用的組態設定如下所示:
‧FailedLoginAttemptsBeforeBan:設定登入失敗次數的門檻值,如下例即表示當來源端登入失敗次數超過5次即表示條件成立而進行封鎖:
<add key="FailedLoginAttemptsBefo reBan" value="5"/>
‧BanTime:設定封鎖的時間長度,其格式為DD(天):HH(小時):MM(分鐘):SS(秒)。以下例子代表將封鎖一天:
<add key="BanTime" value="01:00:00:00"/>
‧ResetFailedLoginCountForUnbannedIPAddresses:在進行封鎖後,設定是否要將該被阻擋來源的失敗次數重置為0,提供true和false的選項。true表示會將登入失敗次數重置為0,例如某個來源端已經登入失敗超過5次後被封鎖,此時其登入失敗次數會被清除為0,亦即需該來源端再登入失敗超過5次,才會再次被封鎖。而false表示不會將登入失敗次數重置為0,例如某個來源端已經登入失敗超過5次後被封鎖,此時其登入失敗次數仍然維持原來的次數,如果該來源端再次登入失敗,就會直接再次被封鎖。
‧ClearBannedIPAddressesOnRestart:設定是否在重啟IPBan服務時,要清除原先所有封鎖的相關資料,提供true和false的選項。true表示重新清除原先的所有封鎖資料,而false表示要沿用原先的所有封鎖資料。若使用者想要清除原先封鎖的舊資訊,即可利用設定此組態為true並重啟IPBan服務來達到清除原先舊資料的效果。
‧ClearFailedLoginsOnSuccessfulLogin:設定當來源端成功登入後,是否要清除之前錯誤登入的次數,提供true和false的選項。true表示清除原先登入錯誤的次數並重置為0,而false表示不清除原先登入錯誤的次數。
‧ProcessInternalIPAddresses:設定是否要處理來自內部IP的連線。如果信任內部IP,可將此組態設為false。否則可設為true,表示要處理所有的來源IP的連線。
‧ExpireTime:設定保存登入失敗資訊的有效期限,一旦超過此期限即會自動消除相關資訊。其格式為DD:HH:MM:SS,若設定00:00:00:00即表示永久有效。
‧CycleTime:設定IPBan多久時間要進行一次內部資訊的管理(例如封鎖∕解封鎖IP或重新載入組態),其格式為DD:HH:MM:SS。
‧MinimumTimeBetweenFailedLoginAttempts:設定計數登入失敗次數的時間間隔,其格式為DD:HH:MM:SS。例如設定為00:00:00:05即表示在間隔5秒的情況下登入失敗,才會累加至登入失敗次數。
‧MinimumTimeBetweenSuccessfulLoginAttempts:如同MinimumTimeBetweenFailedLoginAttempts組態,只是此組態是針對登入成功的紀錄做解析。
‧Whitelist:設定不受IPban管控的白名單IP資訊。
‧WhitelistRegex:以正規表示法來設定不受IPban管控的白名單IP資訊。
‧Blacklist:設定不允許連線的黑名單IP資訊。
‧BlacklistRegex:以正規表示法來設定不允許連線的黑名單IP資訊。
IPBan執行方式
在簡單說明過組態檔常用的設定後,接下來執行IPBan程式進行防護。在本文中,將利用遠端桌面(RDP)登入錯誤的方式來驗證。由於IPBan預設的組態檔已內建RDP的相關設定,因此無須更動任何設定。執行的方式有兩種,以下分別做介紹。
手動直接執行
在此模式下,組態檔(ipban.config)要與執行檔位於同一個目錄下。在執行後,可利用工作管理員檢查,應可看到如圖3所示的輸出,確認IPBan已在運作中。
然後,查看IPBan的日誌檔(檔名為logfile),確認其訊息已經執行成功,並且開始監控SSH與RDP服務,如圖4所示。
以系統服務的型式執行
以系統管理者的權限開啟PowerShell,接著輸入如下的安裝指令(指令為同一行):
[Net.ServicePointManager]::SecurityProto col = [Net.SecurityProtocolType]::Tls12; iex ((New-Object System.Net. WebClient).DownloadString('https:// raw.githubusercontent.com/DigitalRuby/ IPBan/master/IPBanCore/Windows/Scripts/ install_latest.ps1'))
可參考「https://github.com/DigitalRuby/IPBan/tree/master」的資訊來取得安裝指令,執行結果如圖5所示。
在執行成功之後,就會以「服務(Service)」的型式常駐於系統上。可透過查看系統上「服務」內容的方式來確認IPBan是否有正常的運作,如圖6所示。
由於IPBan預設的組態就會自動監控遠端桌面(RDP),因此在確認IPBan運作後,可以從遠端桌面登入並讓錯誤登入達到所設定門檻值(預設為5次),接著查看IPBan的日誌檔(檔名是logfile)是否有圖7所示的紀錄資訊來確認IPBan是否已正常運作。
<本文作者:吳惠麟,多年資安經驗,喜好利用開源碼建構相關解決方案,著有「資訊安全原理與實驗」等書。>