2019年10月2日 星期三

開源記錄收集轉送工具:NXLog CE



在事件記錄系統當中,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 俱備了強大的功能與豐富的轉換能力,極大程度的降低管理者負擔,讓我們可以專心的把資料收進中央伺服器後從容的進行資料運用,分析出我們所真正關注的核心數據。







參考資料