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