在事件記錄系統當中,Syslog 可以算是流通最廣泛且支援性最廣的其中一種,尤其是 Unix-like 的作業系統幾乎都能支援它,因此對於我們要做集中收納記錄的機制是便利而快速。
但現實生活中就是充滿了各種變數,偏偏市佔率極高的 Windows 作業系統就不支援它,再加上前一篇我們介紹過一款相當強悍的 Graylog 系統它也是吃 Syslog 為主,難道就要放棄 Windows 不管嗎?
不,坐以待斃並不是我們的風格。
這個世界上不缺方案,只缺運氣,而我們開源陣營的運氣一直都相當不錯,有一款名叫 NXLog 的工具它有開源社群版本 (Open Source Community Edition),這讓我們不僅可以解決 Windows 事件記錄轉送的難題,他還更具備了更多的驚人藝業。
支援執行的作業系統:
支援記錄類型的平台:
資料輸入來源:
資料輸出目的:
資料格式:
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,參考以下幾種設定。
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_msvistalog
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,就做完了整個流程。
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_msvistalog
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,就做完了整個流程。
在 NXLog CE 中已經內建支援多種 Windows 上的事件記錄類型,依據官方文件所述有以下模組可以使用:
沒有直接支援的模組,但依據官方文件操作與設定後可以分析的類型,設定方式可至文末參考資料第二項翻閱:
前面的設定是最基本型的用法,將所有事件吃進來後丟出去,但 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_msvistalog
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
Hi 節省哥
在 文字檔案 這個項目
若文字檔 in.log 是一個變動的檔名時
,應該如何設定呢?2020-08-08.log
你可以寫一個 script,有變動檔案後用 link 方式連結到一個固定的檔名連結即可
剛好我也有這個im_file的檔案是抓日期變數的問題,在Stack overflow找到以下解法,目前對我有用!
如果你的im_file路徑是 C:\logs\2020-08-08.log
File則改寫為
File "C:\logs\" + strftime(now(), '%Y-%m-%d') + ".log"
Jason大 您好,
首先謝謝您的graylog文章,看到您系統是能show中文的,但我卻是亂碼。
一開始依照您文章來設定,亂碼依舊
# 字元編碼轉換
Exec convert_fields("auto", "utf-8");
接下來,我去官網查文件,增加設定如下
Module xm_charconv
AutodetectCharsets big5, utf-8, euc-jp, utf-16, utf-32, iso8859-2
但依然沒得到解決,想請問您是如何處理的,謝謝!!