Linux防火墻擴展技術與入侵檢測完成
發表時間:2023-05-24 來源:明輝站整理相關軟件相關文章人氣:
[摘要]按照防火墻對內外來往的數據的處理方法, 防火墻可以分為包過濾防火墻和應用層防火墻, 包過濾防火墻工作在網絡層, 它只是檢測包的協議頭對數據包進行裁決, 它運行速度快但無法對高層的協議內容進行檢查, ...
按照防火墻對內外來往的數據的處理方法, 防火墻可以分為包過濾防火墻和應用層防火墻, 包過濾防火墻工作在網絡層, 它只是檢測包的協議頭對數據包進行裁決, 它運行速度快但無法對高層的協議內容進行檢查, 應用層防火墻則可以對高層數據進行轉發和過濾并強制身份驗證, 但對不同的服務需要提供代理應用程序并且建立了網絡瓶頸;并且將包過濾技術和多種應用技術融合到一起, 構成復合型防火墻是目前國內防火墻產品的一個特點, 也是防火墻今后發展的主流技術。
鑒于在防火墻中整合數據包檢測功能是一種良好的解決方法, 它可以彌補現有防火墻的缺點并且具有像入侵檢測系統一樣的檢測功能, 本文將介紹基于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規則轉化為相應的防火墻規則可以迅速更新規則庫及時檢測攻擊, 同時通過該方式也可以按照自身需要擴展防火墻功能, 設計出廉價、安全、實用、易定制的防火墻
上面是電腦上網安全的一些基礎常識,學習了安全知識,幾乎可以讓你免費電腦中毒的煩擾。