入侵偵測系統(IDS)主要功能在於記錄當下的相關攻擊行為,但無法在當下即時阻擋攻擊,也因此有入侵防禦偵測系統(IPS)出現,本文將介紹一套開源碼社群中有名的入侵偵測系統Suricata,搭配Netfilter中的NFQUEUE機制,實作一個具有即時阻擋攻擊的IPS。
隨著網路威脅多樣化,一般企業除了部署防火牆外,通常也會再部署入侵偵測系統(Intrusion Detection System,IDS)來增強資安防禦的能量。
入侵偵測系統主要功能在於記錄當下的相關攻擊行為,但並無法在當下即時地阻擋相關的攻擊行為,也因此有IPS(Intrusion Prevention System)這一類資安設備的出現,此類系統除了可即時記錄相關攻擊行為外,還能同時阻擋相關的攻擊。
因此,本文將介紹一套開源碼社群中有名的入侵偵測系統Suricata(官方網站為https://suricata.io/),搭配Netfilter中的NFQUEUE機制,實作一個具有即時阻擋攻擊的IPS,所使用的作業系統為CentOS 9。
什麼是Suricata
Suricata是開源碼社群上一套有名的網路型入侵偵測系統(Network-based Intrusion Detection System,NIDS)。通常部署於整個網段的閘道(Gateway),並利用特徵比對(Signature-based)的方式來監控整個網段的封包資料是否具有惡意的攻擊樣式,或利用異常偵測(Anomaly-based)來確認是否有異常的封包流量。
一旦發現有相關異常的封包流量,就會記錄該行為,甚或可即時直接阻擋該封包來源的連線。而Suricata即是利用自行定義的偵測規則(Rule)來判別來往的封包是否具有相同特徵,以識別是否為惡意的封包。
安裝Suricata
在簡單了解NIDS後,接下來利用原始碼編譯的方式來安裝Suricata。
首先,執行以下的指令來安裝相關所需要的系統程式庫:
dnf -y install epel-release dnf- plugins-core config-manager --set-enable crb dnf install -y rustc cargo cbindgen dnf install -y gcc gcc-c++ jansson- devel libpcap-devel dnf install -y libyaml-devel make pcre2-devel zlib-devel
安裝完所需的程式庫之後,即可安裝Suricata。在下載最新版本(在此使用的版本為7.0.7)後,使用如下的指令進行安裝:
#安裝於/usr/local/suricata目錄,並 且啟用nfqueue功能(IPS所需要) ./configure --prefix=/usr/local/ suricata --enable-nfqueue make #進行編譯 make install #進行安裝 #新建儲存相關的Suricata所產生記錄 (Log)檔案的目錄 mkdir -p /usr/local/suricata/var/ log/suricata #新建儲存Suricata相關組態檔的目錄 mkdir -p /usr/local/suricata/etc/ suricata #新建儲存Suricata規則(Rule)的目錄 mkdir -p /usr/local/suricata/var/ lib/suricata/rules/ #置放rule 目錄執行 mkdir -p /usr/local/suricata/var/ run/ #新建執行時所使用的目錄名稱
接著,執行下列命令來取得最新的Suricata偵測規則資訊:
suricata-update
最後,將相關的組態檔複製到相對應的目錄:
cp etc/classification.config /usr/ local/suricata/etc/suricata/ cp etc/reference.config /usr/local /suricata/etc/suricata/ cp threshold.config /usr/local /suricata/etc/suricata/ cp suricata.yaml /usr/local /suricata/etc/suricata/
至此,大致完成安裝Suricata的工作。
主要執行檔及組態檔說明
接下來,說明Suricata所提供的主要執行檔及組態檔。
suricata
為執行的主程式,常用的執行組態如下所述:
-T:測試組態檔的語法是否正確
-c:指定要使用的組態檔位置(suricata.yaml)
-D:以常駐程式(Daemon)方式執行
-i:設定要使用的網路介面裝置代號
-q:設定要使用的NFQUEUE編號,表示要以IPS模式運作。
classification.conf
分類組態檔,主要定義並分類相關偵測規則中的威脅級別和警報類型。以便進行分級與管理。其格式如圖1所示(共分三個欄位):
(1) 此規則的分類名稱,如attempted-recon。
(2) 對於此分類的簡短說明。此描述會出現在Suricata的記錄中,便於分析人員理解此警報的內容,如Attempted Information Leak。
(3) 該分類的優先等級(Priority),數字越小,表示優先等級越高。
reference.conf
此檔案主要定義各種規則中所引用的外部參考資料,例如Common Vulnerabilities and Exposures(CVE),其格式如圖2所示。
threshold.config
用於設定規則的觸發成立的門檻值,這在判斷是否為真正的攻擊情況時是很重要的,例如5分鐘之內發生2次登入失敗可能是不小心,但若同樣的時間內發生超過百次的登入失敗,很明顯即為攻擊的情況。適當的設定門檻值,可以避免許多無效且重複的假警報,如下例(規則編號為1000010)為設定在5分鐘之內,若個別單一的來源IP觸發次數超過100次即觸發警報:
threshold gen_id 1, sig_id 1000010, type limit, track by_src, count 100, seconds 300
suricata.yaml
這是Suricata使用的主要的組態檔,使用YAML(Yet Another Markup Language)格式,其定義Suricata執行時所使用的重要組態,其主要設定的區段如下所述:
此區段中主要是設定要防護監控的內外網路相關資訊,以及一些重要的組態變數設定,常見的組態有:HOME_NET(設定要監控的內部網路,可使用CIDR格式表達)、EXTERNAL_NET(設定要監控的外部網路,可使用CIDR格式表達)、default-log-dir(設定Suricata記錄儲存的目錄)。
設定要擷取網路封包的網路介面,提供了af-packet、pfring、pcap等高效能補捉網路封包的裝置,使用者可根據自身環境設定適合的網路介面,本文會使用af-packet來擷取網路封包。
規則配置
設定要使用的偵測規則,常見的組態設定如下:
rule-files: - suricata.rules #設定所使用的 偵測規則檔 default-rule-path: 設定為偵測規則 所在的目錄 classification-file: 設定classi fication.config所在的位置 reference-config-file: 設定refer ence-config-file所在的位置 threshold-file: 設定threshold.config 所在的位置
設定符合偵測規則的相關事件資訊及儲存格式等資訊,預設使用為fast:
- fast: enabled: yes filename: fast.log #事件記錄檔名稱 append: yes #以新增的方式累計紀錄資訊
除此之外,為方便處理起見,建議開啟EVE(Extensible Event Format,以json格式儲存),如下設定:
-eve-log: enabled: yes filetype: regular #表示以檔案形式儲存 filename: eve.json
Suricata的偵測規則架構
接下來,就繼續說明Suricata的偵測規則架構,其語法如下:
動作(Action) 通訊協定(Protocol) 來源IP 來源通訊埠 -> 目的IP 目的通 訊埠 規則選項
Action
當發現符合偵測規則時,所要執行的動作。相關動作如下所述:
Pass:直接放行此封包 Drop:直接丟棄此封包並記錄相關訊息,此動作須運作於IPS模式下才有效。 Reject:類似Drop動作,會直接丟棄此封包,但如果封包的通訊協定為TCP時,即會回覆Reset封包,此動作須運作於IPS模式下才有效。 Alert:當偵測規則比對成功時,即會產生一個記錄相關(Alert)訊息。
通訊協定
設定要監控的網路封包所使用的通訊協定,例如udp、icmp、ip、http等通訊協定。
來源IP->來源通訊埠
設定要監控的來源IP和通訊埠資訊,若設定為any即表示不設限。
目的IP->目的通訊埠
設定要監控的目的IP和通訊埠資訊,若設定為any即表示不設限。
規則選項
指定相關的比對條件,須根據不同的通訊協定來訂定不同的關鍵字(Keywords)進行比對,可參考Suricata官方網站相關的關鍵字說明。常見的選項包括:
msg:警告的資訊,當符合偵測規則時,所要記錄的文字。
sid:規則的編號,必須為唯一值,用於區分不同的規則。
content:用來比對文字,通常用來檢測特定的內容。
pcre(Perl Compatible Regular Expressions):提供正規表示法來匹配更複雜的樣式。
如下例為當發現有icmp封包,即記錄ICMP Test Rule字樣:
alert icmp any any -> any any (msg:"ICMP Test Rule"; sid:1000001; rev:1;)
認識Netfilter和NFQUEUE
Netfilter是Linux系統預設的網路封包過濾框架,可在使用iptables程式時透過此機制來管理網路封包,圖3所示為Netfilter封包處理的流程。其中PREROUTING、INPUT、OUTPUT、POSTROUTING等為規則鏈(Chain),使用者可透過iptables在規則鏈內設定規則的方式來處理封包。
當網路封包進入網卡時,會先流經PREROUTING。若發現該封包的目的IP為本機的位置,則會再經INPUT、OUTPUT、POSTROUTING等規則鏈後再發至下個地點。若發現該封包的目的IP不為本機的位置,則轉發至FORWARD、POSTROUTING後再發至下個地點。
而NFQUEUE可架構在上述的規則鏈中,並允許外部應用程式取得相關的網路封包進行處理。Suricata就是利用此架構來取得網路封包,並進行處理(如drop),依此完成IPS的功能。
iptables使用語法
接下來,簡單說明iptables的使用語法:
iptables command [match][-j target/jump]
Command
此為主要的使用參數,通常用來管理要設定的規則(如新增、刪除規則),常用的參數如下:
-A:在指定的規則鏈之後新增一個規則
-D:在指定的規則鏈中刪除規則
-F:清除規則鏈中的規則
-L:顯示規則鏈內的所有規則資訊
-I:在規則鏈插入規則
常用的比對條件如下:
-d:指定要比對的目的主機或IP位址
-i:指定套用規則的網路介面名稱,如eno1。
-p:提供要比對的通訊協定,例如TCP、UDP、ICMP等通訊協定的封包。
-m:提供要比對的MAC資訊
-j:表示如符合條件時須執行的動作(Action),常用動作選項包括:ACCEPT(允許符合條件的封包通過)、DROP(丟棄符合條件的封包)、RETURN(表示直接離開目前規則,直接跳到下個規則比對)、NFQUEUE(表示將封包重導到本機的佇列QUEUE中,通常是被用來讓其他應用程式處理)、MASQUERADE(將封包來源的IP位址改為防火牆傳送封包之網路介面的IP位址,通常用來完成NAT功能)、LOG(將封包連線相關資訊記錄在核心記錄檔中,使用者可利用dmesg指令查看相關訊息)。
開始實作
在簡單了解Suricata與NFQUEUE機制後,接著實作一個阻擋ICMP封包的IPS。為了簡化說明起見,這裡將利用Suricata來防護其所在的單一主機。首先,執行以下的指令,確認Suricata是否支援AF_PACKET(取得網路封包的介面)和NFQueue(圖4):
suricata --build-info
接著檢查suricata.yaml的設定,主要確認af-packet組態設定:
-af-packet: interface:eno1 #要使用的網路卡,在此設定網路卡代號 copy-mode: ips #設定要以IPS模式執行 copy-iface: eno1 - eve-log: #設定以EVE格式輸出 enabled: yes filetype: regular filename: eve.json
然後,在規則鏈(INPUT及OUTPUT)設定NFQUEUE:
iptables -I INPUT -p icmp -j NFQUEUE --queue-num 0 iptables -I OUTPUT -p icmp -j NFQUEUE --queue-num 0
為了測試方便,可加入下列規則(丟棄icmp封包):
drop icmp any any -> any any (msg:"ICMP Test Rule"; sid:1000001; rev:1;)
最後,再執行「suricata -c suricata.yaml -q 0 -D」,表示要運作於IPS並取得NFQUEUE內的封包進行處理。而後,再利用ping指令發送icmp封包。
如果一切正常,應可發現icmp已被阻擋,並且在eve.json應可發現如圖5所示的訊息,告知ICMP封包已被阻擋。
<本文作者:吳惠麟,多年資安經驗,喜好利用開源碼建構相關解決方案,著有「資訊安全原理與實驗」等書。>