NIDS 網路型入侵偵測系統 開源碼 Suricata

開源Suricata搭配Evebox 網路入侵偵測系統兼顧彈性即時

部署NIDS補防火牆不足 圖形可視化辨識惡意封包

2025-09-17
一般企業除了部署防火牆之外,通常還會再建置一個網路型入侵偵測系統(NIDS)來監控來往封包流量。為此本文將介紹一套開源碼社群中富有盛名的NIDS偵測系統Suricata,並且搭配Evebox來提供Web管理介面,讓管理者能夠更便利地管理系統。

隨著網路威脅與日俱增,一般企業除了部署防火牆外,通常會再建置一個網路型入侵偵測系統(Network Intrusion Detection System,NIDS)於企業網段來監控來往封包流量是否有異常之處,以彌補防火牆不足之處。

因此,本文將介紹一套開源碼社群中富有盛名的NIDS偵測系統「Suricata」(官方網址為https://suricata.io/)。除了核心的NIDS系統之外,還將搭配Evebox(官方網址是https://evebox.org/)軟體,以提供相關Web管理介面,讓管理者更便利地管理相關系統。在本文中所使用的作業系統為CentOS 9。

什麼是網路型入侵偵測 系統(NIDS)

網路型入侵偵測系統(NIDS)通常部署在網段的閘道(Gateway)上並監控整個網段的封包流量是否有異常的行為,一旦發現具有惡意的攻擊行為正在進行,便會即時記錄該行為,甚至在當下直接阻擋相關行為的連線。依其偵測的型式,大致可分為:

特徵比對(Signature-based)

系統會先建立相關惡意特徵樣式的資料庫,而後再與來往封包進行特徵樣式比對。只要符合相關樣式,就會判定為異常行為,此種方式主要的優點是不易誤判,因為個別的攻擊行為通常都擁有特殊的特徵,可利用此特性來精確比對出惡意的攻擊,但其缺點是無法辨別出未知的攻擊樣式,本文介紹的Suricata所採用的偵測方式,即屬於此種方式。其利用撰寫偵測規則的方式來定義攻擊樣式,藉此比對相關的封包流量。

異常偵測(Anomaly-based)

異常偵測主要是為了解決「特徵比對」無法辨別未知的攻擊樣式,它運用統計建模的方式來定義出正常的系統模式。而後,當NIDS檢測出不符合正常模式的流量時,即可判別為異常,但由於很難界定所謂的「正常的系統模式」,因此誤判的機率較高。

 安裝Suricata 

在簡單的說明NIDS後,接著就來安裝Suricata,這裡將採用原始碼編譯的方式來安裝。首先,安裝所需的相依軟體:

dnf install -y rustc cargo cbindgen dnf install -y gcc  gcc-c++   jansson-devel libpcap-devel libyaml-devel make dnf install -y pcre-devel zlib-devel

接著,至Suricata的官方網站取得最新版本(本文採用7.0.7版)的原始碼進行編譯,在取得原始碼並解壓縮後,接著執行如下指令(#為註解說明):

configure --prefix=/usr/local/ suricata  #設定要將Suricata安裝在/ usr/local/suricata目錄上 make #進行編譯並產生相關的執 行檔與組態範例檔 make install  #在編譯成功後,將相關 的檔案安裝至系統上

Suricata的常用執行程式

接著,說明Suricata所提供的常用執行程式:

suricata

此為Suricata的主程式,主要用來擷取封包並進行比對,以辨別是否為惡意的封包樣式,其常用的執行參數如下所述:

-c:指定Suricata執行時所參考的組態檔(suricata.yaml)位置。

-i:設定所使用的網路卡介面名稱,Suricata即是利用此網路卡介面取得相關封包。

-D:表示以常駐程式(Daemon)的形式執行。

-v:顯示詳細的執行資訊。

suricata-update

偵測規則為Suricata的靈魂所在,優良的偵測規則可有效地比對出惡意的封包樣式,而在開源碼社群中已有許多相關的偵測規則可供使用。可以使用suricata-update來管理相關的偵測規則。先利用list-sources參數列出可使用的偵測規則來源,再執行下列的指令,輸出結果如圖1所示:

圖1  執行suricata-update list-sources指令。

suricata-update list-sources

在知道可使用的偵測規則來源之後,接下來啟用所需的偵測規則,這裡以啟用偵測nmap(一種有名的通訊埠服務掃描)掃描的規則為例。可使用enable-source參數,以下列的指令來啟用偵測nmap掃描的偵測規則:

suricata-update enable-source aleksibovellan/nmap

在啟用後,利用list-enabled-sources來確認啟用狀態:

suricata-update list-enabled-sources

如果啟用規則成功,應該就會看到如圖2所示的輸出,表示已啟用相關偵測。

圖2  已啟用相關偵測。

確定啟用成功後,最後再執行下列指令,讓相關的設定生效:

suricata-update --suricata-conf < suricata.yaml > --suricata < suricata主程式>

Suricata的主要組態檔

在簡單說明過Suricata所提供的主要執行程式後,接下來說明主要的組態檔,如表1所示。

suricata.yaml

接著說明suricata.yaml的設定,相關設定步驟說明如下:

步驟1,設定基本組態變數的資訊,主要是設定IP位址變數,一般而言僅須設定HOME_NET(即內網,通常是設定Suricata所在的網段範圍,本例為192.168.1.0/24)以及EXTENAL_NET(外網,表示要偵測的範圍,通常是設定ANY,表示不限制,或是除了HOME_NET以外的網路範圍,以!$HOME_NET表示),設定內容如圖3所示。

圖3  設定基本組態變數的資訊。

步驟2,主要是選擇警報輸出的類型,例如資料庫、檔案或封包(pcap)以及位置。在本文中,設定將警報輸出至檔案上。

除了預設的格式(fast)外,另外須設定eve-log(Extensible Event Format)格式的輸出,以提供給Evenbox解析Fast格式,設定內容如圖4所示,而相關組態說明如下:

圖4  選擇警報輸出的類型。

‧enabled:設定是否(yes或no)啟用fast格式的記錄功能。

‧filename:設定所要儲存的檔案名稱。

‧append:設定是否以新增的方式進行警報資訊的儲存,一般都會選擇yes。

‧filetype:表示此輸出所使用的類型,提供的類型包括regular(表示為一般的文字檔案)、syslog(輸出至系統的Syslog機制)、redis(輸出至Redis資料庫)。

接著,設定eve-log格式的輸出,如圖5所示。

圖5  設定eve-log格式的輸出。

步驟3,選擇Suricata監控所使用的網路介面協定類型,這裡將使用af-packet(Linux提供的網路通訊協定介面),相關組態設定如下說明:

‧Interface:設定要監控的網路卡介面名稱,表示使用此網路卡來監控網段的網路封包流量。

‧Threads:設定Suricata執行時啟用的執行緒數量,通常設為auto,表示自動使用系統所提供的執行緒數量。

‧cluster-id:此組態是用來做監控流量負載平衡(Load Balance)之用,一般使用預設值即可。

‧cluster-type:設定處理封包的演算依據,提供的選項包括:cluster_flow(此為預設值,主要依據封包的特性如封包來源或目的IP來分配封包的處理)、cluster_cpu(使用收到封包的CPU編號的模式來分配封包的處理)、cluster_qm(使用AF_PACKET機制中的queue模式來分配封包的處理)。

‧defrag:設定是否要啟用重組封包的功能,因為大容量的IP封包在網路傳輸時經常會被分段(Fragmentation)進行傳輸,所以此組態須設為yes,才能將封包重組成原來的資訊。

‧use-mmap:設定是否使用記憶體來進行存取,一般而言,此選項須設定為yes。

步驟4,主要是設定所要偵測的應用程式類型(例如FTP、Telnet等應用程式)的封包流量,預設為偵測所有的應用程式,如圖6所示。

圖6  設定所要偵測的應用程式類型。

步驟 5,設定Suricata所使用的偵測規則檔所在的目錄位置與檔案名稱,以及其他組態檔的位置,如圖7所示。

圖7  設定Suricata所使用之偵測規則檔所在的目錄位置與檔案名稱。

其中,default-rule-path為設定偵測規則所在的目錄位置,而rule-files是設定所使用的偵測規則檔案名稱(可直接查看此檔案來確認相關的偵測規則)。除此之外,還須設定classification.conf、reference.conf、threshold-file等組態檔的所在位置。

classification.conf

說明過主要組態檔(suricata.yaml)之後,接下來介紹classification.conf,它是用來分類警報與優先順序的設定檔,可讓管理者直覺地了解相關警報的嚴重程度。其格式如圖8所示,其中優先權次序是表示嚴重程度,如表2的說明。

圖8  classification.conf組態檔格式。

threshold.conf

接著說明設定警報觸發之門檻值的threshold.conf檔,使用者可利用此組態檔來設定某個偵測規則編號觸發的門檻值,例如設定遠端登入在5分鐘之內,需登入失敗超過10次,就判定為暴力攻擊威脅。其設定格式如下所示,相關欄位說明可參考表3:

threshold或suppress 〈gen_id〉   ,sig_id   〈 sig_id〉,type 〈 limit〉 ,track  〈by_src|by_ dst〉 ,count 〈 n〉  , seconds 〈 t〉  

如下例所示,只要某個來源IP(by_src)在60秒內觸發規則編號9999超過10次就會產生警報:

threshold gen_id 1, sig_id 9999, type limit, track by_src, count 10, seconds 60

安裝Evebox

說明過Suricata相關的組態檔之後,接下來安裝Evebox,可提供管理者一個網頁式的管理介面。安裝步驟如下:

rpm -Uvh https://evebox.org/files/rpm/ stable/evebox-release.noarch.rpm yum install evebox  #安裝Evebox

安裝成功後,說明其組態檔,檔名為「/etc/evebox/evebox.yaml」。就如同Suricata的組態檔一樣,其格式為YAML,這裡將以設定Evebox提供SSL連線及帳號∕密碼登入功能為例,進行說明相關組態設定,如下所示:

http:   host: "0.0.0.0"  #設定任何外部主機均可進行連線   port: 5636  #設定執行時所使用的通訊埠編號  tls:     enabled: true  #設定是否(true    |false)啟用SSL功能 database: type: sqlite  #設定所使用的資料庫類型,在此使用sqlite   retention:     days: 7   #設定欲保留的資料天數     size: "10 GB"  #設定可使用的資料儲存容量 input: #此區段設定欲使用的來源,即是Suricata所輸出的eve-log資訊   enabled: true   paths:     - "/usr/local/suricata/var/      log/suricata/eve.json" #設定欲使用的Suricata輸出的json檔  案,必須與suricata.yaml中的   eve-log所設定檔案路徑及名稱一致

完成Suricata和Evebox相關組態檔的設定後,即可依序啟動相關服務:

#以常駐程式的模式執行Suricata suricata -c suricata.yaml  -i <網卡介面名稱> -D #啟動Evebox systemctl start evebox

第一次啟動Evebox時,須使用下列指令來取得admin(Evebox預設的帳號名稱)的預設密碼:

systemctl status --no-pager --full evebox | grep admin

可藉由如下輸出來取得相關的預設密碼:

WARN evebox::server::main: Created administrator username and password: username=admin, password=預設密碼

在成功啟動相關服務後,使用者便可使用「https:// [Evebox IP]:5636」進行連線。經過帳號和密碼的驗證後,就能夠取得Suricata所偵測到的相關威脅資訊,如圖9所示。至此,一個具有網頁管理介面的網路型入侵偵測系統即告完成。

圖9  取得Suricata偵測到的相關威脅資訊。

<本文作者:吳惠麟,多年資安經驗,喜好利用開源碼建構相關解決方案,著有「資訊安全原理與實驗」等書。>


追蹤我們Featrue us

本站使用cookie及相關技術分析來改善使用者體驗。瞭解更多

我知道了!