IDS 入侵偵測系統 Syslog

過濾系統事件異常紀錄 相較網路型Snort各有千秋

Sagan主機型入侵偵測 緊盯Syslog可疑徵象

2020-02-17
網路攻擊日益嚴重,除了架設最基本的防火牆外,建議再部署入侵偵測系統(IDS)。本文將使用主機型入侵偵測系統Sagan,並安裝Meer直接讀取Sagan所輸出的EVE檔案,透過監控主機的稽核紀錄來判別異常狀況,將異常等相關資訊儲存至資料庫。

 

為了因應層出不窮的網路攻擊手法,有越來越多人選擇在部署防火牆之外,再部署入侵偵測系統(Intrusion Detection System,IDS)來彌補防火牆不足之處。因此本文將介紹開源碼社群中頗富盛名的主機型入侵偵測系統Sagan(官方網址為https://quadrantsec.com/sagan_log_analysis_engine/),利用監控主機上的稽核紀錄來判別是否有異常之處。一旦發現有異常,即將相關資訊儲存至MySQL資料庫。

過去相關的入侵偵測系統將資訊儲存至資料庫,通常都會利用通用的Barnyard2程式。而新版的Sagan軟體中,提供了取代Barnyard2的Meer程式(官方網址為https://github.com/beave/meer),可直接讀取Sagan所輸出的EVE檔案。相對於Barnyard2程式,Meer提供更緊密並有效率的轉換,本文的實作環境為CentOS 7,並使用MySQL資料庫。

何謂Syslog

稽核紀錄檔(Syslog)機制一直是主機系統上的重要機制,可忠實地記錄主機系統的相關資料,以供使用者在系統發生問題時,利用查詢稽核紀錄的方式來得知相關資訊。

為了讓各家廠商在設計稽核紀錄時有統一的標準可遵循。網際網路工程任務組(Internet Engineering Task Force,IETF)定義了編號RFC 5424的技術文件。此份文件詳述了稽核紀錄相關的欄位資訊以及相關的通訊協定(Syslog),以供各界在設計時有所遵循。Syslog協定是一種主從式的架構(客戶端-伺服器端),可利用UDP或TCP通訊協定來傳送相關的稽核紀錄資訊。基本上,一個符合Syslog規範的稽核紀錄,在訊息本體可分為四個欄位,如圖1所示。

圖1  稽核紀錄之訊息本體的四個欄位。

其中,(1)記錄事件發生時的日期與時間,(2)記錄發生此事件的主機名稱,(3)記錄當下執行的程式名稱(如上述的sshd),(4)則記錄實際的詳細訊息內容。

除此之外,Syslog並提供Facility(事件類型,例如FTP事件)和Severity(事件的嚴重程度)等觀念。讓使用者可用來取得適當的紀錄,例如用來設定僅記錄屬於FTP類型且程度為嚴重的事件。

認識rsyslog軟體

在Linux系統上通常都會預設安裝rsyslog軟體(官方網址是https://www.rsyslog.com/)來完成稽核紀錄的記錄工作,因此使用者無須另外安裝相關軟體。rsyslog軟體被設計成模組化的架構,只要動態地載入相關模組,即可使用該模組的功能。大致上模組可區分為「輸入模組」、「過濾模組」以及「輸出模組」等類型。

輸入模組

此類模組用來指定Syslog的資料來源,常用的模組如下所述:

imuxsock:此模組是用來接收系統所產生的一般稽核紀錄,通常為應用程式所產生,這也是最常查看的紀錄。

imklog:此模組用來接收系統所產生的核心(Kernel)稽核紀錄,使用者利用dmesg指令即可取得核心稽核紀錄的內容。

imudp:利用UDP通訊協定取得遠端主機的稽核紀錄,提供的語法如下:

input (type="imudp" port="514")

以該指令為例,表示以514埠來取得遠端主機的稽核紀錄。

imtcp:利用TCP通訊協定取得遠端主機的稽核紀錄,提供的語法如下:

input (type="imtcp" port="514")

依該指令所示,將以514通訊埠來取得遠端主機的稽核紀錄。

過濾模組

可設定規則來過濾所要擷取的稽核紀錄,在本文中,由於希望取得所有稽核紀錄,因此就不多加探討此模組的用法。

輸出模組

設定稽核紀錄輸出的位置,通常可設定輸出至檔案或資料庫。在本文中,將設定輸出至檔案上。

如圖2所示為本文所需要的rsyslog組態檔設定,主要是須設定一個符合Sagan所需要的樣式紀錄,並將所有的紀錄以此樣式傳遞至FIFO裝置檔案。相關說明如下:

圖2  rsyslog組態檔設定。

其中,(A)設定所要記錄之稽核紀錄的過濾規則,其設定語法如下:

Facility.Severity  <輸出檔案>

此為設定記錄某個事件類型(Facility)中某個嚴重程度(Severity)以上的事件,以此例而言,表示將authpriv事件類型中所有資訊,輸出至「/var/log/secure」檔案。

(B)為設定樣式。rsyslog提供了樣式(Template)功能讓使用者自行定義所要儲存的稽核紀錄格式,其設定語法如下:

$template [樣式名稱], "樣式表示格式"

以此例而言,表示設定一個名稱為「sagan」的樣式,其紀錄內容為樣式表示格式中所定義之格式。這也是Sagan軟體所要求的稽核紀錄格式,因此須先定義一個符合要求的樣式。

而(C)將稽核紀錄以某種樣式輸出至某個檔案。rsyslog提供了管道(Pipe)功能,可將相關稽核紀錄傳送到某個檔案裝置,在本例中,則將系統所產生的的稽核紀錄(Sagan)傳送至sagan.fifo檔案上。

在簡單介紹rsyslog機制後,接下來繼續說明主機型入侵系統Sagan。

認識Sagan工具

一般在提到入侵偵測系統時,相信有經驗的管理人員,腦海裡所浮現的第一個念頭應該是Snort。多年來,Snort挾其優異的效能與開源碼的特性,早已成為在選擇入侵偵測系統的最佳首選。

Snort為網路型的入侵偵測系統(Network Intrusion Detect System,NIDS),通常是架設在網路的閘道(Gateway)上,監視著所有經過的來往封包,再利用樣式比對的方式,從中找出是否有符合的樣式。在確認發現符合的樣式後,執行管理者所定義的動作。

此種方式的優點在於部署簡單,僅需要在網段的出入口(閘道)部署一台機器,就能夠監控整個網段。但由於其比對的對象是封包樣式,而封包的內容千變萬化,有時很難用規則來表示,也因此誤判率比較高。

除了從網路端監控封包外,入侵偵測系統的另外一個思惟是直接部署在主機上,利用監控主機的資源變化(例如CPU執行率、Process的執行情況)來偵測是否有攻擊行為,此種類型的入侵偵測系統即稱為主機型入侵偵測系統(Host Intrusion Detect System,HIDS)。但由於主機型入侵偵測系統高度相依於系統的架構,如果作業系統進行更新,甚至即使只是實施安全性更新的動作,都有可能造成主機型入侵偵測系統無法預期的錯誤。

為了避免此類缺點,因此利用監控系統的日誌資訊來判別是否有異常現象的主機型入侵偵測系統便應運而生。此種主機型入侵偵測系統不必高度相依於系統的架構,也因此只要作業系統的日誌系統未做大幅的更動(事實上,這種機率並不高),就能夠正常的運作,Sagan便是屬於此類的主機型入侵偵測系統。利用監控系統上的稽核紀錄,再與稽核紀錄中的內容進行樣式比對。如果有符合的樣式,就將相關資訊記錄在檔案內或資料庫中,其架構圖如圖3所示。

圖3  監控系統日誌資訊來判別異常。

其中,Sagan軟體是利用透過FIFO(First In First Out)裝置檔案(通常用來共享程式間的資料)來取得rsyslog所產生的稽核紀錄,並經過樣式比對,如果符合,就將相關資訊儲存至檔案或資料庫中。在本文中,將實作以Meer軟體將資料儲存至MySQL資料庫。

接下來,安裝Sagan(在本文所使用的版本為1.2.2)。在安裝Sagan之前,必須先安裝相依的程式庫套件,執行如下指令:

yum -y install libfastjson-devel yum -y install json-c-devel  && yum -y install json-c

由於liblognorm程式庫(在本文版本為2.0.6)並沒適合的RPM套件,因此將以原始碼編譯的方式安裝,相關步驟如下:

wget http://www.liblognorm.com/ files/download/liblognorm-2.0.6. tar.gz tar xvzf liblognorm-2.0.6.tar.gz cd liblognorm-2.0.6 ./configure make make install

同樣地,以原始碼編譯的方式安裝libmaxminddb,執行步驟如下所示:

git clone --recursive https:// github.com/maxmind/libmaxminddb cd libmaxminddb/ ./bootstrap ./configure make make check make install

在相關程式庫安裝完成後,最後安裝Sagan(在此版本為1.2.2):

adduser sagan wget https://quadrantsec.com/ download/sagan-1.2.2.tar.gz tar xvzf sagan-1.2.2.tar.gz cd sagan-1.2.2/ ./configure make && make install

Sagan常用組態說明

在安裝完成後,Sagan就會產生主要的執行檔(檔案名稱為sagan)以及主要的組態檔(檔案名稱為sagan.conf),以下為組態檔主要組態相關的說明,組態檔採用YAML(Yet Another Markup Language)標記語言,採用類似大綱的縮排方式呈現,其形式如圖4所示。

圖4  組態檔主要組態。

其中主區段,分為以下幾個部分:

Vars

在此區段中主要是定義重要組態變數的設定,常用的組態變數如下:

FIFO:FIFO是一種裝置檔案,通常用於不同程序間分享資訊。Sagan軟體便是利用裝置檔案來取得rsyslog軟體所產生的稽核紀錄。可設定將rsyslog軟體所產生的稽核紀錄儲存至FIFO檔案中,之後Sagan軟體再藉由讀取該FIFO檔案的方式來取得rsyslog軟體所產生的稽核紀錄,而達到不同程序間資料分享的目的。在Linux系統下,可使用mkfifo指令來產生FIFO檔案,例如執行「mkfifo /var/run/sagan.fifo」指令,可產生名為「sagan.fifo」的裝置檔案。

RULE_PATH:設定Sagan所使用之規則檔案所存放的目錄路徑資訊。

LOCKFILE:設定Sagan執行時,存放PID(Process ID,程序ID)資訊的檔案位置。

LOG_PATH:設定Sagan執行時,儲存Sagan所產生的相關紀錄的目錄位置。

網路服務通訊埠設定:Sagan會在此區段中設定相關網路服務所使用預設服務的通訊,例如SSH使用埠22,即設定「SSH_PORT 22」。

監控IP範圍設定:可在此設定監控IP的範圍,例如設定「HOME_NET: "any"」表示監控所有的來源IP,而設定「EXTERNAL_NET: "any"」則代表監控所有的目的IP。

sagan-core

此區段中主要是定義Sagan在運作時所使用的核心組態,常用的組態如下所述:

sensor-name:設定一個唯一的名稱來表示Sagan所在的主機識別。

fifo-size:1048576:設定所使用的FIFO裝置檔案的容量,單位為位元組。

default-host:即是設定Sagan程式運作時所在的主機IP位置或主機名稱。

processors

設定除了以sagan規則的偵測外,還有另外的偵測處理方式,以下為常用的方式:

track-clients:偵測Sagan軟體所依賴的rsyslog服務是否正常地運作。如果啟用此選項,就會在rsyslog服務停止及重啟時發出警報通知Sagan軟體。

rule-tracking:由於啟用規則解析會大量消耗CPU資源,因此可啟動此項處理,用來監控久未使用的規則,提供給管理者做為規則調整的重要參考。

perfmonitor:在啟動此處理後,會將Sagan在運作時的效能等資訊以CSV格式儲存在檔案中,可做為管理者調整Sagan運作效能的參考。

blacklist:使用者可將要特別監控的IP以CIDR格式儲存在檔案中,再啟用此處理,即可讓Sagan軟體在發現有符合IP資訊時發出警告訊息。

outputs

設定要輸出的格式和位置,常用的輸出格式如下所述:

eve-log:這是一種擴展事件(Extensible Event Format)的格式(以JSON格式儲存),通常要將Sagan所產生的紀錄寫入至資料庫中,就必須啟用此處理。在本文中,Meer軟體也是利用讀取此類檔案來將相關紀錄寫入資料庫內。

alert:設定儲存Sagan所產生之紀錄的檔案位置,其紀錄格式類似Snort所產生的警告(Alert)訊息格式。

fast:類似alert所儲存的檔案,但其紀錄格式略有不同。

smtp:設定當發生警告訊息時,就寄出電子郵件通知使用者。

syslog:發生警告訊息時,就將相關訊息寫入到系統Syslog機制中。

rules-files

此組態的用途是,設定Sagan所要使用規則檔案。

Sagan設定規則

在簡單說明過Sagan常用的組態設定後,接下講解Sagan所使用的設定規則,基本上,Sagan使用的規則樣式與Snort所使用的規則樣式是一樣的,其架構如圖5所示,相關規則描述如下:

圖5  Sagan使用的規則樣式。

(1)代表處理方式。也就是,當符合規則細項的設定時,所要採取的處理方式。提供了alert(當發現符合樣式的事件發生,就記錄相關資訊並發出警告訊息)和drop(當發現符合樣式的事件發生時,即記錄相關資訊)等兩種方式。

(2)為來源資訊的通訊協定。設定欲監測通訊協定的型態,通常設定為any,表示監測所有的資訊。

(3)則表示欲偵測的來源IP範圍及通訊埠口。亦即設定欲偵測的來源IP資訊,可採用CIDR樣式設定,或設為any,表示任何的來源IP均須偵測。

而(4)表示欲偵測的目的IP範圍及通訊埠。設定欲偵測的來源IP,可採用CIDR樣式設定或設為any,代表任何來源IP均須偵測。

(5)為規則細項,也就是實際所設定的規則樣式。使用者可利用Sagan所提供的保留字來設定相關規則,可查閱官網上的說明來了解相關規則細項的用法。

可以自行撰寫符合本身環境的規則,或者到官方網站取得通用規則集來應用,在本文中將以使用官方規則集為例。下載完成後,將相關的規則檔案置於sagan.yaml中的RULE_PATH變數所設定的目錄位置即可,本例為「/usr/local/sagan/rules」。

在完成rsyslog和Sagan的設定後,接下來要做的是先串連rsyslog與Sagan的連動,如果發生符合規則所設定的樣式,就將相關資訊寫入至檔案中。

首先新建一個FIFO的檔案裝置,來與rsyslog建立一個通道,以便取得rsyslog所產生的稽核紀錄,因此執行以下指令:

mkfifo /usr/local/sagan/log/sagan. fifo  #建立一個FIFO裝置 chown sagan:sagan /var/run/sagan. fifo  #更改該檔案的擁有者為sagan

接著,確認在rsyslog.conf是否有如圖6所示的設定。

圖6  檢查設定是否正確。

這表示要將rsyslog所產生的稽核紀錄,以Sagan的樣式傳遞至sagan.fifo檔案裝置上。接著,重啟rsyslog檔案。此時,以「cat sagan.fifo」的方式來確認rsyslog是否已將稽核紀錄傳遞至sagan.fifo檔案。如果一切正常,應可看到如圖7所示的輸出。

圖7  查看輸出結果以確認運作是否正常。

緊接著,確認sagan.conf中的組態值是否設定正確的值,如圖8所示。

圖8  確認sagan.conf內的組態值。

最後,以「sagan -D  -f [sagan.yaml 所在位置]」指令來啟動Sagan。

此時,可利用nmap掃描此主機的方式做為測試,如果一切正常,就會在alert.log檔案內儲存如圖9所示的紀錄。

圖9  查看alert.log檔案內的紀錄。

實作至此,已成功安裝Sagan,可以正常監測稽核紀錄,並以檔案方式儲存相關偵測結果。 接下來要進行的,就是繼續安裝Meer軟體,然後將Sagan輸出的結果寫入資料庫內。

安裝Meer

接著,繼續執行下列的指令和參數,來安裝Meer軟體:

yum -y install json-c-devel   #安裝json-c程式庫 git clone https://github.com/ beave/meer.git #取得Meer最新版本 cd meer ./autogen.sh ./configure   make make install  #編譯並安裝Meer mkdir /usr/local/meer/log   #建立Meer紀錄檔存放目錄 chown sagan:sagan /usr/local/ meer/log

在實作過程中,可能會有找不到sid-msg.map的錯誤出現,因此可先利用Meer軟體所提供的create-sidmap.pl程式來產生這個檔案:

perl create-sidmap.pl /usr/local/ sagan/rules/ > /usr/local/sagan/ rules/sid-msg.map

接著,再依據sql/create_mysql的內容來建立所需要的資料庫表格,在此資料庫名稱設定為「meer」。

同樣地,Meer的組態檔(檔名為meer.yaml)也是使用yaml格式來設定。其常用的組態設定如下所述:

hostname:設定主機名稱(此名稱必須是唯一)。 Interface  # Can be anything.  Sagan  "syslog", suricata "eth0".:設定所要取得稽核紀錄的介面,提供的選項有syslog(設定從主機的Syslog機制中取得稽核紀錄,Sagan即是從Syslog中取得稽核紀錄)、網路卡介面(如果為suricata,這是一套類似Snort的網路型入伺偵測系統,在此即需要設定網路卡介面代號,例如eth1)。

runas:設定運作時的權限,例如設定為「runas sagan」,表示以sagan的使用者權限在運作。 follow_eve:設定監視Sagan輸出之eve格式的檔案,此組態須與sagan.yaml中的eve-log設定一致,如圖10所示。

圖10  設定監視Sagan輸出之eve格式的檔案。

接著,設定資料庫區段(sql),包括以下幾個選項:

enabled:設定是否啟用資料庫功能,設定為yes,表示啟用資料庫功能。

driver: mysql:設定要使用資料庫的類型,提供了MySQL及PostgreSQL選項。在此將會設定為MySQL。

server:設定資料庫主機所在的位址。

port:設定資料庫所使用的通訊埠資訊。

username:設定資料庫使用者名稱。

password:設定資料庫使用者密碼。

database:設定資料庫名稱。

開始實作

在簡單說明Meer組態檔的相關設定後,就來實作將Sagan所輸出的資訊利用Meer儲存進資料庫內。首先,確認sagan.yaml中的eve-log是否有啟用。接著,再確認meer.yaml中的follow_eve組態值是否確實指向eve-log檔案的所在位置,以及sql區段中相關資料庫設定是否正確。在確認之後,即可重新啟動Sagan,並以下列指令來啟動Meer:

meer -c meer.yaml -D

如果一切運作順利,Sagan就會將相關的紀錄儲存進資料庫中,此時可利用BASE(Basic Analysis and Security Engine)這一套PHP的網頁軟體來管理Sagan所產生的資料。

<本文作者:吳惠麟,多年資安經驗,喜好利用開源碼建構相關解決方案,著有「資訊安全原理與實驗」等書。>

 


追蹤我們Featrue us

本站使用cookie及相關技術分析來改善使用者體驗。瞭解更多

我知道了!