程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP綜合 >> 使用Snort和PHP構建一個小型網絡防御系統

使用Snort和PHP構建一個小型網絡防御系統

編輯:PHP綜合

本文在Linux環境下,利用Snort和Iptables 構建了一個小型網絡防御系統,由PHP頁面提供了一個遠程管理工具,並給出關鍵程序的實現和說明。

引言

Snort 是目前十分流行的輕型入侵檢測系統。但是目前人們對Snort檢測結果的處理大都停留在記錄日志或簡單通知網絡管理員,由管理員進行審計再決定網絡防御策略的階段。Snort的檢測結果並沒有及時地用來抵御網絡入侵。本文通過為Snort的報警輸出模塊提供一個服務監聽程序的辦法,及時獲取Snort的報警信息並對其進行解析,根據解析結果向iptables添加相應的防火牆規則,達到實時阻止網絡攻擊的目的。服務程序同時監聽來自PHP的管理請求,並進行相應的操作。由於服務程序獨立於Snort而運行,故不會影響到Snort的運行效率。管理員可以通過PHP頁面對服務程序阻塞的主機進行監控和管理,如查看當前阻塞的主機IP地址、事件發生時間、阻塞時間、阻塞原因,修改阻塞時間等。

總體思想

Snort的輸出plugin為我們提供了豐富的報警輸出方式:輸出到文件,syslog,數據庫,Unix域Socket等。其中當Snort的報警輸出到Unix域Socket時,輸出模塊相當於一個報警的客戶端,Snort的用戶可以通過編寫服務器端代碼,獲取Snort的報警輸出消息,並根據這些消息采取相應的對策。本文基於這種思想,並利用Linux下自帶的防火牆Iptables,構建了一個網絡防御系統,系統總體結構如下:

服務處理程序是該系統的核心部分,包括報警輸出處理子程序(AO_Handler)和PHP請求處理子程序(Web_Handler)兩個部分。報警輸出處理子程序主要負責接收Snort報警,解析報警信息,並通過向iptables加規則的方式對攻擊主機進行阻塞;而PHP請求處理子程序主要負責與PHP管理頁面通信,並根據頁面的請求做出相應的處理。

服務程序中維護了一個規則相關信息表,這個表以隊列(報警隊列和阻塞隊列)的數據結構進行組織,其中報警隊列中記錄的是經Snort報警輸出解析得到的攻擊主機信息(即報警結點,由AO_Handler生成), 而阻塞隊列中記錄了正在被阻塞的攻擊主機信息(即阻塞結點)。如果報警結點不在阻塞隊列中,程序將對這個結點所代表的主機進行阻塞操作,並把該結點加入到阻塞隊列中。對每個阻塞操作所對應的阻塞結點設定一個有效期,當阻塞時間超過這個有效期時,程序將該阻塞結點從阻塞隊列中刪除,並刪除iptables中對應的阻塞規則,對該阻塞主機放行。采用兩個列隊來維護報警和阻塞信息可以防止程序在多次收到有關同一個主機地址的報警時,添加重復的阻塞規則而為規則管理和取消阻塞操作時所帶來的混亂。另外阻塞信息的維護使得程序可以為終端用戶提供當前被系統自動阻塞的主機的所有信息:報警時間,阻塞時間,阻塞原因等,為用戶了解和管理這些信息提供了接口。

具體實現

服務程序實現方式

服務程序需要同時處理三種事件:監聽Snort報警輸出、維護規則相關信息表(即報警隊列和阻塞隊列)、處理來自PHP頁面的請求。因此,服務程序采用多線程並發模式。由主線程監聽來自Snort的報警數據,解析該數據、創建報警結點並將其加入報警隊列,另外主線程還執行服務程序的初始化工作;由兩個線程來專門維護規則相關信息表,一個線程(AlertHandler)用於檢測報警隊列,當其中有符合要求的報警結點時,將其加入阻塞隊列,執行阻塞操作,另一個(BlockHanlder)用於監測阻塞隊列,將其中到達阻塞有效期的阻塞節點刪除;對於來自PHP頁面的請求,服務程序采用建立一個線程池的辦法,對PHP請求做出相應操作,如:列表阻塞主機,刪除某阻塞主機,修改阻塞有效時間等。

主線程和規則維護線程構成了報警輸出處理子程序, 而PHP請求處理線程構成了PHP請求處理子程序。由於這些線程都涉及到對規則相關信息表的讀寫操作,因此,需要一定的同步機制來保證操作的正確性。本文中的程序采用了建立互斥鎖和條件變量的辦法來達到這個目的。程序主要數據結構默認情況下,Snort的報警套接字以數據報方式向path為/var/log/snort_alert的Unix域套接字發送報警數據,報警數據被封裝在一個Alertpkt的結構體中(在Snort源碼包的Spo_alert_unixsock.h中定義),Alertpkt的定義如下:

typedef struct _Alertpkt
{
u_int8_t alertmsg[ALERTMSG_LENGTH]; /* 報警消息 */
struct pcap_pkthdr pkth;
u_int32_t dlthdr;    /* datalink header offset. (ethernet, etc.. ) */
u_int32_t nethdr;    /* network header offset. (ip etc...) */
u_int32_t transhdr;   /* transport header offset (tcp/udp/icmp ..) */
u_int32_t data;
u_int32_t val; /*指出有效的字段*/
……
Event event; /* 報警事件的相關信息 */
} Alertpkt;

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved