Linux防火牆擴展技術與入侵檢測實現

火星人 @ 2014-03-12 , reply:0
←手機掃碼閱讀

  

來自:linux.ccidnet.com

摘 要:該文介紹基於Linux netfilter/iptables架構實現機制和擴展技術,在此基礎上提出擴展匹配選項實現防火牆的入侵檢測功能,擴充后的防火牆可以像Snort一樣具有入侵檢測功能,從而擴展了防火牆的安全控制功能,並且可將Snort規則轉化為防火牆規則實現防火牆規則集的擴充。

關鍵詞:防火牆 入侵檢測 擴展

按照防火牆對內外來往的數據的處理方法,防火牆可以分為包過濾防火牆和應用層防火牆,包過濾防火牆工作在網路層,它只是檢測包的協議頭對數據包進行裁決,它運行速度快但無法對高層的協議內容進行檢查,應用層防火牆則可以對高層數據進行轉發和過濾並強制身份驗證,但對不同的服務需要提供代理應用程序並且建立了網路瓶頸;並且將包過濾技術和多種應用技術融合到一起,構成複合型防火牆是目前國內防火牆產品的一個特點,也是防火牆今後發展的主流技術。鑒於在防火牆中整合數據包檢測功能是一種良好的解決方法,它可以彌補現有防火牆的缺點並且具有像入侵檢測系統一樣的檢測功能,本文將介紹基於Linux netfilter/iptables架構實現機制和擴展技術,在此基礎上提出了擴展匹配選項實現防火牆的入侵檢測功能,擴充后的防火牆可以像Snort一樣具有入侵檢測功能,並且可將Snort規則轉化為防火牆規則實現規則集的擴充。

1 Linux防火牆的擴展netfilter/iptables的技術

Linux中防火牆Netfilter/Iptables系統主要包括兩個基本組件 :定義在內核空間中的通用框架Net filter和數據包選擇系統(Packet Selection).其中後者又由兩部分構成:在Net filter框架上定義的數據結構「IP表」(IP Tables)和在用戶空間實現的應用程序iptables.具體防火牆工作流程見[1][2]。

由於Net filter架構的加入,可以通過簡單的內核模塊化來實現新功能的擴展,在現有的Netfilter/Iptables中可以通過兩種方式對現有的防火牆進行擴充,一種是擴展Net filter通過編寫相關內核模塊調用nf_register_hook()直接在相關的鉤子上註冊從而獲得新特性,一種是擴展IP表通過編寫相關的匹配標準和目標來實現新特性;擴展IP表方式是對現有表的匹配規則的擴充與具體表無關。擴展IP表需要編寫內核和用戶兩方的代碼,內核模塊提供了實際的數據包匹配規則代碼,用戶方代碼提供了IPTABLE 新的命令行選項的共享庫。

2 Linux防火牆入侵檢測擴展匹配設計

目前入侵檢測系統普遍採用精確的模式匹配演算法,如Snort採用基於規則的方式對數據包進行規則匹配來檢測多種不同的入侵行為和探測活動,這種方式簡單而有效,因此可以借鑒這種思想在防火牆的匹配選項中加入匹配選項來檢測數據包中的內容,由於擴展IP表具有很好地靈活性,為此可以選用這種方式擴充匹配標準來實現入侵檢測模塊。這種方式需要編寫內核和用戶空間代碼,Netfilter/Iptables的標準化提供了兩方使用的重要數據結構,在實現這兩部分代碼時主要是填充相應的數據結構內容然後將它們註冊從而擴展功能。

2.1 內核模塊數據結構

新的MATCH功能可作為一個獨立的模塊,為了能使新模塊能被別的模塊使用,可以使用iptable提供的ipt-register-match()將該模塊進行註冊,新的MATCH模塊的核心是ipt-match結構,它將作為ipt-register-match()的參數註冊到MATCH鏈表中備用從而增加新的規則匹配選項。

Struct ipt_match  {struct list_head list;一般設定為{NULL,NULL},由核心使用  const char name[];MTACH功能的名稱,該名稱必須與模塊名相匹配  int (*match)();一個指向MTACH功能函數的指針,返回非0表示匹配  int (*check entry)();一個指向檢查規則規範的指針,如果返回0,規則不會加入iptables  void (*destroy)(); 當一個使用該MATCH的入口被刪除時,該函數調用以釋放所佔資源  struct module me 是否是模塊的定義,是模塊設置為THIS_MODULE 否則NULL}

在該數據結構中重要的是match ,check entry 函數,MATCH函數將實現接收從底層傳來的數據包,檢查數據包實現匹配功能,如果數據包與所定義的規則相同那麼返回TRUE,如果不成功返回FALSE並且可以設置參數表示數據包可以被立即被丟棄。Check entry函數指向一個檢查規則規範的指針,如果返回0表明這條規則不能從用戶空間接受。

2.2用戶空間數據結構

在內核中加入相關的內核模塊選項后,為了在用戶空間使用iptables軟體提供相關的規則必須為該軟體提供相關的命令行選項,為了使各個擴展模塊使用一個版本的iptables軟體而不必編寫相關擴展的特定軟體版本,採用共享庫可以解決該問題,共享庫應該具有-init()功能,它的功能和內核模塊功能相似,在裝載時被自動調用,該功能根據添加的新MATCH和新TARGET不同分別調用register-match()或register-target(),共享庫可以提供初始化數據結構和提供相關選項的功能。編寫共享庫中使用的重要數據結構是iptables_match,它作為參數傳遞給register-match()註冊相關的命令行匹配選項讓iptables識別該新匹配。

Struct iptables_match  {struct iptables_match *next;用於形成一個MATCH列表的指針,初始化為NULL  ipt_chainlabel name; MATCH功能的名字,  必須與庫函數名相同便於主程序根據MATCH名載入相應的動態連接庫  const char *version;版本信息通常被設置IPTABLES_version宏  size_t size;該MATCH的數據大小  size_t userspacesize;由於內核可能修改某些域,  在這裡填寫被改變數據區大小,它一般和size大小同  void (*help)(void);列印幫助選項大綱  void (*init)();初始化ipt-entry-match結構   int (*parse)();掃描並接收本MATCH的命令行參數,正確接受返回非0  void (*final_check)();檢查是否強制選項(如--ids)被描述,如果不正確退出  void (*print)();查詢當前表中的規則時,顯示使用了當前match規則的額外信息  void (*save)();PARSE的反轉,被iptable-save調用再生match的命令行參數  const struct option *extra_opts;NULL結尾的參數列表,提供命令行其餘選項  /*以下參數由iptables內部使用,用戶不必填寫*/  Unsigned int option_offset;  Struct ipt_entry_match *m;  Unsigned int mflags;  Unsigned int used;  }

2.3 入侵檢測模塊的實現

本文介紹的功能擴展主要是通過IPTABLE命令向防火牆「IP表」添加字元串匹配規則和數據包內容相匹配從而實現對數據包的檢測,在內核中需要添加一個ids檢測匹配模塊,在用戶空間命令行上需要提供一個 「iptables -m ids ?ids 「匹配內容」」的選項。

在內核模塊中主要是實現MATCH指針函數,在該函數中使用了字元串的模式匹配演算法用於檢測數據包的內容。模式匹配是指在文本Text= tlt2t3...tn中檢索子串Pat=P1 P2...pn(模式)的所有出現,著名的匹配演算法有BF演算法、KMP演算法、BM演算法及一些改進演算法,基於BM演算法的BMH演算法 被證明是一種快速、高效的演算法,於是在設計時採用該演算法。

BMH演算法於1980年Horspool提出的,該演算法在匹配的過程中模式從左向右進行,但字元的比較從右向左進行,在發現不匹配時,演算法根據預先計算好的skip數組將模式右移,BMH演算法在最壞的情況下複雜度為O(NM),在一般情況下比BM有更好的性能,它只使用一個數組,簡化了初始化過程.以下是在match函數中使用的BMH演算法:

Char *ids_match   (char *pattern, char *text, int pattern_len, int text_len)   {       int k, right_end,j, i,*skip;         K = right_end = pattern _len-1;       for (i = 0; i <1024; i++) skip[i] = pattern_len;//初始化skip數組         for (i = 0; pattern [i]; i++) skip[pattern [i]] = k - i; //對skip數組進行修正        While (right_end < text_len){       For (i = 0; i < pattern _len && text [right_end - i] == pattern [k - i]; i++);             If (i == pattern _len) {                return text+(right_end - k);//返回text匹配的開始處           }           right_end = right_end + skip[text [right_end]];   //模式向右移skip[text [right_end]]位       }       Return NULL;  }

檢測功能主要由match(const struct sk_buff *skb,const struct net_device *in, const struct net_device *out, const void *match info, int offset, const void *hdr,u_int16_t datalen,int *hotdrop)函數實現,該函數從緩衝區skb讀取網路數據包,使用match info接受來自用戶空間的匹配內容,從skb中計算出數據包的大小tlen,從match info中獲取匹配內容的大小mlen,如果數據包內容為空或mlen>tlen則返回0不能進行比較;否則將網路數據包內容和大小tlen、match info中數據及大小mlen作為參數調用ids_match進行匹配,然後返回匹配結果。

填充用戶空間的數據結構時,要保證name與核心對應的Match名相同,並且為了提供命令行附加選項需要填充extra_opts數據結構為{"ids",1,0,'1'},它表示ids帶參數值,如果出現「—ids 「匹配值」」就會返回』1』用於parse()的參數來對附加信息進行處理如檢查附加選項中是否有非(!)號存在,從命令行解析得到匹配內容並將其填充到傳入到內核模塊的數據結構中。

2.4 IPTABLE補丁的機制

在將用戶空間和內核空間代碼編寫完成後,可以直接修改源碼並編譯安裝,為了標準化和方便,NETFILTER/IPTABLES提供了擴展內核和用戶空間的補丁程序:用於內核補丁的patch-o-iptables和在iptables源碼下的extensions目錄用於iptables程序本身補丁。在patch-o-iptables中提供了一個「runme」腳本來為核心打補丁,按功能需要的文件有五部分 :主程序文件、內核配置文件補丁、內核配置文件幫助補丁、runme腳本顯示幫助信息、內核make file文件補丁。iptables本身的擴展稍微簡單一些,那就是在extensions目錄下增加一個libipt_ids.c的文件,然後在本子目錄的Make file的PF_EXT_SLIB宏中附加一個ids字元串。

通過補丁或將代碼添加進內核后需重新編譯內核添加相應的功能模塊,在用戶空間也必須重新編譯iptables以便提供新的功能選項。

2.5 Snort規則轉為IPTABLES規則

添加好字元匹配模塊后,就可以通過IPTABLES定義相應的字元匹配規則從而實現入侵檢測功能,如有些蠕蟲病毒的請求中包含了cmd.exe,可以編寫如下的規則來對這樣的請求進行丟棄:iptables -I INPUT -j DROP -p tcp -s 0.0.0.0/0 -m ids --ids "cmd.exe" 。

這種運行方式和SNORT的檢測方式相似,並且SNORT 的規則及更新速度快可以將它的相關規則集轉化為在防火牆中可以使用的規則集。以下是將Snort中用於檢測掃描器的規則轉換為防火牆規則的實例:

alert icmp 192.168.0.12 any -> 192.168.0.27 any   (msg:"ICMP PING Sniffer Pro/Net Ray network scan";   itype:8; content:"Cinco Network, Inc."; depth:32;   classtype:misc-activity; sid:484; rev:4;)  Iptables ?A INPUT -p icmp -s 192.168.0.12 -d 192.168.0.27   --icmp-type 8 -m ids --ids "Cinco Network,   Inc." -j LOG --log-prefix " SID484 "     # "ICMP PING Sniffer Pro/Net Ray network scan"   classtype:misc-activity sid:484

3 結束語

通過實驗該防火牆可以對常見的蠕蟲、探測掃描、病毒等SNORT規則集能匹配的大多數攻擊有良好的抵禦作用。由於Netfilter/iptables具有很好的靈活性,在該框架上可以方便地對防火牆進行功能擴充。本文通過擴展匹配選項實現入侵檢測的功能,彌補了傳統的兩種類型防火牆不足,由於檢測功能在內核中保證了檢測的響應速度,通過將現有的大量Snort規則轉化為相應的防火牆規則可以迅速更新規則庫及時檢測攻擊,同時通過該方式也可以按照自身需要擴展防火牆功能,設計出廉價、安全、實用、易定製的防火牆。

參考文獻:

[1]Rusty Russell and Harald Welte, Linux Net filter Hacking Howto[EB/OL], http://www.netfilter.org/documention/HOWTO//netfilter-hacking-HOWTO.html,2002

[2]Rusty Russell , Linux 2.4 Packet Filtering HOWTO[EB/OL], http://www.netfilter.org/documention/HOWTO/en/packet-filtering-HOWTO.html,2002

[3]David Coulson, Mastering iptables[EB/OL], http:// davidcoulson.net/writing/lxf/14/iptables.pdf,2001

[4]Oskar Andreasson,Iptables Tutorial 1.1.19,http://iptables-tutorial.frozentux.net/iptables-tutorial.html,2001

[5] Nigel Horspool R. Practical fast searching in strings [J] ,Software-Practice and Experience, 1980

[6]http://www.snort.org[EB/OL]

[7]Lance Spitzner, Honeypot Farms[EB/OL], http://www.securityfocus.com/infocus/1720,2003

[8]iptables1.2.7a和patch-o-matic-20030912源碼[CP],http://www.netfilter.org






[火星人 via ] Linux防火牆擴展技術與入侵檢測實現已經有305次圍觀

http://www.coctec.com/docs/security/show-post-72628.html