snort 是一個基於libpcap的數據包嗅探器並可以作爲一個輕量級的網絡***檢測系統( NIDS)。所謂的輕量級是指在檢測時儘可能低地影響網絡的正常操作,一個優秀的輕量級的NIDS應該具備跨系統平臺操作,對系統影響最小等特徵並且管理員能夠在短時間內通過修改配置進行實時的安全響應,更爲重要的是能夠成爲整體安全結構的重要成員。
IDS:
IDS是英文“Intrusion Detection Systems”的縮寫,中文意思是“***檢測系統”。專業上講就是依照一定的安全策略,通過軟、硬件,對網絡、系統的運行狀況進行監視,儘可能發現各種***企圖、***行爲或者***結果,以保證網絡系統資源的機密性、完整性和可用性。做一個形象的比喻:假如防火牆是一幢大樓的門鎖,那麼IDS就是這幢大樓裏的監視系統。一旦小偷爬窗進入大樓,或內部人員有越界行爲,只有實時監視系統才能發現情況併發出警告。
HIDS :基於主機的***檢測系統。在需要監測的服務器上安裝相應的軟件。
缺點:需要多個軟件,價格總體較高
優點:應用層監控。控制力度高,可以基於內容進行監測
NIDS: 基於網絡的***檢測系統。硬件設備,連接在hub或交換機上(端口鏡像)
缺點:3層或4層過濾。控制力度低,只能基於協議、ip端口號進行過濾
優點:整個網絡中需要的數量較少,總成本低
IPS:跟高級的ids
***預防系統(IPS: Intrusion Prevention System)是電腦網絡安全設施,是對防病毒軟件(Antivirus Programs)和防火牆(Packet Filter, Application Gateway)的補充。 ***預防系統(Intrusion-prevention system)是一部能夠監視網絡或網絡設備的網絡資料傳輸行爲的計算機網絡安全設備,能夠即時的中斷、調整或隔離一些不正常或是具有傷害性的網絡資料傳輸行爲。
***檢測系統工作原理:
一、信息收集
收集流量的內容、用戶連接的狀態和行爲
二、信息分析
通過模式匹配、統計分析和完整性分析三種手段進行分析
模式匹配:類似於查病毒,查看內容是否符合***的條件。最精確
統計分析:針對某個對象的行爲進行記錄,若行爲發生變化,就認爲***。誤報率高
完整性分析:針對文件,防止文件被篡改
一般在網絡中是將HIDS與NIDS向互結合來使用。重要的服務器上安裝HIDS用來保護該臺服務器,然後在網絡中再安裝一臺NIDS,進行互補
Snort作爲其典型範例,首先可以運行在 多種操作系統平臺,例如UNIX系列和Windows 9X.(需要libpcap for Win32的支持),與很多商業產品相比,它對操作系統的依賴性比較低。其次用戶可以根據自己的需要及時在短時間內調整檢測策略。就檢測***的種類來說,據最新數據表明(2000/12/4)snort共有21類(???)1271條檢測規則,其中包括對緩衝區溢出,端口掃描和CGI***等等。SNORT 集成了多種告警機制來提供實時告警功能,包括:syslog、用戶指定文件、UNIXSocket、通過SMBClient使用WinPopup對 Windows客戶端告警。 Snort的現實意義維作爲開源軟件填補了只有商業***檢測系統的空白,可以幫助中小網絡的系統管理員有效地監視網絡流量和檢測***行爲。
snort有三種工作模式:
嗅探器
數據包記錄器
網絡***檢測系統
嗅探器模式僅僅是從網絡上讀取數據包並作爲連續不斷的流顯示在終端上。
數據包記錄器模式把數據包記錄到硬盤上。
網路***檢測模式是最複雜的,而且是可配置的。我們可以讓snort分析網絡數據流以匹配用戶定義的一些規則,並根據檢測結果採取一定的動作
所謂的嗅探器模式就是snort從網絡上讀出數據包然後顯示在你的控制檯上。首先,我們從最基本的用法入手。如果你只要把TCP/IP包頭信息打印在屏幕上,只需要輸入下面的命令:
./snort -v
使用這個命令將使snort只輸出IP和TCP/UDP/ICMP的包頭信息。如果你要看到應用層的數據,可以使用:
./snort -vd
這條命令使snort在輸出包頭信息的同時顯示包的數據信息。如果你還要顯示數據鏈路層的信息,就使用下面的命令:
./snort -vde
注意這些選項開關還可以分開寫或者任意結合在一塊。例如:下面的命令就和上面最後的一條命令等價:
./snort -d -v –e
數據包記錄器:
如果要把所有的包記錄到硬盤上,你需要指定一個日誌目錄,snort就會自動記錄數據包:
./snort -dev -l ./log
當然,./log目錄必須存在,否則snort就會報告錯誤信息並退出。當snort在這種模式下運行,它會記錄所有看到的包將其放到一個目錄中,這個目錄以數據包目的主機的IP地址命名,例如:192.168.10.1
如果你只指定了-l命令開關,而沒有設置目錄名,snort有時會使用遠程主機的IP地址作爲目錄,有時會使用本地主機IP地址作爲目錄名。爲了只對本地網絡進行日誌,你需要給出本地網絡:
./snort -dev -l ./log -h 192.168.1.0/24
這個命令告訴snort把進入C類網絡192.168.1的所有包的數據鏈路、TCP/IP以及應用層的數據記錄到目錄./log中。
如果你的網絡速度很快,或者你想使日誌更加緊湊以便以後的分析,那麼應該使用二進制的日誌文件格式。所謂的二進制日誌文件格式就是tcpdump程序使用的格式。使用下面的命令可以把所有的包記錄到一個單一的二進制文件中:
./snort -l ./log -b
***檢測系統:
snort最重要的用途還是作爲網絡***檢測系統(NIDS),使用下面命令行可以啓動這種模式:
./snort -dev -l ./log -h 192.168.1.0/24 -c snort.conf
snort.conf是規則集文件。snort會對每個包和規則集進行匹配,發現這樣的包就採取相應的行動。如果你不指定輸出目錄,snort就輸出到/var/log/snort目錄。
注意:如果你想長期使用snort作爲自己的***檢測系統,最好不要使用-v選項。因爲使用這個選項,使snort向屏幕上輸出一些信息,會大大降低snort的處理速度,從而在向顯示器輸出的過程中丟棄一些包。
此外,在絕大多數情況下,也沒有必要記錄數據鏈路層的包頭,所以-e選項也可以不用:
./snort -d -h 192.168.1.0/24 -l ./log -c snort.conf
這是使用snort作爲網絡***檢測系統最基本的形式,日誌符合規則的包,以ASCII形式保存在有層次的目錄結構中。
編寫snort 規則
snort使用一種簡單的,輕量級的規則描述語言,這種語言靈活而強大。在開發snort規則時要記住幾個簡單的原則。
第一,大多數snort規則都寫在一個單行上,或者在多行之間的行尾用/分隔。Snort規則被分成兩個邏輯部分:規則頭和規則選項。規則頭包含規則的動作,協議,源和目標ip地址與網絡掩碼,以及源和目標端口信息;規則選項部分包含報警消息內容和要檢查的包的具體部分。
下面是一個規則範例:
alert tcp any any -> 192.168.1.0/24 111 (content:"|00 01 86 a5|"; msg: "mountd access";)
規則動作 協議 源ip 地址 源端口號 -> 目標ip地址 目標端口號 (規則選項)
第一個括號前的部分是規則頭(rule header),包含的括號內的部分是規則選項(rule options)。規則選項部分中冒號前的單詞稱爲選項關鍵字(option keywords)。注意,不是所有規則都必須包含規則選項部分,選項部分只是爲了使對要收集或報警,或丟棄的包的定義更加嚴格。組成一個規則的所有元素對於指定的要採取的行動都必須是真的。當多個元素放在一起時,可以認爲它們組成了一個邏輯與(AND)語句。同時,snort規則庫文件中的不同規則可以認爲組成了一個大的邏輯或(OR)語句。
規則動作:
規則的頭包含了定義一個包的who,where和what信息,以及當滿足規則定義的所有屬性的包出現時要採取的行動。規則的第一項是"規則動作"(rule action),"規則動作"告訴snort在發現匹配規則的包時要幹什麼。在snort中有五種動作:alert、log、pass、activate和dynamic.
1、Alert-使用選擇的報警方法生成一個警報,然後記錄(log)這個包。
2、Log-記錄這個包。
3、Pass-丟棄(忽略)這個包。
4、activate-報警並且激活另一條dynamic規則。
5、dynamic-保持空閒直到被一條activate規則激活,被激活後就作爲一條log規則執行。
你可以定義你自己的規則類型並且附加一條或者更多的輸出模塊給它,然後你就可以使用這些規則類型作爲snort規則的一個動作。
協議
規則的下一部分是協議。Snort當前分析可疑包的ip協議有四種:tcp 、udp、icmp和ip。將來可能會更多,例如ARP、IGRP、GRE、OSPF、RIP、IPX等。
Ip地址
規則頭的下一個部分處理一個給定規則的ip地址和端口號信息。關鍵字"any"可以被用來定義任何地址。Snort沒有提供根據ip地址查詢域名的機制。地址就是由直接的數字型ip地址和一個cidr塊組成的。Cidr塊指示作用在規則地址和需要檢查的進入的任何包的網絡掩碼。/24表示c類網絡, /16表示b類網絡,/32表示一個特定的機器的地址。例如,192.168.1.0/24代表從192.168.1.1到192.168.1.255的地址塊。在這個地址範圍的任何地址都匹配使用這個192.168.1.0/24標誌的規則。這種記法給我們提供了一個很好的方法來表示一個很大的地址空間。
有一個操作符可以應用在ip地址上,它是否定運算符(negation operator)。這個操作符告訴snort匹配除了列出的ip地址以外的所有ip地址。否定操作符用"!"表示。下面這條規則對任何來自本地網絡以外的流都進行報警。
alert tcp !192.168.1.0/24 any -> 192.168.1.0/24 111 (content: "|00 01 86 a5|"; msg: "external mountd access";)
這個規則的ip地址代表"任何源ip地址不是來自內部網絡而目標地址是內部網絡的tcp包"。
你也可以指定ip地址列表,一個ip地址列表由逗號分割的ip地址和CIDR塊組成,並且要放在方括號內“[”,“]”。此時,ip列表可以不包含空格在ip地址之間。下面是一個包含ip地址列表的規則的例子。
alert tcp ![192.168.1.0/24,10.1.1.0/24] any -> [192.168.1.0/24,10.1.1.0/24] 111 (content: "|00 01 86 a5|"; msg: "external mountd access";)
端口號
端口號可以用幾種方法表示,包括"any"端口、靜態端口定義、範圍、以及通過否定操作符。"any"端口是一個通配符,表示任何端口。靜態端口定義表示一個單個端口號,例如111表示portmapper,23表示telnet,80表示http等等。端口範圍用範圍操作符":"表示。範圍操作符可以有數種使用方法,如下所示:
log udp any any -> 192.168.1.0/24 1:1024
記錄來自任何端口的,目標端口範圍在1到1024的udp流
log tcp any any -> 192.168.1.0/24 :6000
記錄來自任何端口,目標端口小於等於6000的tcp流
log tcp any :1024 -> 192.168.1.0/24 500:
記錄來自任何小於等於1024的特權端口,目標端口大於等於500的tcp流
端口否定操作符用"!"表示。它可以用於任何規則類型(除了any,這表示沒有,呵呵)。例如,由於某個古怪的原因你需要記錄除x windows端口以外的所有一切,你可以使用類似下面的規則:
log tcp any any -> 192.168.1.0/24 !6000:6010
方向操作符
方向操作符"->"表示規則所施加的流的方向。方向操作符左邊的ip地址和端口號被認爲是流來自的源主機,方向操作符右邊的ip地址和端口信息是目標主機,還有一個雙向操作符"<>"。它告訴snort把地址/端口號對既作爲源,又作爲目標來考慮。這對於記錄/分析雙向對話很方便,例如telnet或者pop3會話。用來記錄一個telnet會話的兩側的流的範例如下:
log !192.168.1.0/24 any <> 192.168.1.0/24 23
Activate 和 dynamic 規則:
注:Activate 和 dynamic 規則將被tagging 所代替。在snort的將來版本,Activate 和 dynamic 規則將完全被功能增強的tagging所代替。
Activate 和 dynamic 規則對給了snort更強大的能力。你現在可以用一條規則來激活另一條規則,當這條規則適用於一些數據包時。在一些情況下這是非常有用的,例如你想設置一條規則:當一條規則結束後來完成記錄。Activate規則除了包含一個選擇域:activates外就和一條alert規則一樣。Dynamic規則除了包含一個不同的選擇域:activated_by 外就和log規則一樣,dynamic規則還包含一個count域。
Actevate規則除了類似一條alert規則外,當一個特定的網絡事件發生時還能告訴snort加載一條規則。Dynamic規則和log規則類似,但它是當一個activate規則發生後被動態加載的。把他們放在一起如下圖所示:
activate tcp !$HOME_NET any -> $HOME_NET 143 (flags: PA; content: "|E8C0FFFFFF|/bin"; activates: 1; msg: "IMAP buffer overflow!";)
dynamic tcp !$HOME_NET any -> $HOME_NET 143 (activated_by: 1; count: 50;)
需要的軟包如下:
adodb514.zip 數據庫優化
base-1.4.5.tar.gz ***檢測的顯示頁面
snort-2.8.0.1-1.RH5.i386.rpm snort主程序
snort-mysql-2.8.0.1-1.RH5.i386.rpm 將數據放到mysql數據庫中,用於監測
snortrules-snapshot-2.8.tar.gz ***規則庫
安裝snort主程序
[root@localhost ~]# rpm -ivh snort-2.8.0.1-1.RH5.i386.rpm
配置文件,include 包含的文件.rules 都爲規則文件。
[root@localhost ~]# vim /etc/snort/snort.conf
include $RULE_PATH/local.rules
916 include $RULE_PATH/bad-traffic.rules
917 include $RULE_PATH/exploit.rules
918 include $RULE_PATH/scan.rules
919 include $RULE_PATH/finger.rules
920 include $RULE_PATH/ftp.rules
921 include $RULE_PATH/telnet.rules
922 include $RULE_PATH/rpc.rules
923 include $RULE_PATH/rservices.rules
# yum install php php-gd php-mysql php-pear mysql-server httpd libpcap
php-gd :繪圖軟件
php-pear:數據存儲
libpcap:抓包
啓動httpd mysqld ,設置爲開機自啓動,併爲mysql設置管理密碼
[root@localhost ~]# service httpd start
[root@localhost ~]# service mysqld start
[root@localhost ~]# chkconfig --level 2345 httpd on
[root@localhost ~]# chkconfig --level 2345 mysqld on
[root@localhost ~]# mysqladmin -u root -p password '123'
創建數據庫snort
[root@localhost ~]# mysql -u root -p
mysql> create database snort;
將模版表格導入數據庫
mysql> use snort
Database changed
mysql> source /usr/share/snort-2.8.0.1/schemas/create_mysql
/etc/snort/rules 用來存放規則文件,但是默認爲空,此時只能使用snort的嗅探器和數據包記錄器,不能使用***檢測系統模式
snortrules-snapshot-2.8.tar.gz 爲規則文件,將其解壓到/etc/snort下即可,他將自動進入了rule目錄
[root@localhost ~]# tar -zxvf snortrules-snapshot-2.8.tar.gz -C /etc/snort/
此時rules下將有很多規則文件
base文件爲顯示***的一個頁面,可以做成物理目錄
將base壓縮包解壓到物理目錄下
[root@localhost ~]# tar -zxvf base-1.4.5.tar.gz -C /var/www/html/
[root@localhost html]# mv base-1.4.5/ base
爲base目錄添加other 用戶的w權限
[root@localhost ~]# chmod o+w /var/www/html/base/
修改base內的符號鏈接
[root@localhost ~]# ln -s /etc/snort/doc/signatures/ /var/www/html/base/signatures
adodb514.zip 包爲數據庫優化包
[root@localhost ~]# unzip adodb514.zip
[root@localhost ~]# mv adodb5 /var/www/html/adodb
升級軟件pear(需要網絡的聯通)
#pear install --force PEAR-1.8.1]
更新該軟件
#pear upgrade pear
安裝pear的插件
pear install Image_Graph-alpha Image_Canvas-alpha Image_Color Number_Roman Mail_Mime Mail
[root@localhost base]# cd /var/www/html/base/
[root@localhost base]# cp world_map6.png world_map6.txt /usr/share/pear/Image/Graph/Images/Maps
此時可以訪問網頁
http://192.168.101.199/base/,提示php的日誌級別太高,可以修改php.ini文件的 'error_reporting' 爲 'E_ALL & ~E_NOTICE'
[root@localhost ~]# vim /etc/php.ini
禁用第360行 error_reporting = E_ALL,開啓第348行 error_reporting = E_ALL & ~E_NOTICE
重新啓動httpd訪問
[root@localhost ~]# service httpd restart
選擇 安裝語言,並指明adodb的位置
輸入管理員用戶名和密碼
安裝完成後,出現監測頁面,如果此時ping該主機,數據將不會出現任何變化
這是因爲base是從mysql數據庫中讀取的數據,但是snort並沒有將截獲的數據寫入mysql數據庫。修改snort的配置文件,指明將數據存放到哪個數據庫。
[root@localhost ~]# vim /etc/snort/snort.conf
在793行處指明將數據輸出選項
修改用戶名、密碼、dbname等數據
793 output database: log, mysql, user=root password=123 dbname=snort host=localhost
按照snort.conf中的***規則來檢測數據。並將數據存放到數據庫中
[root@localhost ~]# snort -dev -c /etc/snort/snort.conf
出現錯誤,這個snort的版本沒有編譯包含mysql的支持
此時需要snort和mysql的連接器件snort-mysql
[root@localhost ~]# rpm -ivh snort-mysql-2.8.0.1-1.RH5.i386.rpm
然後再次收集數據到數據庫,base將會讀取到很多數據。由於snort要將實時數據保存到數據庫以便基本安全分析引擎(base)讀取到數據庫中的數據,所以snort -dev -c /etc/snort/snort.conf 要一直運行着
[root@localhost ~]# snort -dev -c /etc/snort/snort.conf