開源IDS/IPS Suricata的部署與使用

smileleooo發表於2024-05-09

目錄
  • 前言
  • 在Linux上部署Suricata
  • Suricata的基本配置
    • 配置檔案
    • Suricata的規則
  • Suricata的使用
    • Suricata檢測SQL隱碼攻擊

前言

Suricata 是一個高效能的網路入侵檢測和防禦系統(IDS/IPS)。它是由OISF開發,完全開源,並且可以免費使用。

Suricata和Snort的區別,有什麼優勢?

Snort 也是一個開源的IDS,能夠實時監控網路流量,檢測和防禦潛在的威脅。與Snort相比,Suricata的設計注重效能和可擴充套件性,它可以在低至中等規格的硬體上執行,支援多執行緒,同時處理高吞吐量的網路流量,同時流分析功能更為強大和複雜。說白了就是效能更強,功能更多。

Suricata能夠檢測各種網路威脅,包括但不限於:

  • 協議解析:支援多種協議,如TCP, UDP, ICMP, HTTP, FTP等。

  • 簽名匹配:使用類似於Snort的規則語言進行簽名匹配,以檢測已知攻擊模式。

  • 異常檢測:可以檢測到異常行為,如異常流量或潛在的惡意行為。

  • 應用層檢測:能夠檢測應用層的攻擊和異常行為,例如SQL隱碼攻擊。

  • 流量分析:可以對網路流量進行深入分析,包括狀態跟蹤和流量重建。

  • 實時響應:在檢測到攻擊時,可以實時阻斷或記錄攻擊流量。

Suricata的一些主要執行模式:

  • Single 模式:在這種模式下,所有的資料處理任務都由單個工作執行緒完成。

  • Workers 模式:這是為了高效能而設計的模式。在Workers模式中,每個工作執行緒都獨立執行從資料包捕獲到日誌記錄的所有任務,以實現負載均衡和提高處理速度。

  • Autofp 模式:這種模式適用於處理PCAP檔案或在某些IPS設定的情況下。Autofp模式下,有一個或多個資料包捕獲執行緒,它們捕獲資料包並進行解碼,然後將資料包傳遞給 flow worker 執行緒。

在Linux上部署Suricata

廢話少說,開始搭建!強烈建議參考官方的安裝文件一步步安裝:https://docs.suricata.io/en/latest/quickstart.html#installation

官方主要提供了兩種安裝方式:

第一種是使用包管理工具,參考 Binary packages

第二種是使用原始碼編譯安裝,參考 Source

在Ubuntu上安裝Suricata,OISF維護了一個PPA suricata-stable,其中總是包含最新的穩定版本。

第一種方式只需要新增相應倉庫源即可,需要注意的是,使用root許可權或者使用sudo來安裝:

sudo apt-get install software-properties-common
sudo add-apt-repository ppa:oisf/suricata-stable
sudo apt update
sudo apt install suricata jq  # jq是用來顯示Suricata的EVE JSON輸出資訊的工具

安裝後檢視正在執行的Suricata版本、選項以及服務狀態:

sudo suricata --build-info
sudo systemctl status suricata

image

image

Suricata的搭建過程非常簡單,官方的文件永遠是最好的參考文件。

Suricata的基本配置

配置檔案

首先來關注一下 /etc/suricata 下的幾個配置檔案:

image

  • classification.config 用於定義和分類不同型別的網路事件,比如哪些是潛在的攻擊、哪些是正常的網路活動等。

  • reference.config 包含了一些安全網站,漏洞平臺的URL網址,用來聯絡外部的惡意攻擊檢測網站。

  • suricata.yaml 是Suricata的主要配置檔案,它包含了規則配置、介面配置、日誌配置、檢測配置等。

  • threshold.config 用於定義流量的閾值和速率限制。設定在特定時間內對特定事件或簽名的觸發次數進行限制。

  • rules/ 規則目錄,存放不同種類的規則檔案 *.rules,規則用來判定流量攻擊型別,並定義攻擊型別和告警種類等。

Suricata的規則

在 rules/ 目錄下存放的各種 *.rules 檔案可以包含一個或多個用於檢測不同型別威脅的規則,同樣採用 Snort 的規則格式。

一個規則主要由以下三個部分組成:

  • action 決定當規則匹配時的處理動作

  • header 定義協議,IP地址,埠和規則的方向

  • rule options 定義規則的細節

image

在上圖中,紅色部分為action,綠色部分為header,藍色部分為rule options。

action主要有這個:

  • alert 生成一個告警

  • pass 停止對包的進一步檢查,並跳到所有規則的末尾

  • drop 丟棄資料包併產生告警

  • reject 向匹配報文的傳送端傳送RST/ICMP不可抵達錯誤

在IPS模式下,使用任何拒絕動作也會啟用drop。

header部分定義協議,IP地址,埠和規則的方向:

  • 註明協議種類,只要是tcp、udp、icmp、ip等

  • Any:源地址/目的地址(IP)

  • Any:源埠/目的埠

  • ->:方向,單向流量;<>雙向流量

  • Any:源地址/目的地址(IP)

  • Any:源埠/目的埠

rule options定義規則的細節:

  • msg:警報訊息,當規則匹配時輸出的訊息。

  • flow:流量匹配選項,指定規則匹配的流量特徵,如是否已建立等。

  • content:規則匹配的內容。

  • classtype:規則的分類型別,由 classification.config 檔案定義。

  • sid:用於唯一性規則標識。

  • rev:規則版本號。

比如 rules/app-layer-events.rules 中的一條規則示例:

alert ip any any -> any any (msg:"SURICATA Applayer Mismatch protocol both directions"; flow:established; app-layer-event:applayer_mismatch_protocol_both_directions; flowint:applayer.anomaly.count,+,1; classtype:protocol-command-decode; sid:2260000; rev:1;)
  1. alert 這是規則的開始,表示如果匹配此規則,Suricata將生成一個警報。

  2. ip any any -> any any 這表示規則適用於任何流量,不限制源IP和目的IP。

  3. msg:"SURICATA Applayer Mismatch protocol both directions" 這是當規則觸發時顯示的訊息。

  4. flow:established 這個條件指定規則只應用於已建立的流,即那些已經完成了TCP三向握手的連線。

  5. app-layer-event:applayer_mismatch_protocol_both_directions 指定了應用層事件,即應用層協議不匹配的情況。

  6. flowint:applayer.anomaly.count,+,1 這是一個流量計數器,每當規則觸發時,對流內的應用層異常計數器進行遞增操作。

  7. classtype:protocol-command-decode 指定了事件的分類型別,即協議命令解碼。

  8. sid:2260000 規則的唯一識別符號Signature ID。

  9. rev:1 這是規則的版本號,區分同一規則的不同版本。

關於Suricata的規則還有很多的內容,詳細參考:https://docs.suricata.io/en/latest/rules/index.html

Suricata的使用

在使用suricata之前,首先了解surcata的基本的幾個命令:

-c # 指定配置檔案的路徑
-T # 測試配置執行
-i # 指定網路卡
suricata-update # 更新規則

第一步我們要確定Suricata應該在哪個介面和IP地址上進行檢測,ifconfig命令檢視網路卡和IP地址。

image

第二步編輯 Suricata 的配置檔案 /etc/suricata/suricata.yaml,指明需要監聽的網路卡,網路範圍 HOME_NET。

sudo vim /etc/suricata/suricata.yaml

image

image

第三步啟動執行Suricata

suricata -i ens33 -c /etc/suricata/suricata.yaml

image

使用 -v 引數,增加日誌級別來增加Suricata應用程式日誌的詳細程度。

Suricata檢測SQL隱碼攻擊

只需要向Suricata匯入SQL的規則就可以檢測,根據Suricata的規則我們可以自己編寫相關的SQL檢測規則來進行檢測。幸運的的是已經有開源的專案提供了大量的Suricata rules來檢測各種型別的攻擊,參考專案suricata-rules

將SQL隱碼攻擊的規則檔案但放到 /var/lib/suricata/rules/ 這個目錄下:

image

此外還需要在/etc/suricata/suricata.yaml檔案中新增針對SQL隱碼攻擊的檢測規則檔案sql_injection.rules。

注意:新增新的規則檔案以後,必須使用 suricata-update 命令重新載入配置檔案,更新規則。

image

啟動Suricata服務,載入配置檔案,並指定網路卡為ens33

suricata -i ens33 -c /etc/suricata/suricata.yaml

使用sqlmap測試一下:

image

當Suricata檢測到可能的SQL隱碼攻擊時,會產生記錄日誌、傳送警報等相應的響應動作,產生的相關日誌資訊放在目錄:/var/log/suricata/

在/var/log/suricata/目錄下,其中的 fast.log 檔案包含了快速報警資訊,提供了關於檢測到的安全事件的簡要摘要。fast.log 的每一條記錄包含:時間戳、條目的編號、當規則匹配時產生的警報訊息msg、使用的協議、源IP地址、目標IP地址。

image

eve.json 檔案提供了更多的資訊,包括流量細節、規則資訊、負載資料等。eve.json 的每一條記錄包含:時間戳、流ID、輸入介面、事件型別。源源埠:21、目標IP、目標埠、協議、資料包來源、警報資訊、動作開始時間、源IP、目標IP、源埠、目標埠等。

image

透過分析這些日誌檔案資訊,可以得到事件發生的確切時間,事件型別,事件的來源,受影響的目標等資訊,從而達到入侵檢測的目的。

踩到的坑:

Suricata在新增規則檔案後,必須要使用 suricata-update 命令重新載入配置檔案,否則規則會不生效,檢測不到相應的惡意流量。自定義的規則檔案需要嚴按照官方的要求進行編寫,使用 suricata -T 命令檢測規則是否可以正常執行,否則規則檔案無法被正確載入,服務無法正常啟動。


若有錯誤,歡迎指正!o( ̄▽ ̄)ブ

相關文章