在事件記錄系統當中,Syslog 可以算是流通最廣泛且支援性最廣的其中一種,尤其是 Unix-like 的作業系統幾乎都能支援它,因此對於我們要做集中收納記錄的機制是便利而快速。
但現實生活中就是充滿了各種變數,偏偏市佔率極高的 Windows 作業系統就不支援它,再加上前一篇我們介紹過一款相當強悍的 Graylog 系統它也是吃 Syslog 為主,難道就要放棄 Windows 不管嗎?
不,坐以待斃並不是我們的風格。
方案介紹
這個世界上不缺方案,只缺運氣,而我們開源陣營的運氣一直都相當不錯,有一款名叫 NXLog 的工具它有開源社群版本 (Open Source Community Edition),這讓我們不僅可以解決 Windows 事件記錄轉送的難題,他還更具備了更多的驚人藝業。
- 支援跨平台作業系統
- 支援多種傳輸協定
- 高度彈性的設定組合方式
- 支援廣泛的資料來源
- 支援多種的資料目的
- 支援許多資料格式
- 提供事件轉送前的轉換處理 (例如字元編碼、格式轉換)
- 提供事件轉送篩選器
支援執行的作業系統:
- Debian
- RedHat/CentOS
- Ubuntu
- Windows
- Android
- Docker
支援記錄類型的平台:
- AIX
- FreeBSD
- OpenBSD
- Linux
- macOS
- Solaris
- Windows
資料輸入來源:
- Database (MySQL、PostgreSQL、MSSQL、Sybase、Oracle、SQLite、Firebird)
- External Programs (外部程式執行結果)
- File (檔案)
- EventLog (Windows)
- Syslog
資料輸出目的:
- Database (MySQL、PostgreSQL、MSSQL、Sybase、Oracle、SQLite、Firebird)
- Program (丟給指定程式)
- Files (寫進檔案)
- Http/Https (目的網址)
- Syslog
資料格式:
- CSV
- Syslog (RFC 3164 BSD Syslog)
- GELF (Graylog 專用格式)
- JSON
- Key-Value
- XML
NXLog CE 所能提供的功能極其豐富,這裡所能列出的只是它的一小部份。不僅可以做字元編碼的轉換,還可以決定要往外轉送的事件先做過篩選才出去,或者指定那些事件丟往 A 主機,那些丟往 B 主機等,非常靈活,幾乎沒有它做不到的。
安裝方式
由於 Linux、FreeBSD 等 Unix-Like 主機絕大多數都有內建 Syslog 套件,因此會使用到 NXLog CE 的場合通常都是在 Windows 作業系統上,所以我們就以 Windows 做為目標為安裝對象。
NXLog CE 的 Windows 版本安裝方式就與一般軟體沒有兩樣,不斷的下一步最終即可安裝完成,預設的安裝路徑會在 C:\Program Files (x86)\nxlog 之下,對我們而言最重要的設定檔案都在其中的 conf 資料夾裡。
在 conf 資料夾當中有一個 nxlog.conf 檔案,它就是整個 NXLog CE 運作的靈魂,所有的事件記錄轉換、轉送、篩選等等處理,通通都在這裡。
主要功能
最常用也最基本的用法,就是利用 NXLog CE 把 Windows EventLog 的事件內容轉換丟給 Syslog 伺服器,或是丟給前一篇提到的 Graylog 。
設定方式其實相當容易,以文字編輯器開啟 nxlog.conf,參考以下幾種設定。
Windows 至 Syslog
define ROOT C:\Program Files (x86)\nxlog Moduledir %ROOT%\modules CacheDir %ROOT%\data Pidfile %ROOT%\data\nxlog.pid SpoolDir %ROOT%\data LogFile %ROOT%\data\nxlog.log <Extension _syslog> Module xm_syslog </Extension> <Input in> # Vista (含)以後的作業系統請使用 im_msvirtalog Module im_msvistalog # 2003 (含)以前的作業系統請使用 im_mseventlog # Module im_mseventlog </Input> <Output out> Module om_udp Host 192.168.1.111 Port 514 Exec to_syslog_snare(); </Output> <Route 1> Path in => out </Route>
以上的設定是指定 Input 輸入來源是 Windows EventLog 格式,輸出目的是 Syslog 格式至 Syslog 伺服器,再指定一個 Route 告訴 NXLog CE 要把 in 這個 Input 丟給 out 這個 Output,就做完了整個流程。
Windows 至 Graylog
define ROOT C:\Program Files (x86)\nxlog Moduledir %ROOT%\modules CacheDir %ROOT%\data Pidfile %ROOT%\data\nxlog.pid SpoolDir %ROOT%\data LogFile %ROOT%\data\nxlog.log <Extension _syslog> Module xm_gelf </Extension> <Input in> # Vista (含)以後的作業系統請使用 im_msvirtalog Module im_msvistalog # 2003 (含)以前的作業系統請使用 im_mseventlog # Module im_mseventlog </Input> <Output out> Module om_udp Host 192.168.1.111 Port 12201 OutputType GELF </Output> <Route 1> Path in => out </Route>
以上的設定是指定 Input 輸入來源是 Windows EventLog 格式,輸出目的是 GELF (Graylog) 格式至 Graylog 伺服器,再指定一個 Route 告訴 NXLog CE 要把 in 這個 Input 丟給 out 這個 Output,就做完了整個流程。
Windows 記錄類型支援
在 NXLog CE 中已經內建支援多種 Windows 上的事件記錄類型,依據官方文件所述有以下模組可以使用:- 登錄檔 (Registry)
- 事件記錄 (Event Log)
- 事件追蹤 (Event Tracing)
- 效能計數器 (Performance Counters)
沒有直接支援的模組,但依據官方文件操作與設定後可以分析的類型,設定方式可至文末參考資料第二項翻閱:
- .NET 應用程式
- Applocker
- DHCP
- DNS
- Exchange
- IIS
- PowerShell
- SCOM
- SharePoint
- Snare
- Sysmon
- WMI
- 防火牆
- 檔案完整性
- 網域控制站
- 自訂程式
進階用法
前面的設定是最基本型的用法,將所有事件吃進來後丟出去,但 NXLog CE 所能做的可不僅僅如此而已。
事件篩選
在某些情況下,我只想要丟特定的事件出去呢?舉例,我只想要篩選 Active Directory 上某些認證或登入失敗的事件轉送出去就好,NXLog CE 也完全能夠滿足這些需求。
設定檔中的 Input、Output 區段都需要修改:
<Input in> Module im_msvistalog Query <QueryList><Query Id="0"><Select Path="Security">*[System[(EventID=4740 or EventID=4625)]]</Select></Query></QueryList> </Input> <Output out> Module om_udp Host 192.168.1.111 Port 514 Exec to_syslog_snare(); </Output>
在上面這個範例當中,我們針對 Windows EventLog 的 4740 (已自動鎖定使用者帳戶) 與 4625 (登入失敗。嘗試以不明的使用者名稱,或已知使用者名稱與錯誤密碼登入) 這兩種 EventID 做篩選,最終只丟出這兩種我想要關注的事件,可以大幅減少丟往 Syslog 伺服器的資料量,減輕系統的負擔。
編碼轉換
不同的系統或軟體可能使用不同的編碼,例如部份舊系統使用 Big5,當丟到 Graylog 上的時候可能就會造成中文顯示亂碼。這時我們就可以利用 NXLog CE 的字元編碼轉換功能,協助我們預先轉好再傳送出去,解決這個問題。
設定相關範例如下:
<Extension charconv> Module xm_charconv </Extension> <Extension _syslog> Module xm_gelf </Extension> <Input in> # Vista (含)以後的作業系統請使用 im_msvirtalog Module im_msvistalog # 2003 (含)以前的作業系統請使用 im_mseventlog # Module im_mseventlog # 字元編碼轉換 Exec convert_fields("big5", "utf-8"); </Input> <Output out> Module om_udp Host 192.168.1.111 Port 12201 OutputType GELF </Output> <Route 1> Path in => out </Route>
主要是在 Input 區段中增加一行轉換程序,即可完成這項工作。
外部程式
儘管 NXLog CE 支援的記錄來源已經很多,但仍然有可能會有漏網之魚,例如較為冷門的系統或是自行開發的程式。當然,這也難不倒 NXLog CE,可以經由外部程式的方式將執行結果的 標準輸出 (stdout) 收集進來以後,再轉送給記錄中心。
請參考設定範例:
<Input in> Module im_exec Command /usr/bin/tail Arg /var/log/messages <Schedule> Every 10 min First 2019-10-02 01:05:00 Exec log_info("scheduled execution at " + now()); </Schedule> </Input> <Output out> Module om_udp Host 192.168.1.111 Port 12201 OutputType GELF </Output> <Route 1> Path in => out </Route>
這個範例,利用 im_exec 輸入模組執行特定指令,搭配 Schedule 進行排程處理,每 10 分鐘執行 tail 指令把 messages 檔案的內容最後十行取出轉送至 Graylog。
文字檔案
如果是已經既存的文字記錄檔,會由軟體不斷持續寫入的形式,NXLog CE 也可以持續監看這個檔案是否有新的內容,再加以轉發出去。設定範例如下:
<Input file> Module im_file File '/tmp/in.log' # 啟用流量控制 FlowControl TRUE # 記住最後位置 SavePos TRUE </Input> <Output tcp> Module om_tcp Host 192.168.1.111 Port 12203 </Output> <Route r> Path file => tcp </Route>
這個設定範例,會持續從 in.log 這個文字記錄檔內讀取走 TCP 轉送出去至另一台主機,並且會記住最後的位置,當有新的記錄進來才會再加以轉送。
除此之外,NXLog CE 還有太多的能力與技巧值得我們去探索,這些都在官方的文件中有詳細的說明。
結論
在資安事件分析的情境之中,能夠整合異質平台的事件記錄是一件大工程,而 NXLog CE 俱備了強大的功能與豐富的轉換能力,極大程度的降低管理者負擔,讓我們可以專心的把資料收進中央伺服器後從容的進行資料運用,分析出我們所真正關注的核心數據。
參考資料
- NXLog Community Edition - Downloads | nxlog.co
https://nxlog.co/products/nxlog-community-edition/download
- NXLog User Guide | Microsoft Windows
https://nxlog.co/documentation/nxlog-user-guide/windows.html
- NXLog User Guide | Introduction
https://nxlog.co/documentation/nxlog-user-guide/introduction.html