2014年5月12日 星期一

用sagan即時監控log 自建主機型入侵偵測系統

建置IDS保護特定主機 與網路型snort相輔相成
用sagan即時監控log 自建主機型入侵偵測系統

本文將介紹主機型入侵偵測系統sagan,它將善用即時監控系統主機上的syslog資訊,並且比對是否內有符合的惡意樣式,倘若結果符合,就立即阻擋惡意來源,或是寄發電子郵件通知管理者。

在一般企業中,除了設置防火牆設備來阻擋直接的惡意攻擊外,通常也會部署所謂的入侵偵測系統(IDS)來監控進入網路的相關連線,並且在發現符合樣式的惡意行為後加以記錄並發出警訊,有些設備更可以在發現惡意的連線後,直接中斷相關的連線,此即所謂的IPS。

但是,一般所部署的入侵偵測系統(在開源碼社群中最有名的即為snort)通常為網路型的入侵偵測系統,此種設備通常是架設在網路的閘道(Gateway)上,對所有來往的網路封包進行比對,再從中比對是否有符合的惡意樣式,此種方式的優點在於可監控的範圍最大(幾乎可監控整個網域),但其最大的缺點是誤判率也相當高。

如果以現實生活來比喻,網路型的入侵偵測系統就像是架設在街道上的監視器,監控街道上來往的行人。

假設定義一種惡意樣式「手上拿刀的人,均是惡意的」,那在街道上手上拿刀的人就會被判別為惡意,但在現實上,手上拿刀的人也許有其背後的理由,不完全是有惡意動機。引申至網路型的入侵偵測系統,其最為人所詬病的,即是經常將某些正常軟體的行為誤判為惡意的,也因此主機型入侵偵測系統的概念應運而生。

主機型入侵偵測系統是架構在個別主機上,所以其優缺點恰巧與網路型的入侵偵測系統相反,其監控範圍僅限於個別主機,但準確率相當高。

以上面的例子來說,假設將個別主機比喻成住家,主機型入侵偵測系統只有在「手上拿刀的人,而且來敲你家的門,甚至未經你的允許就進入到家裡」才會判別為惡意的行為,如此一來,其判別的準確率相當高。

對此,本文將介紹一套主機型入侵偵測系統(名稱為sagan),它主要的功能在於利用即時監控系統主機上的syslog資訊,並比對是否有符合的惡意樣式。

表1 實作所需軟體套件 



如果結果符合,即可採取管理者所設定的相關指令,例如設定記錄相關資訊、阻擋惡意來源或是寄發電子郵件通知管理者等動作,而本文所使用的軟體套件如表1所示。

syslog說明 

syslog又被稱為系統日誌,這是一種定義在網際網路協定(TCP/IP)上傳遞紀錄檔(Log)訊息的標準。syslog協定是一種主從式的架構(稱為客戶端-伺服器端),syslog客戶端利用傳送出一個小的文字訊息到syslog伺服器端進行記錄。syslog系統日誌訊息可以利用UDP通訊協定或TCP通訊協定來傳送。

基本上,如果沒有做任何的額外處理,相關系統日誌資料是以明碼型態傳送。syslog的所定義的標準格式如下所示:



以上標準格式定義共分為四個欄位:

‧記錄事件發生時的日期與時間
‧記錄發生此事件的主機名稱(如上述的Spampc)
‧記錄啟動此事件的服務名稱(如上述的sshd)
‧記錄訊息的實際資料內容

syslog是以Facility與Level來定義事件的種類及嚴重等級,其中Facility指的是那些種類的事件,通常是以服務來區分,如FTP、Mail等類型事件,而事件類型區分如表2所示。

表2 事件類型區分 


Level則是用來描述事件嚴重的程度,可區分成如表3所示嚴重級別。

表3 Level的嚴重級別(嚴重程度由低至高) 


基本上,Log檔案就像是一張體檢表,只要能夠正確地解讀Log資訊的涵意,即可完整地掌握主機目前的狀況。

sagan介紹 

sagan程式可即時監控syslog資訊,簡單來講,就是即時監控系統上的Log檔案,並且可利用所設定的規則來解析syslog資訊,以監控Log檔案是否內含惡意的樣式,進而發現是否有潛在的惡意攻擊事件。相關的架構圖如圖1所示。


▲圖1 sagan程式架構圖。

sagan程式利用FIFO裝置與syslog建立通道來取得相關的syslog資訊,並與所設定的規則檔案比對,如果符合相關的樣式,即執行相關的動作(最常見的是記錄相關資訊檔案)。

除了可記錄至檔案外,sagan也提供記錄至資料庫的機制(利用barnyard2程式),但本文將只探討記錄至檔案的機制。

開始安裝 

在安裝sagan軟體之前必須先安裝相關所需的程式庫,首先執行指令「yum install pcre-devel」安裝pcre-devel程式庫,這是sagan所需要的程式庫,主要用來提供正規表示法所需要的函式。

然後,透過指令「yum install libdnet-devel」來安裝libdnet-devel程式庫,此為sagan所需的程式庫,用來提供網路功能所需要的函式。

安裝libee-0.4.1程式庫 

執行指令「tar xvzf libee-0.4.1.tar.gz」解壓縮libee原始檔,然後以「autoreconf -vfi」自動組態相關選項,並使用指令「./configure」組態相關選項,自動產生makefile檔案。接著,依序以指令「make」及「make install」來編譯及安裝相關程式。

安裝libestr-0.1.9程式庫 

v 先解壓縮libestr原始碼,所以執行指令「tar xvzf libestr-0.1.9.tar.gz」,再透過「autoreconf -vfi」自動組態相關選項。隨後,執行指令「./configure」組態相關選項以便自動產生makefile檔案,並使用「make」指令編譯以及「make install」指令來安裝相關程式。

安裝json程式庫 

json程式庫是安裝LibLogNorm所需的程式庫,用來提供解析json格式所需的函式。先執行指令「tar xvzf json-c-0.11-20130402.tar.gz」解壓縮,然後輸入指令「./configure」,以便組態相關選項來自動產生makefile檔案。

最後,以「make」指令編譯相關程式、「make install」指令安裝相關程式。

安裝liblognorm程式庫 

liblognorm程式庫是sagan所需的程式庫,可提供解析Log格式所需要的函式。先組態相關選項,執行指令「./configure」來自動產生makefile檔案,然後執行指令「make」進行編譯動作,最後使用指令「make install」開始安裝相關的程式。

安裝rsyslog-6.6.0 

接著安裝rsyslog-6.6.0,先執行指令「./configure --prefix=/usr/local/rsyslog」組態相關選項,自動產生makefile檔案,並且設定將相關程式安裝到「/usr/local/rsyslog」目錄內。

筆者的習慣是將相關軟體安裝在特定目錄上,如果想將sagan軟體安裝在系統標準的目錄時,則無須設定「--prefix」參數。然後分別執行指令「make」及「make install」進行編譯與安裝。

安裝sagan-1.0.0RC1 

安裝sagan-1.0.0RC1軟體,先使用指令「adduser sagan」新增名稱為「sagan」的使用者當作sagan執行時所使用。然後組態相關選項,請執行指令「 ./configure」自動產生makefile檔案,最後透過指令「make」進行編譯。

筆者在編譯過程中曾發生「too many arguments to function 'ln_normalize'」的錯誤。發生這個錯誤的原因在於,liblognorm程式庫內的ln_normalize函數已更動輸入參數的個數,這必須在出錯的程式原始碼中將「ln_normalize(ctx, buf, strlen(buf), &json)」修改為「ln_normalize(ctx, buf, &json)」,亦即少掉strlen(buf)參數。

另外一個遇到的問題是,發生找不到json.h檔案的狀況,解決辦法是將出錯的檔案(檔名為liblognorm.h)中的「#include 」更改為「#include 」後再重新編譯。

安裝好sagan軟體後,就會產生主要的執行檔(檔案名稱為「sagan」)及主要的組態檔(檔案名稱為「sagan.conf」),表4為組態檔主要組態相關的說明。

表4 sagan.conf組態檔主要組態說明 


在說明主要的組態內容後,接下來講解sagan程式所使用的規則檔案樣式(以下稱為rules),sagan程式所使用的rules設定樣式極度相似於snort(網路型入侵偵測系統),如圖2所示即為一實際設定樣式,而相關規則描述如表5所示。


▲圖2 rules設定樣式。

表5 規則描述 


圖2中所舉的範例主要是偵測是否有SSH的暴力攻擊事件,其設定的門檻值為在5分鐘(seconds 300)內,如果發生超過5次的SSH登入失敗,即判定為暴力攻擊事件。

可自行撰寫符合本身環境的rules,也可至sagan官方網站取得官方的rules,本文中以使用官方rules為例。

下載完成後,將相關的rules置於「/usr/local/etc/sagan-rules/」目錄下即可。接下來的動作是建立一個FIFO的裝置,以及與rsyslog建立一個通道,來取得相關的syslog資訊,相關指令如下(其中#為注釋):



然後,在rsyslog主要組態檔「rsyslog.conf」內加上以下的設定:



接下來再重啟rsyslog服務,然後以「cat /var/run/sagan.fifo」指令查看sagan. fifo裝置檔案,如果一切正常,應可看到關於syslog相關的資訊。

在確認sagan.fifo已經正常運作之後,就可以設定sagan.conf並且啟動sagan程式。設定sagan.conf很簡單,僅須更改sagan軟體所附組態範例檔中的「sagan_host」選項,將其改成所在主機的IP位置資訊,而其餘使用預設即可,並且使用以下的指令格式:



至此,讀者可以利用SSH登入方式,故意輸入錯誤的帳號和密碼(製造SSH暴力攻擊的假象),如果輸入的錯誤次數達到所設定的門檻值,那麼在「/var/log/sagan/alert」檔案內將會記錄如圖3所示的資訊。


▲圖3 相關提示訊息。

往後,只要定時地查看「/var/log/sagan/alert」檔案內容,即可獲知目前主機被攻擊的情況。至此,sagan系統即已完成!

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

轉載自《網管人