一般企業除了部署防火牆之外,通常還會再建置一個網路型入侵偵測系統(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的主程式,主要用來擷取封包並進行比對,以辨別是否為惡意的封包樣式,其常用的執行參數如下所述:
-c:指定Suricata執行時所參考的組態檔(suricata.yaml)位置。
-i:設定所使用的網路卡介面名稱,Suricata即是利用此網路卡介面取得相關封包。
-D:表示以常駐程式(Daemon)的形式執行。
-v:顯示詳細的執行資訊。
偵測規則為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的設定,相關設定步驟說明如下:
步驟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等組態檔的所在位置。
說明過主要組態檔(suricata.yaml)之後,接下來介紹classification.conf,它是用來分類警報與優先順序的設定檔,可讓管理者直覺地了解相關警報的嚴重程度。其格式如圖8所示,其中優先權次序是表示嚴重程度,如表2的說明。
圖8 classification.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偵測到的相關威脅資訊。
<本文作者:吳惠麟,多年資安經驗,喜好利用開源碼建構相關解決方案,著有「資訊安全原理與實驗」等書。>