之前曾經介紹過如何運用Netflow來找出網路裡的嫌疑犯,但對於忙碌的網管人而言,要一筆一筆去檢查使用者是否有異常行為,不僅浪費人力,更會犧牲寶貴的時間。其實,結合sFlow與Snort來自動抓出惡意的網路行為,就可以讓這些檢查動作自動化。
在本篇文章中,將介紹如何結合sFlow與Snort自動抓出惡意的網路行為,並且自動發出告警信來通知管理者,以減少人力的負擔。
首先先介紹sFlow。sFlow和Netflow聽起來很相似,但在骨子裡卻不一樣。Netflow會針對所有流經的網路封包去取得其特徵,包含Source IP address、Destination IP address、Source port for UDP or TCP, 0 for other protocols、Destination port for UDP or TCP, type and code for ICMP, or 0 for other protocols、IP protocol、Ingress interface (SNMP ifIndex)、IP Type of Service這些資訊。
由於Netflow會對所有流經的封包進行處理,若網路流量極大時,Netflow所提供的資料量亦會隨之增加,若資料量太大,後端分析引擎可能會不堪負荷,進而影響資料判讀時的正確性。
sFlow的作法和Netflow不同,sFlow以取樣的方式取出資料的摘要,使用者可以自訂其取樣大小及取樣週期,即使流經大量網路流量,但sFlow經取樣後的資料相對於Netflow而言會大量的減少,如此一來就可以兼顧資料正確性並確保後端分析引擎處理能力。
在實務上,sFlow較常運用於高速網路的環境,也是因為其具有此特性的關係。sFlow提供的資料格式在之後實作的階段會加以展示,在此不多作說明。
在實作時,會遭遇到許多的困難,這是因為sFlow僅在部分設備上提供,也不像Netflow,在Linux中可使用nfdump套件來產生符合其格式的流量。
在幾經研究後,於「http://www.sflow.org/products/network.php」網頁內找到相關線索,可以使用Open vSwitch來產生sFlow流量,因此之後的安裝流程會先示範如何安裝Open vSwitch,並產生sFlow流量。
安裝Open vSwitchx
本文的安裝環境為使用Linux Ubuntu 11.10 Server版本,Apache及MySQL在安裝Linux時已預先安裝。由於必須自行編譯(Compile)程式,因此先安裝build套件:
之後,到Open vSwitch網站(http://openvswitch.org/)下載原始程式。
下載後將之解壓縮,並加以編譯再進行安裝,在編譯過程中指定--with-linux參數以產生Kernel Module,以便載入Kernel中執行。在此使用的是最新版本1.3.0。
接著,將剛編譯產生的Kernel Module置入(Insert)Kernel中,若原先有安裝bridge模組,記得先將之rmmod(刪除模組)。
之後開始建立Open vSwitch的db檔。此步驟只須執行一次,之後若伺服器(Server)重開機,也不需要重新執行此步驟。
隨後啟動ovsdb-server,manager_options是ovs-vswitchd.conf.db檔中的column名稱,可能會隨著版本而改變,例如在1.1版本為managers。請注意,以下的步驟若碰到伺服器重開機,就必須重新執行。建議將之存檔為shell script檔,並於開機後執行。
然後,初始化資料庫。
接著就可以啟動ovs-vswitchd daemon,正常會如圖1所示:
|
▲圖1 ovs-vswitchd正常啟動後的情形。 |
然後,開始建立虛擬交換(Virtual Switch)。先產生一個br0的介面,並將之喚醒:
接著,將eth1及eth2加入br0的群組中。
可以執行下列的指令來確認是否有建立br0的群組:
也可以列出br0由哪些實體介面組成:
最後,再確認一下eth1和eth2都是屬於br0群組。
這個時候,便可測試一下Open vSwitch的輸出。分別在eth1和eth2介接設備,各自設定成192.168.1.1及192.168.1.2的網路位址,並且做傳檔測試。然後,使用tcpdump來觀察eth1的輸出,此時輸出如圖2所示。
|
▲圖2 Open vSwitch的輸出。 |
從圖2中可以看到流量相關的資訊,例如IP、MAC、IPSize、headerLen、vlan等。此時尚未產生sFlow格式的輸出,讀者可將此圖2和產生sFlow後的圖5做一個比較。
產生sFlow流量
接著到了重頭戲:sFlow的產生。在此建立一個Shell Script檔,以方便後續管理及維護,其內容如下:
由於這裡要透過本機來接收sFlow的封包,因此將AGENT_IP所屬的介面指定為lo,並指定Collector的IP為127.0.0.1,Port為UDP 6343,指定其每10秒Pooling一次,並指定取樣頻率(Sample Rate)為64(每隔64個Packet就取樣一次),之後再執行這個Script檔(記得執行chmod +x),讓br0可以送出sFlow records。
可以利用以下的指令查看剛剛的設定是否成功:
輸出結果如圖3所示,從中可以看出agent是lo,此外還有header長度、polling週期,取樣率及輸出目的等資訊,此外uuid也是一個觀察的重點。
|
▲圖3 sFlow輸出設定。 |
接著透過tcpdum指令來驗證是否可從lo介面收到sFlow records。圖4是得到的tcpdump輸出,可以驗證有收到sFlow封包。
|
▲圖4 tcpdump輸出結果。 |
隨後開始製造流量,讓它流經eth1和eth2,並利用tcpdump觀察其資料格式(圖5)。
|
▲圖5 sFlow record的輸出。 |
由此可以看出,sFlow的輸出字串和一般熟知的SNMP MIB的格式及命名方式相當接近。此外,也可以看出每一個sFlow是由Datagram開始的,中間有數個Sample,最後再由DataGram結束。中間Sample出現次數,端看當初取樣的頻率而定。
接著下載sflowTools,將sFlow的輸出轉化為tcpdump格式,以方便Snort處理。sflowtool的官方網頁為「http://www.inmon.com/technology/sflowTools.php」,讀者可自行參閱。
緊接著,切換至「/usr/src」目錄,並下載sflowtool原始檔。
將原始檔解壓縮,並編譯及安裝。
暫時不啟動sflowtool,待Snort安裝完成後再一併啟用。接著,動手安裝Snort。
安裝Snort
在Ubuntu 11.10的環境下,安裝Snort是很輕鬆的。若之後要自行更新rule檔,請自行到Snort官方網站註冊帳號並下載更新。
在安裝過程中會詢問所要監控的網段,在此可以任意輸入。之後可以編輯「/etc/snort/snort.debian.conf」檔案再做調整。
在本文中所規劃的是結合Snort與sFlow,因此無須特別指定其網段。安裝完成後,Snort已經自行啟動,記得將它關閉。
為了保險起見,避免重開機時Snort再次被啟動,所以把Snort的啟動程式移到「/root」目錄中。
此時就可以啟動sflottool,並將它的輸出作為Snort的輸入,指令如下:
-p 6343代表sflowtool接受UDP port 6343的輸入,-t代表以Binary檔的方式輸出符合tcpdump的格式,並且將之作為Snort的輸入,而Snort讀取「/etc/snort/snort.conf」之後啟動。
在此操作過程中,發現community-virus.rules這個檔案有兩行需要修改,因此須編輯「/etc/snort/rules/community-virus.rules」這個檔案。並在第19行及20行的最前面加上#號。以下為啟動Snort時的錯誤訊息:
接著,將要觀察的流量來源接在eth1(以Mirror Port的方式收集對外網路的流量)。開始做側錄之後,在「/var/log/snort」目錄內會有log檔案產生,產生的檔案會以「/etc/snort/snort.conf」檔案中所設定的格式輸出。預設會有alert及tcpdump.log. 1324615511(後面的數字是以Timestamp格式呈現)的檔案產生,如圖6所示。
|
▲圖6 成功啟動Snort後所儲存的log檔。 |
確定alert及tcpdump檔產生之後,可以看一下alert檔的內容,如圖7所示。
|
▲圖7 alert的內容。 |
在此alert檔案中,可以看出這是屬於SNMP public access的封包,可能是有電腦或設備嘗試用public這個Community去存取其他設備,這是中毒或被植入後門的徵兆之一。
讀者若有興趣的話,可以點擊Xref裡面的連結,會有相當豐富的說明。例如點擊「http://cve.mitre.org/cgi-bin/cvename.cgi?name=2002-0013」,將會告知這可能是基於SNMP version 1的漏洞,它用大量的SNMP request試圖去癱瘓設備,藉以取得權限。
除了CVE的連結外,Snort也提供其他知名網站的連結,例如SecurityFocus,它告知這可能是Multiple Vendor SNMP Trap Handling Vulnerabilities。
同樣一個訊息,各大資安網站可能都會有屬於自己的解讀,同一個網站也可能有不同的連結可以參考,例如CVE提供了2002-0013、2002-0012、1999-0514的連結供參考。不妨多方嘗試,並且觀察不同網站提供的訊息,多方比較,藉以找出可能的真正原因。
結語
本文簡單介紹了sFlow,並以簡單的例子示範如何結合sFlow與Snort自動解析(Parser)所有的流量,試圖以自動化的方式揪出可疑的IP來源,並且找出可能是惡意的攻擊或是病毒及蠕蟲的資訊。
本文的另一個重點是Snorby,Snorby是Snort的圖形化前台程式,它把Snort的log檔以圖形化的介面展現出來,減少使用者在使用和管理時的負擔,但是其安裝過程相較於一般人熟知的Acid Base而言,相當的困難及繁瑣,因此將Snorby安裝設定及教學的部分獨立於下一個章節介紹,若讀者有興趣的話,屆時不要忘記跟著把好看又好用的Snorby也架設起來,以達到節省人力並輕鬆做好網路管理的目標。