1.1 什麼是入侵檢測系統
所謂入侵,是指任何試圖危及計算機資源的完整性、機密性或可用性的行為。而入侵檢測,顧名思義,便是對入侵行為的發覺。它通過從計算機網絡或系統中的若干
關鍵點收集信息,並對這些信息進行分析,從而發現網絡或系統中是否有違反安全策略的行為和遭到襲擊的跡象。進行入侵檢測的軟件與硬件的組合便是入侵檢測系統(簡稱IDS)。與其他安全產品不同的是,入侵檢測系統需要更多的智能,它必須可以將得到的數據進行分析,並得出有用的結果。一個合格的入侵檢測系統能大大簡化管理員的工作,保證網絡安全地運行。
1.2 入侵檢測系統的分類
按檢測所使用數據源的不同可以將IDS分為基於主機的IDS和基於網絡的IDS。
基於主機的IDS使用各種審計日志信息(如主機日志、路由器日志、防火牆日志等)作為檢測的數據源。通常,基於主機的IDS可監測系統、事件和操作系統下的安全記錄以及系統記錄。當有文件發生變化時,IDS將新的記錄條目與攻擊標記相比較,看它們是否匹配。如果匹配,系統就會向管理員報警,以采取措施。
基於網絡的入侵檢測系統使用原始網絡分組數據包作為數據源。基於網絡的IDS通常利用一個運行在混雜模式下的網絡適配器來實時監視並分析通過網絡的所有通信業務。一旦檢測到了攻擊行為,IDS的響應模塊就會對攻擊采取相應的反應,如通知管理員、中斷連接、終止用戶等。
1.3 入侵檢測的檢測方法
入侵檢測技術通過對入侵行為的過程與特征的研究,使安全系統對入侵事件和入侵過程能做出實時響應,從檢測方法上分為兩種:誤用入侵檢測和異常入侵檢測。
在誤用入侵檢測中,假定所有入侵行為和手段都能夠表達為一種模式或特征,那麼所有已知的入侵方法都可以用匹配的方法發現。誤用入侵檢測的關鍵是如何表達入侵的模式,把真正的入侵與正常行為區分開來。其優點是誤報少,局限性是它只能發現已知的攻擊,對未知的攻擊無能為力。
在異常入侵檢測中,假定所有入侵行為都是與正常行為不同的,這樣,如果建立系統正常行為的軌跡,那麼理論上可以把所有與正常軌跡不同的系統狀態視為可疑企圖。比如,通過流量統計分析將異常時間的異常網絡流量視為可疑。異常入侵檢測的局限是並非所有的入侵都表現為異常,而且系統的軌跡難於計算和更新。
對比這兩種檢測方法可以發現,異常檢測難於定量分析,這種檢測方式有一種固有的不確定性。與此不同,誤用檢測會遵循定義好的模式,能通過對審計記錄信息做模式匹配來檢測,但僅可檢測已知的入侵方式。所以這兩類檢測機制都不完美。就具體的檢測方法來說,現在已經有了很多入侵檢測的方法,但任何一種方法都有它的局限性,都不能解決所有問題。因而對於入侵檢測方法的研究仍然是當前入侵檢測研究的一個重點。 二、Linux下的實現
在對入侵檢測技術研究的基礎上,我們在Linux系統下設計並實現了一個基於網絡的入侵檢測系統。
2.1 系統的組成結構
該系統的組成結構如圖1所示。數據采集模塊負責從網絡上收集原始的網絡數據流,在經過一定的預處理後,這些數據被送到數據分析模塊,由數據分析模塊進行分析,以便判斷是否有違反安全策略的入侵行為發生。並及時將分析結果送到告警模塊,由告警模塊向控制台產生告警信息。用戶可以通過用戶界面與控制台交互,通過控制台,一方面可以對各個模塊進行配置,另一方面也可以接收告警信息。
圖1 系統的組成結構 2.2 系統的功能描述
該系統實現了入侵檢測的主要功能,包括數據采集、數據預處理、入侵分析以及告警。具體來說,可以完成以下功能:
● 捕獲符合指定條件的網絡數據包。
● 進行IP重組,提供IP包數據。
● 重組TCP流,提供TCP流數據。
● 重組應用層數據流,提供HTTP數據流。
● 實現基於規則的入侵檢測方法。
● 向控制台提交分析結果。
● 接受控制台的配置和管理。
由於該系統功能的實現主要體現在數據采集模塊和數據分析模塊中,所以下面將對這兩個模塊加以詳細說明。
2.3 數據采集模塊
數據采集是入侵檢測的基礎,入侵檢測的效率在很大程度上依賴於所采集信息的可靠性和正確性。在基於網絡的入侵檢測系統中,數據采集模塊需要監聽所保護網絡的某個網段或某幾台主機的網絡流量,經過預處理後得到網絡、系統、用戶以及應用活動的狀態和行為信息。數據采集需要在網絡中的若干關鍵點進行。
具體來說,數據采集模塊需要監聽網絡數據包,進行IP重組,進行TCP/UDP協議分析,同時也要進行應用層協議數據流分析。采集到的數據要經過預處理才能提交給數據分析模塊。由於不同的分析方法所需要的數據源是不同的,所以預處理也會有很大的不同。但是,一般來說,分析模塊所分析的數據都是基於某個網絡協議層的數據信息,或是直接采用這些數據的某些部分。因此在該系統的設計中,數據采集模塊除了采集數據外,還要對這些信息進行協議分析。協議分析是指將網絡上采集到的基於IP的數據進行處理,以便得到基於某種協議的數據。在本系統中主要是針對TCP/IP協議族的分析。
網絡數據采集是利用以太網絡的廣播特性實現的,以太網數據傳輸通過廣播實現,但是在系統正常工作時,應用程序只能接收到以本主機為目標主機的數據包,其他數據包將被丟棄。為了采集到流經本網段的所有數據,我們需要首先將網卡設置為混雜模式,使之可以接收目標MAC地址不是自己MAC地址的數據包,然後直接訪問數據鏈路層,截獲相關數據,由應用程序對數據進行過濾處理,這樣就可以監聽到流經網卡的所有數據。
在進行數據捕獲時,我們采用的是libpcap,libpcap是一個與實現無關的訪問操作系統所提供的分組捕獲機制的分組捕獲函數庫,用於訪問數據鏈路層。該庫提供的C函數接口可用於需要捕獲經過網絡接口數據包的系統開發上。這個庫為不同的平台提供了一致的編程接口,在安裝了libpcap的平台上,以libpcap為接口寫的程序,可以自由地跨平台使用。
Libpcap在網上捕獲到的是數據幀,我們還需要對數據幀進行協議分析,協議分析的處理過程為:首先根據預先定義的過濾規則從網絡上獲取所監聽子網上的數據包,然後進行TCP/IP棧由下至上的處理過程,主要是IP重組和TCP/UDP層協議處理,最後進行應用層協議分析。
協議分析的工作在每個操作系統裡都有,在這裡,我們選擇了libnids函數庫。libnids是在libnet和libpcap的基礎上開發的,它封裝了開發網絡入侵檢測系統的許多通用型函數。libnids提供的接口函數除了可以監視流經本地的所有網絡通信、檢查數據包外,還具有重組TCP數據段、處理IP分片包的功能。而且它同樣具有很好的移植性。
2.4 數據分析模塊
數據分析是入侵檢測系統的核心。各種分析方法各有利弊,但基於規則的檢測方法因為事先將各種入侵方式表示為規則存放於規則庫中,因此在規則庫比較完備的基礎上,可以有很好的檢測效率,所以我們在該系統的實現中主要考慮了基於規則的檢測方法。
基於規則的檢測方法是誤用檢測的一種。入侵檢測系統需要從以往的攻擊入侵活動中,歸納識別出對應的入侵模式,並將這些入侵模式存放於規則庫中,然後將系統現有的活動與規則庫中的規則進行模式匹配,從而決定是否有入侵行為發生。
每一種基於規則的入侵檢測方法都需要一個確定的入侵模式庫,即規則庫,其中存放著描述入侵方法和行為的規則。在我們的系統中,采用了SNORT的入侵行為描述方法。SNORT是一個開放源代碼的輕量級的基於網絡的入侵檢測系統。這種描述方法簡單、易於實現,能夠描述絕大多數的入侵行為。由於其簡單,因此檢測速度比較快。
規則庫中的每條規則在邏輯上分為兩部分:規則頭部和規則選項。規則頭部包含規則的操作、協議、源IP地址和目標IP地址及其網絡掩碼和端口。規則選項包括報警信息及需要檢測的模式信息。規則的一般格式為:
(;;…;;)
在圓括號前的部分是規則頭部,在圓括號中的部分是規則選項。規則選項部分中冒號前面的詞組稱為選項關鍵字。規則選項不是規則的必需部分,它只是用來定義收集特定數據包的特定特征。一條規則中不同部分必須同時滿足才能執行,相當於“與”操作。而同一個規則庫文件中的所有規則之間相當於一個“或”操作。
以下是一個例子:alert tcp any any -> 192.168.1.0/24 111 (content:|00 01 86 a5|; msg: mountd access;)。該條規則描述了:任何使用TCP協議連接網絡192.168.1.0/24中任何主機的111端口的數據包中,如果出現了二進制數據00 01 86 a5,便發出警告信息mountd access。
規則操作說明當發現適合條件的數據包時應該做些什麼。有兩種操作:alert和log。如果是 alert,則使用選定的告警方法產生警報,並記錄這個數據包;如果是log,則只記錄該數據包。
協議指明當前使用的是何種協議。對於IP地址和端口,關鍵字“any”可以用來定義任何IP地址。在IP地址後指定網絡掩碼,如/24指定一個C類網絡,/16指定一個B類網絡,/32指定一個特定主機。如192.168.1.0/24指定了從192.168.1.1 到 192.168.1.255的一個范圍的IP地址。
IP地址有一個“非”操作。這個操作符號用來匹配所列IP地址以外的所有IP地址。“非”操作使用符號“!”表示。例如任何由外部網絡發起的連接可以表示為:alert tcp !192.168.1.0/24 any -> 192.168.1.0/24 111。
端口號可以用幾種方法指定:用“any”、數字、范圍以及用“非”操作符。“any”指定任意端口。指定端口范圍用“:”它可以指定一個范圍內的所有端口。如:log udp any any -> 192.168.1.0/24 1:1024。該條規則記錄任何從任意主機發起的到目標網絡任何主機上的1~1024端口的UDP協議數據包。
方向操作符“->”規定了規則應用的數據流方向。其左邊的IP地址為數據流的起點,右邊為終點。雙向操作符為“”,它告訴系統應該關注任何方向的數據流。
規則選項形成了檢測系統的核心,一個規則的規則選項中可能有多個選項,不同選項之間使用“;”分隔開來,他們之間為“與”的關系。選項由關鍵字和參數組成,每個關鍵字和它的參數使用冒號“:”分隔。這些關鍵字主要包括:
● msg:在警報和記錄的數據中打印消息。
● logto:將數據包記錄到一個用戶指定的文件中。
● ttl:檢測IP數據包的TTL域。
● id:檢測IP數據包的分段ID域是否等於特定的值。
● nocase:設定搜索中使用與大小寫無關的方式。
● dsize:檢測數據包的有效荷載是否等於特定的值。
● content:在數據流中搜索特定的模式串。
● offset:設定content中的起點。
● depth:設定content中的終點。
● flags:檢測TCP數據包的標志是否等於特定的值。
● seq:檢測TCP的順序號是否等於特定的值。
● ack:檢測TCP的應答域否等於特定的值。
三、實例分析
下面結合入侵檢測的實例來介紹該系統是如何檢測入侵的,這裡以WEB攻擊為例來進行介紹。WEB攻擊是入侵的一大類,它是指利用CGI、WEB服務器和浏覽器等存在的安全漏洞來損害系統安全或導致系統崩潰的一類入侵方式。由於WEB的廣泛使用,關於它的各種安全問題不斷地發布出來,這些漏洞中的一些漏洞甚至允許攻擊者獲得系統管理員的權限而進入站點內部。因此,WEB攻擊的危害很大。
雖然WEB攻擊種類繁多,但是分析一下,還是具有如下幾個特點:
● 都是通過HTTP數據流來進行的,所以可以通過HTTP數據流來進行檢測。
● HTTP是無狀態的協議,一般都是通過一次請求來實現,或者包含有一次具有典型的入侵特征的請求,所以利用一次請求信息就可以實現檢測。
● 一般都是通過構造別有用心的請求字符串來實現的,所以可以采用基於規則的方法。
在我們的系統中可以檢測出100多種WEB攻擊方式。例如規則:alert http $EXTERNALNET any -> $HTTPSERVER 80 (content:/maillist.pl; nocase; msg: WEB-CGI Maillist CGI access attempt ;) 。該規則規定了檢測從外網的任意端口到內網的WEB服務器的80端口的數據流。檢測條件為請求中包含“/maillist.pl”字符串,匹配不分大小寫,告警名稱為“WEB-CGI Maillist CGI access attempt”。這裡利用了兩個自定義的變量$EXTERNALNET和$HTTPSERVER,分別表示外網和WEB服務器。
四、結束語
本文在對入侵檢測系統進行分析的基礎上,在Linux系統下實現了一個基於網絡的入侵檢測系統。實踐表明,該系統對於檢測一些常見的入侵方式具有很好的效率和性能。同時,該系統提供了完整的框架,可以靈活地應用於各種環境並擴充。當然,本系統還有很多不足的地方:數據源比較單一,還應該加入日志數據源;而且現在對於應用層協議只實現了HTTP協議分析,以後還可以加入其他協議分析,如TELNET、FTP等。這些都需要今後進一步完善。未來的入侵檢測系統將會結合其它網絡管理軟件,形成入侵檢測、網絡管理、網絡監控三位一體的工具。同時,網絡安全需要縱深的、多層次的防護。即使擁有當前最強大的入侵檢測系統,如果不及時修補網絡中的安全漏洞的話,安全也無從談起。只有將入侵檢測系統與其他安全工具結合起來,才能構築起一道網絡安全的立體防御體系,最大程度地確保網絡系統的安全。