Linux防火墻擴(kuò)展技術(shù)與入侵檢測(cè)實(shí)現(xiàn)
按照防火墻對(duì)內(nèi)外來往的數(shù)據(jù)的處理方法,防火墻可以分為包過濾防火墻和應(yīng)用層防火墻,包過濾防火墻工作在網(wǎng)絡(luò)層,它只是檢測(cè)包的協(xié)議頭對(duì)數(shù)據(jù)包進(jìn)行裁決,它運(yùn)行速度快但無(wú)法對(duì)高層的協(xié)議內(nèi)容進(jìn)行檢查,應(yīng)用層防火墻則可以對(duì)高層數(shù)據(jù)進(jìn)行轉(zhuǎn)發(fā)和過濾并強(qiáng)制身份驗(yàn)證,但對(duì)不同的服務(wù)需要提供代理應(yīng)用程序并且建立了網(wǎng)絡(luò)瓶頸;并且將包過濾技術(shù)和多種應(yīng)用技術(shù)融合到一起,構(gòu)成復(fù)合型防火墻是目前國(guó)內(nèi)防火墻產(chǎn)品的一個(gè)特點(diǎn),也是防火墻今后發(fā)展的主流技術(shù)。
鑒于在防火墻中整合數(shù)據(jù)包檢測(cè)功能是一種良好的解決方法,它可以彌補(bǔ)現(xiàn)有防火墻的缺點(diǎn)并且具有像入侵檢測(cè)系統(tǒng)一樣的檢測(cè)功能,本文將介紹基于Linux netfilter/iptables架構(gòu)實(shí)現(xiàn)機(jī)制和擴(kuò)展技術(shù),在此基礎(chǔ)上提出了擴(kuò)展匹配選項(xiàng)實(shí)現(xiàn)防火墻的入侵檢測(cè)功能,擴(kuò)充后的防火墻可以像Snort一樣具有入侵檢測(cè)功能,并且可將Snort規(guī)則轉(zhuǎn)化為防火墻規(guī)則實(shí)現(xiàn)規(guī)則集的擴(kuò)充。
1 Linux防火墻的擴(kuò)展netfilter/iptables的技術(shù)
Linux中防火墻Netfilter/Iptables系統(tǒng)主要包括兩個(gè)基本組件 :定義在內(nèi)核空間中的通用框架Net filter和數(shù)據(jù)包選擇系統(tǒng)(Packet Selection).其中后者又由兩部分構(gòu)成:在Net filter框架上定義的數(shù)據(jù)結(jié)構(gòu)“IP表”(IP Tables)和在用戶空間實(shí)現(xiàn)的應(yīng)用程序iptables.具體防火墻工作流程見[1][2]。
由于Net filter架構(gòu)的加入,可以通過簡(jiǎn)單的內(nèi)核模塊化來實(shí)現(xiàn)新功能的擴(kuò)展,在現(xiàn)有的Netfilter/Iptables中可以通過兩種方式對(duì)現(xiàn)有的防火墻進(jìn)行擴(kuò)充,一種是擴(kuò)展Net filter通過編寫相關(guān)內(nèi)核模塊調(diào)用nf_register_hook()直接在相關(guān)的鉤子上注冊(cè)從而獲得新特性,一種是擴(kuò)展IP表通過編寫相關(guān)的匹配標(biāo)準(zhǔn)和目標(biāo)來實(shí)現(xiàn)新特性;擴(kuò)展IP表方式是對(duì)現(xiàn)有表的匹配規(guī)則的擴(kuò)充與具體表無(wú)關(guān)。擴(kuò)展IP表需要編寫內(nèi)核和用戶兩方的代碼,內(nèi)核模塊提供了實(shí)際的數(shù)據(jù)包匹配規(guī)則代碼,用戶方代碼提供了IPTABLE 新的命令行選項(xiàng)的共享庫(kù)。
2 Linux防火墻入侵檢測(cè)擴(kuò)展匹配設(shè)計(jì)
目前入侵檢測(cè)系統(tǒng)普遍采用精確的模式匹配算法,如Snort采用基于規(guī)則的方式對(duì)數(shù)據(jù)包進(jìn)行規(guī)則匹配來檢測(cè)多種不同的入侵行為和探測(cè)活動(dòng),這種方式簡(jiǎn)單而有效,因此可以借鑒這種思想在防火墻的匹配選項(xiàng)中加入匹配選項(xiàng)來檢測(cè)數(shù)據(jù)包中的內(nèi)容,由于擴(kuò)展IP表具有很好地靈活性,為此可以選用這種方式擴(kuò)充匹配標(biāo)準(zhǔn)來實(shí)現(xiàn)入侵檢測(cè)模塊。
這種方式需要編寫內(nèi)核和用戶空間代碼,Netfilter/Iptables的標(biāo)準(zhǔn)化提供了兩方使用的重要數(shù)據(jù)結(jié)構(gòu),在實(shí)現(xiàn)這兩部分代碼時(shí)主要是填充相應(yīng)的數(shù)據(jù)結(jié)構(gòu)內(nèi)容然后將它們注冊(cè)從而擴(kuò)展功能。
2.1 內(nèi)核模塊數(shù)據(jù)結(jié)構(gòu)
新的MATCH功能可作為一個(gè)獨(dú)立的模塊,為了能使新模塊能被別的模塊使用,可以使用iptable提供的ipt-register-match()將該模塊進(jìn)行注冊(cè),新的MATCH模塊的核心是ipt-match結(jié)構(gòu),它將作為ipt-register-match()的參數(shù)注冊(cè)到MATCH鏈表中備用從而增加新的規(guī)則匹配選項(xiàng)。
Struct ipt_match
{struct list_head list;一般設(shè)定為{NULL,NULL},由核心使用
const char name[];MTACH功能的名稱,該名稱必須與模塊名相匹配
int (*match)();一個(gè)指向MTACH功能函數(shù)的指針,返回非0表示匹配
int (*check entry)();一個(gè)指向檢查規(guī)則規(guī)范的指針,如果返回0,規(guī)則不會(huì)加入iptables
void (*destroy)(); 當(dāng)一個(gè)使用該MATCH的入口被刪除時(shí),該函數(shù)調(diào)用以釋放所占資源
struct module me 是否是模塊的定義,是模塊設(shè)置為THIS_MODULE 否則NULL}
在該數(shù)據(jù)結(jié)構(gòu)中重要的是match ,check entry 函數(shù),MATCH函數(shù)將實(shí)現(xiàn)接收從底層傳來的數(shù)據(jù)包,檢查數(shù)據(jù)包實(shí)現(xiàn)匹配功能,如果數(shù)據(jù)包與所定義的規(guī)則相同那么返回TRUE,如果不成功返回FALSE并且可以設(shè)置參數(shù)表示數(shù)據(jù)包可以被立即被丟棄。Check entry函數(shù)指向一個(gè)檢查規(guī)則規(guī)范的指針,如果返回0表明這條規(guī)則不能從用戶空間接受。
2.2用戶空間數(shù)據(jù)結(jié)構(gòu)
在內(nèi)核中加入相關(guān)的內(nèi)核模塊選項(xiàng)后,為了在用戶空間使用iptables軟件提供相關(guān)的規(guī)則必須為該軟件提供相關(guān)的命令行選項(xiàng),為了使各個(gè)擴(kuò)展模塊使用一個(gè)版本的iptables軟件而不必編寫相關(guān)擴(kuò)展的特定軟件版本,采用共享庫(kù)可以解決該問題,共享庫(kù)應(yīng)該具有-init()功能,它的功能和內(nèi)核模塊功能相似,在裝載時(shí)被自動(dòng)調(diào)用,該功能根據(jù)添加的新MATCH和新TARGET不同分別調(diào)用register-match()或register-target(),共享庫(kù)可以提供初始化數(shù)據(jù)結(jié)構(gòu)和提供相關(guān)選項(xiàng)的功能。
編寫共享庫(kù)中使用的重要數(shù)據(jù)結(jié)構(gòu)是iptables_match,它作為參數(shù)傳遞給register-match()注冊(cè)相關(guān)的命令行匹配選項(xiàng)讓iptables識(shí)別該新匹配。
Struct iptables_match
{struct iptables_match *next;用于形成一個(gè)MATCH列表的指針,初始化為NULL
ipt_chainlabel name; MATCH功能的名字,
必須與庫(kù)函數(shù)名相同便于主程序根據(jù)MATCH名加載相應(yīng)的動(dòng)態(tài)連接庫(kù)
const char *version;版本信息通常被設(shè)置IPTABLES_version宏
size_t size;該MATCH的數(shù)據(jù)大小
size_t userspacesize;由于內(nèi)核可能修改某些域,
在這里填寫被改變數(shù)據(jù)區(qū)大小,它一般和size大小同
void (*help)(void);打印幫助選項(xiàng)大綱
void (*init)();初始化ipt-entry-match結(jié)構(gòu)
int (*parse)();掃描并接收本MATCH的命令行參數(shù),正確接受返回非0
void (*final_check)();檢查是否強(qiáng)制選項(xiàng)(如--ids)被描述,如果不正確退出
void (*print)();查詢當(dāng)前表中的規(guī)則時(shí),顯示使用了當(dāng)前match規(guī)則的額外信息
void (*save)();PARSE的反轉(zhuǎn),被iptable-save調(diào)用再生match的命令行參數(shù)
const struct option *extra_opts;NULL結(jié)尾的參數(shù)列表,提供命令行其余選項(xiàng)
/*以下參數(shù)由iptables內(nèi)部使用,用戶不必填寫*/
Unsigned int option_offset;
Struct ipt_entry_match *m;
Unsigned int mflags;
Unsigned int used;
}
2.3 入侵檢測(cè)模塊的實(shí)現(xiàn)
本文介紹的功能擴(kuò)展主要是通過IPTABLE命令向防火墻“IP表”添加字符串匹配規(guī)則和數(shù)據(jù)包內(nèi)容相匹配從而實(shí)現(xiàn)對(duì)數(shù)據(jù)包的檢測(cè),在內(nèi)核中需要添加一個(gè)ids檢測(cè)匹配模塊,在用戶空間命令行上需要提供一個(gè) “iptables -m ids –ids “匹配內(nèi)容””的選項(xiàng)。
在內(nèi)核模塊中主要是實(shí)現(xiàn)MATCH指針函數(shù),在該函數(shù)中使用了字符串的模式匹配算法用于檢測(cè)數(shù)據(jù)包的內(nèi)容。模式匹配是指在文本Text= tlt2t3...tn中檢索子串Pat=P1 P2...pn(模式)的所有出現(xiàn),著名的匹配算法有BF算法、KMP算法、BM算法及一些改進(jìn)算法,基于BM算法的BMH算法 被證明是一種快速、高效的算法,于是在設(shè)計(jì)時(shí)采用該算法。
BMH算法于1980年Horspool提出的,該算法在匹配的過程中模式從左向右進(jìn)行,但字符的比較從右向左進(jìn)行,在發(fā)現(xiàn)不匹配時(shí),算法根據(jù)預(yù)先計(jì)算好的skip數(shù)組將模式右移,BMH算法在最壞的情況下復(fù)雜度為O(NM),在一般情況下比BM有更好的性能,它只使用一個(gè)數(shù)組,簡(jiǎn)化了初始化過程.以下是在match函數(shù)中使用的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數(shù)組
for (i = 0; pattern [i]; i++) skip[pattern [i]] = k - i; //對(duì)skip數(shù)組進(jìn)行修正
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;
}
檢測(cè)功能主要由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)函數(shù)實(shí)現(xiàn),該函數(shù)從緩沖區(qū)skb讀取網(wǎng)絡(luò)數(shù)據(jù)包,使用match info接受來自用戶空間的匹配內(nèi)容,從skb中計(jì)算出數(shù)據(jù)包的大小tlen,從match info中獲取匹配內(nèi)容的大小mlen,如果數(shù)據(jù)包內(nèi)容為空或mlen>tlen則返回0不能進(jìn)行比較;否則將網(wǎng)絡(luò)數(shù)據(jù)包內(nèi)容和大小tlen、match info中數(shù)據(jù)及大小mlen作為參數(shù)調(diào)用ids_match進(jìn)行匹配,然后返回匹配結(jié)果。
填充用戶空間的數(shù)據(jù)結(jié)構(gòu)時(shí),要保證name與核心對(duì)應(yīng)的Match名相同,并且為了提供命令行附加選項(xiàng)需要填充extra_opts數(shù)據(jù)結(jié)構(gòu)為{"ids",1,0,'1'},它表示ids帶參數(shù)值,如果出現(xiàn)“—ids “匹配值””就會(huì)返回’1’用于parse()的參數(shù)來對(duì)附加信息進(jìn)行處理如檢查附加選項(xiàng)中是否有非(?。┨?hào)存在,從命令行解析得到匹配內(nèi)容并將其填充到傳入到內(nèi)核模塊的數(shù)據(jù)結(jié)構(gòu)中。
2.4 IPTABLE補(bǔ)丁的機(jī)制
在將用戶空間和內(nèi)核空間代碼編寫完成后,可以直接修改源碼并編譯安裝,為了標(biāo)準(zhǔn)化和方便,NETFILTER/IPTABLES提供了擴(kuò)展內(nèi)核和用戶空間的補(bǔ)丁程序:用于內(nèi)核補(bǔ)丁的patch-o-iptables和在iptables源碼下的extensions目錄用于iptables程序本身補(bǔ)丁。
在patch-o-iptables中提供了一個(gè)“runme”腳本來為核心打補(bǔ)丁,按功能需要的文件有五部分 :主程序文件、內(nèi)核配置文件補(bǔ)丁、內(nèi)核配置文件幫助補(bǔ)丁、runme腳本顯示幫助信息、內(nèi)核make file文件補(bǔ)丁。iptables本身的擴(kuò)展稍微簡(jiǎn)單一些,那就是在extensions目錄下增加一個(gè)libipt_ids.c的文件,然后在本子目錄的Make file的PF_EXT_SLIB宏中附加一個(gè)ids字符串。
通過補(bǔ)丁或?qū)⒋a添加進(jìn)內(nèi)核后需重新編譯內(nèi)核添加相應(yīng)的功能模塊,在用戶空間也必須重新編譯iptables以便提供新的功能選項(xiàng)。
2.5 Snort規(guī)則轉(zhuǎn)為IPTABLES規(guī)則
添加好字符匹配模塊后,就可以通過IPTABLES定義相應(yīng)的字符匹配規(guī)則從而實(shí)現(xiàn)入侵檢測(cè)功能,如有些蠕蟲病毒的請(qǐng)求中包含了cmd.exe,可以編寫如下的規(guī)則來對(duì)這樣的請(qǐng)求進(jìn)行丟棄:iptables -I INPUT -j DROP -p tcp -s 0.0.0.0/0 -m ids --ids "cmd.exe" 。
這種運(yùn)行方式和SNORT的檢測(cè)方式相似,并且SNORT 的規(guī)則及更新速度快可以將它的相關(guān)規(guī)則集轉(zhuǎn)化為在防火墻中可以使用的規(guī)則集。以下是將Snort中用于檢測(cè)掃描器的規(guī)則轉(zhuǎn)換為防火墻規(guī)則的實(shí)例:
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 結(jié)束語(yǔ)
通過實(shí)驗(yàn)該防火墻可以對(duì)常見的蠕蟲、探測(cè)掃描、病毒等SNORT規(guī)則集能匹配的大多數(shù)攻擊有良好的抵御作用。由于Netfilter/iptables具有很好的靈活性,在該框架上可以方便地對(duì)防火墻進(jìn)行功能擴(kuò)充。本文通過擴(kuò)展匹配選項(xiàng)實(shí)現(xiàn)入侵檢測(cè)的功能,彌補(bǔ)了傳統(tǒng)的兩種類型防火墻不足,由于檢測(cè)功能在內(nèi)核中保證了檢測(cè)的響應(yīng)速度,通過將現(xiàn)有的大量Snort規(guī)則轉(zhuǎn)化為相應(yīng)的防火墻規(guī)則可以迅速更新規(guī)則庫(kù)及時(shí)檢測(cè)攻擊,同時(shí)通過該方式也可以按照自身需要擴(kuò)展防火墻功能,設(shè)計(jì)出廉價(jià)、安全、實(shí)用、易定制的防火墻。