系統管理若希望能夠時時監控系統運作,並在系統發生特定事件時留下相關的稽核紀錄,可使用Sysinternals公司所提供的系統監控軟體Sysmon,它可有效地延伸系統監控的功能,還能根據使用者設定的條件進一步監控系統的運作情形,並且留存相關稽核紀錄。
對於系統管理者而言,總是希望能夠時時監控系統運作。並在系統發生特定事件時(例如有檔案新增或執行程序)能留下相關的稽核紀錄,而一般的作業系統並無法達到相關監控的要求,也因此會利用其他的應用程式來達到相關的需求。
Sysmon(官方網址為https://learn.microsoft.com/en-us/sysinternals/)是一套由Sysinternals(已被微軟收購)公司所提供的知名系統監控軟體,可有效地延伸系統監控的功能。此外,還能根據使用者設定的條件進一步監控系統的運作情形,並記錄相關稽核紀錄。Sysmon除了提供微軟作業系統的版本外,也提供Linux系統版本。本文將介紹Linux系統(在此使用CentOS 9)版本之Sysmon軟體,讓使用者能利用此軟體更進一步地監控Linux系統的運作情形,並以syslog格式儲存相關的稽核紀錄。
什麼是Sysmon for Linux
Sysmon主要是利用Linux系統上的eBPF(extended Berkeley Packet Filter)機制來監控系統核心資源的運作情形。BPF(Berkeley Packet Filter)機制原先是被用來提供Linux系統上網路接口(Socket)的功能,主要是負責網路封包的處理。甚至可利用此機制讓網路卡以混亂(Promiscuous)模式運作,在此模式下,網路卡即可擷取流經該網路卡上的所有封包資訊,進而實現竊聽網路封包(Sniffer)的目的。
在此之後,BPF機制經過不斷地演進及延伸後,除了原先所提供的網路接口功能外,更提供系統其他服務的接口(這也是eBPF名稱的由來),讓使用者使用此機制即可取得系統核心的相關資訊,進而監控系統相關資源的運作(例如檔案操作或網路連線),而Sysmon即是依附於此種機制來監控並取得系統核心的相關運作資訊,進而監控相關系統服務的運作情形,其可提供監控的系統事件種類如下所述:
‧系統上新建程序(Process)運作情況:例如使用者在執行程序時而產生新建程序後,就會記錄產生該新建程序相關資訊,例如執行程序的完整命令、程序編號(Process ID),可藉由此資訊來掌握系統上曾執行的程序資訊。
‧系統上檔案的操作情況:當系統上的檔案發生變化時(例如新增、刪除或檔案內容發生變動),即可記錄相關的檔案變動資訊。除此之外,也可監控以RAW型式讀取檔案資料的相關資訊。
‧系統上網路連線情況:可記錄連線至主機上的所有網路連線相關資訊,例如來源IP位址、來源通訊埠及主機名稱。
在簡單了解Sysmon軟體功能後,接下來開始安裝Sysmon。
安裝Sysmon
由於Sysmon必須使用到SysinternalsEBPF(為使用eBPF機制的程式庫)及.Net的執行環境,因此必須先安裝SysinternalsEBPF。
一開始,先執行以下的指令,安裝SysinternalsEBPF所需要的其他軟體:
yum install gcc gcc-c++ make cmake llvm clang yum install elfutils-libelf-devel rpm-build json-glib-devel python3 glibc-devel.i686 dnf --enablerepo=crb install gtest- devel yum install gmock-devel
成功安裝所需的軟體後,接著到SysinternalsEBPF官方網站(https://github.com/Sysinternals/SysinternalsEBPF)取得最新版本的軟體(這裡採用1.2),安裝指令如下:
cd mkdir build cd build cmake .. #進行組態 make #進行編譯 make install #進行安裝
成功安裝SysinternalsEBPF之後,接著安裝.Net SDK 6 for Linux,亦即在Linux系統上安裝.Net的執行環境,執行以下的指令:
yum install aspnetcore-runtime-7.0 yum install dotnet-sdk-7.0 dotnet tool install --global dotnet-t4
成功安裝.Net SDK 6 for Linux後,最後來安裝SysmonForLinux,連至官方網站(https://github.com/Sysinternals/SysmonForLinux)取得最新版本安裝(本文採用1.2),安裝指令如下:
cd mkdir build cd build cmake .. make
在編譯成功後,就會產生一個名稱為「sysmon」的主要程式以及名稱為「sysmonLogview」用來查看所記錄資訊的檔案。
接下來,說明Sysmon主程式常用的執行參數:
-i:以常駐(Daemon)模式啟動Sysmon。可在此參數後,加上欲使用的組態檔名稱,如下例所示,設定可自動載入相關所需要的驅動程式,若沒有設定此選項,便會在載入驅動程式的過程中,以應答的方式詢問使用者是否要載入:
sysmon -i /opt/sysmon/config.xml -accepteula
-u:移除(Uninstall)Sysmon程式。
-s:顯示目前相關組態設定的資訊。
-c:動態更新組態相關設定,若有組態更動的情況,即可使用此參數讓Sysmon套用新的組態。
相關組態檔說明
在簡單說明Sysmon後,接著說明相關組態檔。
Sysmon提供了一個XML格式讓使用者設定執行時所須使用的組態,如圖1所示為一個簡單的組態檔。組態檔中主要區間欄位說明如下:
EventFiltering
這是主要的設定區間,使用者可在此區間中設定欲記錄的系統事件。
Sysmon以事件編號(Event ID)來區分不同的系統事件,相關說明如表1所示。
ProcessCreate
為事件編號1之事件,使用者可在此區段中設定當系統上有新建程序時的處理方式,如下範例(其中#為註解資訊)就表示記錄系統上所有的新建程序資訊,亦即所執行的任何程序均須記錄:
#條件式
其中,RuleGroup來設定新建程序時的處理規則群,可在此區間下設定多個條件式。而groupRelation表示處理規則群中各個條件的邏輯運算式,提供了and和or選項。
另外,在條件式中的onmatch則提供了匹配選項,包括include(包含)及exclude(排除)選項,而範例中,因為onmatch設定成exclude,且未設定任何欲排除的程序資訊,就表示記錄所有的新建程序。
ProcessTerminate
為事件編號5之事件,使用者可在此區段中設定當系統上有程序中斷事件發生時的處理方式。如下範例即表示記錄所有的程序中斷資訊:
RawAccessRead
為事件編號9之事件,使用者可在此區段中設定當系統上有發生以RAW型式讀取檔案事件發生時的處理方式,如下範例就表示記錄所有以RAW型式讀取檔案資訊的事件:
FileCreate
為事件編號11之事件,使用者可在此區段中設定當系統上有新建檔案或檔案被覆蓋事件發生時的處理方式,如下範例表示記錄所有的新建檔案或檔案被覆蓋資訊:
FileDelete
為事件編號23之事件,使用者可在此區段中設定當系統上有檔案刪除事件發生時的處理方式,如下範例表示記錄所有的檔案刪除資訊:
NetworkConnect
使用者可在此區段中設定當系統上有網路連線事件發生時的處理方式,如下範例即表示記錄所有的網路連線資訊:
執行Sysmon
在簡單地說明組態檔後,即可執行Sysmon,在此以記錄所有系統所發生的事件為例,可以連結至下列的網址取得範例組態檔:
https://github.com/splunk/attack_range/blob/develop/configs/SysMonLinux- CatchAll.xml
並且,將該範例組態檔置於「/opt/sysmon/config.xml」,而後執行以下的指令來啟動Sysmon(圖2):
/opt/sysmon/sysmon -accepteula -i /opt/sysmon/config.xml
在啟動成功後,Sysmon會將所偵測到的系統事件以syslog格式寫入至「/var/log/messages」檔案內,因此可利用tail指令來監控該檔案,並利用sysmonLogView程式將相關紀錄轉換成可讀性高的輸出,指令如下:
tail -f /var/log/messages | /opt/ sysmon/sysmonLogView -e 1
此時,應會出現如圖3所示之輸出,表示補捉到系統上新建sysmonLogView程序的事件。
至此,即完成Linux版本的Sysmon軟體安裝與操作。
<本文作者:吳惠麟,多年資安經驗,喜好利用開源碼建構相關解決方案,著有「資訊安全原理與實驗」等書。>