1 Snort簡述
Snort是一個強大的輕量級網絡入侵檢測系統,它能夠檢測到各種不同的攻擊方式,對攻擊進行實時報警。此外,Snort具有很好的擴展性和可移植性,並且這個軟件遵循GPL,這意味着只要遵守GPL的任何組織和個人均可以自由使用這個軟件。
Snort具有實時流量分析和日誌IP網絡數據包的能力,能夠快速地檢測網絡攻擊,及時地發出報警。Snort的報警機制很豐富,例如:Syslog、用戶指定的文件、一個Unix套接字,還有使用samba協議向Windows客戶端發出WinPoup消息。利用XML插件,Snort可以使用SNML把日誌存放到一個文件或者實時報警。
Snort能夠進行協議分析、內容的搜索/匹配。目前Snort能夠分析的協議有TCP、UDP、ICMP,將來可能支持ARP、OSPF、IPX、RIP等協議,它能夠檢測多種方式的攻擊和探測,例如:緩衝區溢出、CGI攻擊、端口暴力破解、SMB探測以及web應用程序的攻擊現在也已經有簡單規則的支持。Snort自帶的檢測攻擊的規則數量有限,但Snort支持用戶自定義規則的加載,這對有能力的大型企業而言是個不錯的IDS選擇。
2 Snort體系架構
-
Snort工作原理與應用場景
Snort是一個基於模式匹配的的網絡入侵檢測系統,實際上目前現在市場上的大多商業入侵檢測系統都是基於模式匹配的,即將惡意行爲和惡意代碼預定成入侵規則特徵庫,然後將實際數據源於規則庫的特徵碼進行匹配,以判斷其中是否包含了入侵行爲。 -
Snort的主體架構
Snort系統總體上是由規則集及Snort可執行程序兩大部分組成。1)Snort規則集
Snort規則集是Snort的攻擊特徵庫,每條規則是一條攻擊標識,Snort通過它來識別攻擊行爲。2)Snort可執行程序
可執行程序由4個重要的子系統構成:
數據包捕獲和解碼子系統、預處理器、檢測引擎、日誌/報警子系統。Snort的總體結構:
序號 模塊名稱 源文件名稱 備註 1 主控模塊 Snort.c Plugbase.c… 主控模塊,完成插件的管理和服務功能 2 解碼模塊 Decode.c… 完成報文解碼功能,把網絡數據包解碼成snort定義的Packet結構,用於後續分析 3 規則處理模塊 Rules.c Parser.c… 完成所有與規則相關的功能 4 預處理插件模塊 Spp_defrag.c… 模擬tcp、ip堆棧功能的插件、各種解碼插件 5 處理插件模塊 Sp_IP_fragbits.c… 輔助完成基於規則的匹配過程 6 輸出插件模塊 Spo_alert_fast.c… 系統日誌和告警日誌的輸出處理 7 日誌模塊 Logs.c… 完成所有與日誌記錄有關的功能 8 輔助模塊 Ubi_Bintree.c… 輔助功能 -
Snort的插件機制
1)預處理插件
預處理插件在規則匹配之前運行,完成的功能主要爲:
(1) 模擬tcp、ip堆棧功能的插件,如IP碎片重組、TCP流重組插件;
(2) 各種解碼插件:http解碼插件、unicode解碼插件、rpc解碼插件、Telnet解碼插件等;
(3) 規則匹配無法進行攻擊檢測時所用的插件:端口掃描插件、spade異常入侵檢測插件、bo檢測插件等2)處理插件
處理插件在規則匹配階段的parse rule options中被調用,輔助完成基於規則的匹配庫。每個規則處理函數通常對應規則選項中的一個關鍵字,實現對這個關鍵字的解釋。其主要功能爲:
(1)檢查協議各字段,如TCPflag、ICMPtype、Fragbits、RPC、Dsize等;
(2)輔助功能,例如關閉連接、會話記錄、攻擊響應等
(3)輸出插件3)輸出插件在規則匹配過程中和匹配過程結束後調用,以便記錄日誌和告警。
-
總體流程
Snort的入侵檢測流程分成兩大步:
第一步是規則的解析流程,包括從規則文件中讀取規則和在內存中組織規則。其過程爲:
(1)讀取規則文件;
(2)依次讀取每條規則;
(3)解析規則;
(4)在內存中對規則進行組織,建立規則語法樹;第二步是使用這些規則進行匹配的入侵流程。其過程爲對從網絡上捕獲的每一條數據報文和在第一步建立的規則樹進行匹配,若發現存在一條規則匹配該報文,就表示檢測到一個攻擊,然後按照規則規定的行爲進行處理;若搜索完所有的規則都沒有找到匹配的規則,則視此報文正常。
3 Snort與Iptables的聯動
3.1 概述
爲什麼要讓Snort與Iptables聯動呢?
根據前面的介紹我們已經瞭解了Snort的工作方式與原理,聰明的你一定發現了Snort最致命的弱點——不能阻斷攻擊!Snort的主要作用是對整個網絡起到預警作用,從它的旁路部署模式也可以看出,它並不能阻斷網絡裏的攻擊行爲。誰能阻斷攻擊呢?——iptables。可爲什麼不採用Iptables呢?因爲Iptables的規則過於固定,並且Iptables並不能識別網絡裏的攻擊行爲。那能不能綜合一下它們二者的優點互補對方的缺點,而達到檢測到攻擊即切斷攻擊連接這樣的效果呢。答案是可以!
實現方式和實現原理
通過前面的知識我們瞭解到,Snort有個插件機制提供了預處理插件和處理插件等方式。而這種插件在Snort裏是支持自定義開發並加載的。因此第一種實現方式就是自定義開發插件,當檢測到規則匹配時則調用遠程或對應主機的防火牆,將有入侵行爲的ip和端口,建立對應的一條Iptables規則丟棄這個連接、端口的數據包或將此ip的所有包都丟棄。
相對於Snort的插件方式,第二種的實現方式非常簡單且易於實現,很適合本次實驗。這種方式就是利用一個簡單的腳本實時讀取告警日誌,將記錄到的ip和端口,創建對應的一條Iptables規則,加入到遠程或對應主機的防火牆規則中,也就是實現了同第一種方式相同的功能,雖然後者在處理速度上沒有第一種方式及時,但整體防護能力上並未有太大什麼區別。
實現方式總結如下:
(1). 利用Snort的擴展功能,自定義開發集成插件(目前有snortsam)。
(2). 利用Snort的告警日誌,自定義開發腳本。(本次實驗所採用,腳本爲guardian)
3.2 實驗環境
服務器:snort-host( Centos6.5),IP地址: 10.1.1.12
Snort版本:2.9.7.6
Guardian版本:1.7
操作主機:host(WinXp),IP地址: 隨機
測試主機:test(WinXp),IP地址: 隨機
3.3 實驗過程與分析
根據具體實驗,記錄、整理相應命令、運行結果等,包括截圖和文字說明。詳細記錄在實驗過程中發生的故障和問題,並進行故障分析,說明故障排除的過程及方法。
步驟一:安裝配置Snort
查看網卡
# ifconfig
如果網卡沒啓動,eth0爲網絡接口,當然不一定是eth0,對應自己計算機的網絡接口即可
# ifup eth0
更新系統
# yum –y update
安裝snort依賴包
# yum -y install pcre pcre-devel gcc gcc-c++ zlib zlib-devel libpcap libpcap-devel make autoconf flex byacc bison libxml2-devel wget tcpdump
安裝libdnet
# cd /usr/local/src/
# wget http://tools.hetianlab.com/tools/snort+IPtables.tar.gz
# tar zxvf snort+IPtables.tar.gz
# cd /usr/local/src/snort+IPtables
# tar zxvf libdnet-1.12.tgz
# cd libdnet-1.12
# ./configure --with-pic
# make && make install
# cd /usr/local/lib/
# ldconfig -v /usr/local/lib
安裝DAQ
# cd /usr/local/src/snort+IPtables
# tar zxvf daq-2.0.6.tar.gz
# cd daq-2.0.6
# ./configure
# make && make install
# cd /usr/local/lib/
# ldconfig -v /usr/local/lib
安裝snort
# cd /usr/local/src/snort+IPtables/
# tar zxvf snort-2.9.7.6.tar.gz
# cd snort-2.9.7.6
# ./configure –enable-sourcefire
# make && make install
# cd /usr/local/lib/
# ldconfig –v /usr/local/lib
Snort配置
創建snort系統必要的文件夾,導入規則庫,建立黑名單和白名單文件
# mkdir /etc/snort
# mkdir /var/log/snort
# cd /etc/snort
# cp /usr/local/src/snort+IPtables/snort-2.9.7.6/etc/* . (注意有個點號跟號中間有空格)
# tar zxvf /usr/local/src/snort+IPtables/snortrules-snapshot-2976.tar.gz
# cp ./etc/ .
# touch /etc/snort/rules/white_list.rules /etc/snort/rules/black_list.rules
爲snort添加一個用戶和組
# groupadd -g 40000 snort
# useradd snort -u 40000 -d /var/log/snort -s /sbin/nologin -c SNORT_IDS -g snort
# cd /etc/snort
# chown -R snort.snort *
# chown -R snort.snort /var/log/snort
修改配置文件
vi /etc/snort/snort.conf,修改內容如下:
ipvar HOME_NET 10.1.1.0/24 #(本次實驗爲此ip段地址)
ipvar EXTERNAL_NET any
var RULE_PATH /etc/snort/rules
var SO_RULE_PATH /etc/snort/so_rules
var PREPROC_RULE_PATH /etc/snort/preproc_rules
var WHITE_LIST_PATH /etc/snort/rules
var BLACK_LIST_PATH /etc/snort/rules
preprocessor sfportscan: proto { all } memcap { 10000000 } sense_level { low } #(檢測端口掃描,不去註釋也可以,去掉註釋用nmap掃描即可看到掃描日誌)
include $PREPROC_RULE_PATH/preprocessor.rules(註釋去掉)
include $PREPROC_RULE_PATH/decoder.rules(註釋去掉)
include $PREPROC_RULE_PATH/sensitive-data.rules(註釋去掉)
爲snort的文件在另一個位置創建一個同步鏈接
# ln -s /usr/local/bin/snort /usr/sbin/snort
修改snort及daq等相關目錄和文件權限
# cd /usr/local/src/snort+IPtables
# chown -R snort.snort daq-2.0.6
# chmod -R 700 daq-2.0.6
# chown -R snort.snort snort-2.9.7.6
# chmod -R 700 snort-2.9.7.6
# cd /usr/local/src/
# chown -R snort.snort snort_dynamicsrc
# chmod -R 700 snort_dynamicsrc
# cd /var/log
# chown -R snort.snort snort
# chmod -R 700 snort
# cd /usr/local/bin
# chown -R snort.snort daq-modules-config
# chmod -R 700 daq-modules-config
# chown -R snort.snort u2*
# chmod -R 700 u2*
# cd /etc
# chown -R snort.snort snort
# chmod -R 700 snort
配置動態規則
# mkdir -p /usr/local/lib/snort_dynamicrules
# cp /etc/snort/so_rules/precompiled/RHEL-6-0/x86-64/2.9*/.so /usr/local/lib/snort_dynamicrules (實驗環境是64位系統)
如果在32位系統上,這樣導入動態規則:
# cp /etc/snort/so_rules/precompiled/RHEL-6-0/i386/2.9/*.so /usr/local/lib/snort_dynamicrules/
# cd /usr/local/lib
# chown -R snort.snort snort*
# chmod -R 700 snort*
# chown -R snort.snort pkgconfig
# chmod -R 700 pkgconfig
導出動態規則文件
# snort -c /etc/snort/snort.conf --dump-dynamic-rules=/etc/snort/so_rules
如報錯,很有可能是導入動態規則時未能導入對應系統架構的規則文件。
設定告警文件權限
# touch /var/log/snort/alert
# cd /var/log/snort
# chown snort.snort alert
# chmod 700 alert
檢測配置文件是否有錯誤
# snort -T -c /etc/snort/snort.conf -i eth0
啓動snort
# snort -c /etc/snort/snort.conf -i eth0
停止snort
# ps -ef | grep snort
# kill -9 pid
步驟二:安裝配置guardian
安裝配置
# cd /usr/local/src/snort+IPtables
# tar zxvf guardian-1.7.tar.gz
# cd guardian-1.7
# touch /etc/snort/guardian.ignore
# touch /etc/snort/guardian.target
# touch /var/log/snort/guardian.log
# cp guardian.pl /usr/local/bin/
# cp scripts/iptables_block.sh /usr/local/bin/guardian_block.sh
# cp scripts/iptables_unblock.sh /usr/local/bin/guardian_unblock.sh
# cp guardian.conf /etc/snort
編輯guardian配置文件,vi /etc/snort/guardian.conf
Interface eth0
LogFile /var/log/snort/guardian.log
AlertFile /var/log/snort/alert //alert文件的位置
IgnoreFile /etc/snort/guardian.ignore //白名單
targetFile /etc/snort/guardian.target //黑名單
TimeLimit 120 //阻斷時間,以秒爲單位
guardian啓動
# /usr/bin/perl /usr/local/bin/guardian.pl -c /etc/snort/guardian.conf
Guardian 停止
# ps -ef|grep guardian
# kill -9 pid
步驟三:聯動測試
Snort與本地iptables聯動
測試規則是否加載生效,vi /etc/snort/rules/local.rules,添加下面兩條規則
alert tcp $HOME_NET any -> $EXTERNAL_NET any (msg:“OUT”; sid:5000005)
alert tcp $EXTERNAL_NET any -> $HOME_NET any (msg:“IN”; sid:5000006)
規則說明:告警外網和內網之間的所有tcp流量,用來測試你的snort.conf配置是否有問題
啓動snort,查看alert是否有日誌
# snort -c /etc/snort/snort.conf -i eth0
# cd /var/log/snort
# tail -f alert
如果可以看到日誌,則表明snort.conf配置沒有問題,可以繼續下面的測試,否則請檢查snort.conf的配置,以及snort目錄和文件權限設置。
聯動測試
如果之前的測試沒有問題,請將/etc/snort/rules/local.rules你所添加的兩條規則刪除或註釋掉。vi /etc/snort/rules/local.rules
#alert tcp $HOME_NET any -> $EXTERNAL_NET any (msg:“OUT”; sid:5000005)
#alert tcp $EXTERNAL_NET any -> $HOME_NET any (msg:“IN”; sid:5000006)
登錄另一臺windows測試主機(注意:如果用本機掃描很有可能導致snort主機無法登陸),打開瀏覽器,登錄http://tools.hetianlab.com/tools/X-Scan-v3.3-cn.rar下載x-scan並解壓,雙擊文件打開x-scan
設置掃描參數
點擊“掃描參數”按鈕,將指定IP範圍設置成你的snort主機ip地址,在“全局設置”的“掃描模塊”中選中“全選”,“插件設置”的“SNMP相關設置”、“NETBIOS相關設置”、“漏洞檢測腳本設置”均選擇全部選中。點擊開始按鈕,開始掃描。
觀察alert是否有告警日誌
# cd /var/log/snort
# tail -f alert
發現告警日誌,啓動guardian與iptables聯動
# /usr/bin/perl /usr/local/bin/guardian.pl -c /etc/snort/guardian.conf
在snort主機上執行iptables -L
觀察是否有規則加入,有規則即實驗成功。
可以看到,執行了iptables_block.sh腳本。在snort主機上執行,iptables -L即可看到新加入的規則。至此,單臺防火牆聯動已經成功實現。
擴展思考——Snort與其他主機或路由器聯動
這裏給出一些思路,如果您對此感興趣可以自行去實驗。
思路一:
將snort安裝在擁有兩個網卡的主機上,將網卡進行橋接使之處於透明模式,將Snort串聯部署在網絡出口路由器的後面,即可監控內網所有流量,實現聯動本地防火牆實現IPS功能。
思路二:
寫一個腳本實現如下功能,將告警日誌裏其他主機的告警,寫一條對應的聯動防火牆的規則腳本,將其存儲在本地,使用腳本登錄該主機後登錄snort主機下載 並執行規則腳本,實現聯動功能。此實現方式的弱點是無法達到及時響應的狀態,且聯動狀況取決於外界因素過多
3.4 實驗結果總結
對實驗結果進行分析,完成思考題目,總結實驗的心得體會,並提出實驗的改進意見。
1、 請查閱相關資料瞭解snortsam插件,分析並簡述snortsam與guardian的優缺點。
2、你認爲snortsam和guardian的這種聯動方式有哪些弊端?
體會:安全走向整合,安全產品協同聯動是未來方向。