如何在 CentOS 8 Stream 上安装 Suricata

介紹

Suricata是一款網絡安全監控(NSM)工具,它使用社區創建的一組和用戶定義的簽名(也稱為規則)來檢查和處理網絡流量。當它檢測到可疑的封包或請求時,Suricata可以生成日誌事件、觸發警報並且阻止流量,無論是針對運行在服務器上的任何一個服務。

預設情況下,Suricata作為一個被動入侵檢測系統(IDS)工作,用於掃描服務器或網絡上的可疑流量。它將生成並記錄警報以進一步調查。它還可以被配置為主動入侵防禦系統(IPS),用於記錄、警報和完全阻止與特定規則匹配的網絡流量。

您可以在網絡中的網關主機上部署Suricata,以掃描其他系統的所有入站和出站網絡流量,或者您可以在單獨的機器上以任一模式運行它。

在本教程中,您將學習如何在Centos 8 Stream上安裝Suricata,以及如何自定義一些其默認設置以滿足您的需求。您還將學習如何下載Suricata用於掃描網絡流量的現有簽名集(通常稱為規則集)。最後,您將學習如何測試Suricata是否正確地檢測到响應中的可疑請求和數據。

先決條件

根據您的網絡配置和您打算如何使用 Suricata,您可能需要更多或更少的 CPU 和 RAM 來運行您的服務器。一般來說,您計劃檢查的流量越多,您應該分配給 Suricata 的資源就越多。在生產環境中,請至少計劃使用 2 個 CPU 和 4 或 8GB 的 RAM。從那裡開始,您可以根據 Suricata 的性能和您需要處理的流量量來擴展資源。

如果您計劃使用 Suricata 來保護運行它的服務器,您將需要:

否則,如果您計劃在網關主機上使用 Suricata 監控和保護多個服務器,您需要確保主機的網絡配置正確。

如果您使用的是 DigitalOcean,您可以參考這篇指南 如何將 Droplet 配置為 VPC 網關。這些指示也應該適用於大多數 CentOS、Fedora 和其他 RedHat 衍生的服務器。

步驟1 — 安裝 Suricata

要開始安裝 Suricata,您需要將Open Information Security Foundation(OISF)的軟件存儲庫信息添加到您的CentOS系統中。您可以使用dnf copr enable命令來完成此操作。您還需要添加企業Linux的額外套件(EPEL)存儲庫。

要啟用dnf套件工具的社區項目(copr)子命令,請運行以下命令:

  1. sudo dnf install 'dnf-command(copr)'

系統會提示您安裝一些額外的依賴項,以及接受CentOS Linux發行版的GPG金鑰。每次按下yENTER鍵完成安裝copr套件。

接下來運行以下命令將OISF存儲庫添加到您的系統並更新可用套件列表:

  1. sudo dnf copr enable @oisf/suricata-6.0

當提示確認要添加存儲庫時,請按下yENTER鍵。

現在添加epel-release套件,這將使一些額外的依賴套件對Suricata可用:

  1. sudo dnf install epel-release

當提示要導入GPG金鑰時,請按下yENTER鍵以接受。

現在您已經啟用了所需的軟件存儲庫,可以使用dnf命令安裝suricata套件:

  1. sudo dnf install suricata

當提示添加OISF存儲庫的GPG密鑰時,請按yENTER。 現在將下載並安裝該套件及其依賴項。

接下來,啟用suricata.service,以便系統重啟時運行。 使用systemctl命令啟用它:

  1. sudo systemctl enable suricata.service

您應該收到如下輸出,表示服務已啟用:

Output
Created symlink /etc/systemd/system/multi-user.target.wants/suricata.service → /usr/lib/systemd/system/suricata.service.

在繼續本教程的下一部分之前,該部分將解釋如何配置Suricata,使用systemctl停止服務:

  1. sudo systemctl stop suricata.service

停止Suricata確保您編輯和測試配置文件時,所做的任何更改將在Suricata再次啟動時驗證並加載。

步驟2 — 首次配置Suricata

OISF存儲庫中的Suricata套件附帶了一個配置文件,涵蓋了各種用例。 Suricata的默認模式是IDS模式,因此不會丟棄任何流量,只會記錄日誌。 留在默認模式下是一個不錯的主意,因為您學習Suricata。 一旦您將Suricata配置並集成到您的環境中,並且對其將警告您的流量類型有了良好的了解,您可以選擇切換到IPS模式。

但是,默認配置仍然有一些設置可能需要根據您的環境和需求進行更改。

(可選)啟用社區流ID

Suricata可以在其JSON輸出中包含一個社區ID字段,以便更容易地將單個事件記錄與其他工具生成的數據集中的記錄匹配。

如果您計劃將Suricata與其他工具(如ZeekElasticsearch)一起使用,現在添加社區ID是一個好主意。

要啟用此選項,請使用vi或您偏好的編輯器打開/etc/suricata/suricata.yaml

  1. sudo vi /etc/suricata/suricata.yaml

找到第120行,其中寫道# 社區流ID。如果您使用vi,請輸入120gg直接跳轉到該行。該行下面是community-id鍵。將其設置為true以啟用該設置:

/etc/suricata/suricata.yaml
. . .
      # 社區流ID
      # 向EVE記錄添加了一個'community_id'字段。這些用於提供
      # 一個可預測的流ID,可用於將記錄與
      # 其他工具(如Zeek(Bro))的輸出匹配。
      #
      # 採取一個需要跨傳感器和工具相同的“種子”,
      # 以使ID不太可預測。

      # 啟用/禁用社區ID功能。
      community-id: true
. . .

現在當您檢查事件時,它們將具有類似 1:S+3BA2UmrHK0Pk+u3XH78GAFTtQ= 的ID,您可以使用該ID來將不同NMS工具中的記錄相關聯。

保存並關閉 /etc/suricata/suricata.yaml 文件。如果您使用的是 vi,您可以按 ESC 然後輸入 :x 然後按 ENTER 保存並退出文件。

確定要使用哪個網絡接口

您可能需要覆蓋預設的網絡接口或您希望Suricata檢查流量的接口。隨 OISF Suricata 軟件包一起提供的配置文件默認將流量檢查到名為 eth0 的設備上。如果您的系統使用不同的默認網絡接口,或者如果您希望在多個接口上檢查流量,則需要更改此值。

要確定默認網絡接口的設備名稱,您可以使用以下命令:

  1. ip -p -j route show default

-p 標誌將輸出格式化為更可讀的形式,-j 標誌將輸出作為JSON格式打印。

您應該會收到以下類似的輸出:

Output
[ { "dst": "default", "gateway": "203.0.113.254", "dev": "eth0", "protocol": "static", "metric": 100, "flags": [ ] } ]

dev 行表示默认设备。在此示例输出中,设备是突出显示的 eth0 接口。您的输出可能显示一个设备名称,例如 ens...eno...。不管名称是什么,都要做个记录。

现在您可以编辑 Suricata 的配置并验证或更改接口名称。使用 vi 或您喜欢的编辑器打开 /etc/suricata/suricata.yaml 配置文件:

  1. sudo vi /etc/suricata/suricata.yaml

浏览文件直到找到约在第 580 行左右的一行,内容为 af-packet:。如果您使用 vi,您也可以直接转到该行,方法是输入 580gg。在该行下面是 Suricata 将用于检查流量的默认接口。编辑该行以匹配您的接口,就像以下示例中突出显示的示例一样:

/etc/suriata/suricata.yaml
# Linux 高速捕获支持
af-packet:
  - interface: eth0
    # 接收线程数。"auto" 使用核心数
    #threads: auto
    # 默认的 clusterid。AF_PACKET 将根据流平衡负载数据包。
    cluster-id: 99
. . .

如果您想要检查其他接口上的流量,可以添加更多的 - interface: eth... YAML 对象。例如,要添加一个名为 enp0s1 的设备,请滚动到约在第 650 行左右的 af-packet 部分的底部。要添加新接口,请将其插入到 - interface: default 部分之前,就像以下突出显示的示例一样:

/ec/suricata/suricata.yaml
    #  有關 eBPF 和 XDP 設定(包括繞過、過濾和負載平衡)的資訊,請參閱 doc/userguide/capture-hardware/ebpf-xdp.rst 
    #  取得詳細資訊。

  - interface: enp0s1
cluster-id: 98

  - interface: default
    #threads: auto
    #use-mmap: no
    #tpacket-v3: yes

請為每個 - interface 物件選擇唯一的 cluster-id 值。

請保持編輯器打開,然後繼續下一個部分,您將設定即時規則重新載入。如果您不想啟用該設定,則可以儲存並關閉 /etc/suricata/suricata.yaml 檔案。如果您使用的是 vi,則可以使用 ESC:xENTER 來儲存並退出。

設定即時規則重新載入

Suricata 支援即時規則重新載入,這意味著您可以在不需要重新啟動 Suricata 處理程序的情況下新增、移除和編輯規則。若要啟用即時重新載入選項,請捲動至組態檔案底部,並新增以下幾行:

/etc/suricata/suricata.yaml
. . .

detect-engine:
  - rule-reload: true

有了這個設定,您將能夠將 SIGUSR2 系統訊號傳送至執行中的處理程序,而 Suricata 將會重新載入任何已變更的規則至記憶體中。

A command like the following will notify the Suricata process to reload its rulesets, without restarting the process:

  1. sudo kill -usr2 $(pidof suricata)

指令的$(pidof suricata)部分會調用一個子殼層,並找到正在運行的Suricata守護程序的進程ID。指令的開頭sudo kill -usr2部分使用kill實用工具向子殼層報告的進程ID發送SIGUSR2信號。

您可以在運行suricata-update時隨時使用此指令,或在添加或編輯您自己的自定義規則時使用。

保存並關閉/etc/suricata/suricata.yaml文件。如果您使用vi,您可以按ESC,然後輸入:x並按ENTER確認。

步驟3 — 更新Suricata規則集

在本教程的這一步驟中,如果您啟動Suricata,您將收到類似以下的警告消息,說明日誌中沒有加載規則:

Output
<Warning> - [ERRCODE: SC_ERR_NO_RULES(42)] - No rule files match the pattern /var/lib/suricata/rules/suricata.rules

默認情況下,Suricata包括一組有限的檢測規則(在/etc/suricata/rules目錄中),因此此時啟動Suricata將只檢測到有限數量的惡意流量。

Suricata包含一個名為suricata-update的工具,可以從外部提供者那裡獲取規則集。請按以下方式運行它,以下載Suricata服務器的最新規則集:

  1. sudo suricata-update

您應該會收到以下類似的輸出:

Output
19/10/2021 -- 19:31:03 - <Info> -- Using data-directory /var/lib/suricata. 19/10/2021 -- 19:31:03 - <Info> -- Using Suricata configuration /etc/suricata/suricata.yaml 19/10/2021 -- 19:31:03 - <Info> -- Using /usr/share/suricata/rules for Suricata provided rules. . . . 19/10/2021 -- 19:31:03 - <Info> -- No sources configured, will use Emerging Threats Open 19/10/2021 -- 19:31:03 - <Info> -- Fetching https://rules.emergingthreats.net/open/suricata-6.0.3/emerging.rules.tar.gz. 100% - 3062850/3062850 . . . 19/10/2021 -- 19:31:06 - <Info> -- Writing rules to /var/lib/suricata/rules/suricata.rules: total: 31011; enabled: 23649; added: 31011; removed 0; modified: 0 19/10/2021 -- 19:31:07 - <Info> -- Writing /var/lib/suricata/rules/classification.config 19/10/2021 -- 19:31:07 - <Info> -- Testing with suricata -T. 19/10/2021 -- 19:31:32 - <Info> -- Done.

突出顯示的行表示 suricata-update 已經獲取了免費的 Emerging Threats ET Open Rules,並將它們保存到 Suricata 的 /var/lib/suricata/rules/suricata.rules 文件中。 它還顯示了處理的規則數量,在這個例子中,共添加了 31011 個規則,其中 23649 個已啟用。

添加規則集提供者

suricata-update 工具可以從各種免費和商業規則集提供者那裡獲取規則。 一些規則集,如您已經添加的 ET Open 設置,可以免費使用,而其他一些則需要付費訂閱。

您可以使用以下方式的 list-sources 標誌來列出默認的規則提供者,像這樣:

  1. sudo suricata-update list-sources

您將收到類似以下的源列表:

Output
. . . 19/10/2021 -- 19:27:34 - <Info> -- Adding all sources 19/10/2021 -- 19:27:34 - <Info> -- Saved /var/lib/suricata/update/cache/index.yaml Name: et/open Vendor: Proofpoint Summary: Emerging Threats Open Ruleset License: MIT . . .

例如,如果您想要包含 tgreen/hunting 規則集,您可以使用以下命令啟用它:

  1. sudo suricata-update enable-source tgreen/hunting

然後再次運行 suricata-update,新的規則集將被添加,除了現有的 ET Open 規則和您已下載的其他任何規則。

第四步 — 驗證 Suricata 的配置

現在您已經編輯了 Suricata 的配置文件,包括可選的社區 ID,在指定了默認的網絡接口並啟用了實時規則重新加載之後,最好測試一下配置。

Suricata 具有內置的測試模式,將檢查配置文件和任何包含的規則是否有效。使用 -T 標誌運行 Suricata 以測試模式來驗證您在前一部分中所做的更改。-v 標誌將打印一些附加信息,-c 標誌告訴 Suricata 在哪裡找到其配置文件:

  1. sudo suricata -T -c /etc/suricata/suricata.yaml -v

測試可能需要一些時間,具體取決於您為 Suricata 分配的 CPU 數量以及您添加的規則數量,所以請準備等待一兩分鐘以完成測試。

使用默認的 ET Open 規則集,您應該會收到以下類似的輸出:

Output
21/10/2021 -- 15:00:40 - <Info> - Running suricata under test mode 21/10/2021 -- 15:00:40 - <Notice> - This is Suricata version 6.0.3 RELEASE running in SYSTEM mode 21/10/2021 -- 15:00:40 - <Info> - CPUs/cores online: 2 21/10/2021 -- 15:00:40 - <Info> - fast output device (regular) initialized: fast.log 21/10/2021 -- 15:00:40 - <Info> - eve-log output device (regular) initialized: eve.json 21/10/2021 -- 15:00:40 - <Info> - stats output device (regular) initialized: stats.log 21/10/2021 -- 15:00:46 - <Info> - 1 rule files processed. 23879 rules successfully loaded, 0 rules failed 21/10/2021 -- 15:00:46 - <Info> - Threshold config parsed: 0 rule(s) found 21/10/2021 -- 15:00:47 - <Info> - 23882 signatures processed. 1183 are IP-only rules, 4043 are inspecting packet payload, 18453 inspect application layer, 107 are decoder event only 21/10/2021 -- 15:01:13 - <Notice> - Configuration provided was successfully loaded. Exiting. 21/10/2021 -- 15:01:13 - <Info> - cleaning up signature grouping structure... complete

如果您的配置文件中存在錯誤,那麼測試模式將生成特定的錯誤代碼和消息,您可以使用這些信息來幫助進行故障排除。例如,包含一個不存在的名為 test.rules 的規則文件將生成以下錯誤:

Output
21/10/2021 -- 15:10:15 - <Info> - Running suricata under test mode 21/10/2021 -- 15:10:15 - <Notice> - This is Suricata version 6.0.3 RELEASE running in SYSTEM mode 21/10/2021 -- 15:10:15 - <Info> - CPUs/cores online: 2 21/10/2021 -- 15:10:15 - <Info> - eve-log output device (regular) initialized: eve.json 21/10/2021 -- 15:10:15 - <Info> - stats output device (regular) initialized: stats.log 21/10/2021 -- 15:10:21 - <Warning> - [ERRCODE: SC_ERR_NO_RULES(42)] - No rule files match the pattern /var/lib/suricata/rules/test.rules

有了這個錯誤,您可以編輯您的配置文件以包含正確的路徑,或者修正無效的變量和配置選項。

一旦你的 Suricata 測試模式運行成功,你就可以進入下一步,也就是啟動 Suricata 的守護進程模式。

步驟 5 — 執行 Suricata

現在你有了有效的 Suricata 配置和規則集,你可以啟動 Suricata 伺服器。執行以下 systemctl 命令:

  1. sudo systemctl start suricata.service

你可以使用 systemctl status 命令來檢查服務的狀態:

  1. sudo systemctl status suricata.service

你應該會收到如下的輸出:

Output
● suricata.service - Suricata Intrusion Detection Service Loaded: loaded (/usr/lib/systemd/system/suricata.service; enabled; vendor preset: disabled) Active: active (running) since Thu 2021-10-21 18:22:56 UTC; 1min 57s ago Docs: man:suricata(1) Process: 24588 ExecStartPre=/bin/rm -f /var/run/suricata.pid (code=exited, status=0/SUCCESS) Main PID: 24590 (Suricata-Main) Tasks: 1 (limit: 23473) Memory: 80.2M CGroup: /system.slice/suricata.service └─24590 /sbin/suricata -c /etc/suricata/suricata.yaml --pidfile /var/run/suricata.pid -i eth0 --user suricata Oct 21 18:22:56 suricata systemd[1]: Starting Suricata Intrusion Detection Service.. Oct 21 18:22:56 suricata systemd[1]: Started Suricata Intrusion Detection Service. . . .

與測試模式命令一樣,Suricata 將需要一兩分鐘來加載和解析所有規則。你可以使用 tail 命令來觀察 Suricata 日誌中特定消息,指示它已完成啟動:

  1. sudo tail -f /var/log/suricata/suricata.log

你會收到許多行的輸出,而終端可能會看起來卡住,而 Suricata 加載。繼續等待輸出,直到收到如下的一行:

Output
19/10/2021 -- 19:22:39 - <Info> - All AFP capture threads are running.

這行表示 Suricata 已經運行並準備好檢查流量了。你可以使用 CTRL+C 退出 tail 命令。

現在你已經驗證了 Suricata 是否運行,這個教程的下一步是檢查 Suricata 是否檢測到一個設計來生成警報的測試 URL 的請求。

步驟 6 — 測試 Suricata 規則

你下載的 ET Open 規則集包含超過 30000 條規則。如何使用 Suricata 規則以及如何構建它們的完整說明超出了這個入門教程的範圍。本系列的後續教程將解釋規則的工作原理以及如何構建您自己的規則。

對於這個教程的目的來說,測試 Suricata 是否能夠檢測到懷疑的流量並使用您生成的配置是足夠的。Suricata 快速入門建議使用 curl 命令測試 ET Open 規則的編號 2100498

執行以下命令以生成一個 HTTP 請求,該請求將返回與 Suricata 的警報規則匹配的響應:

  1. curl http://testmynids.org/uid/index.html

這個 curl 命令將輸出如下響應:

Output
uid=0(root) gid=0(root) groups=0(root)

這個示例響應數據被設計成觸發警報,假裝返回像是透過網絡外殼在受影響的遠程系統上運行的 id 這樣的命令的輸出。

現在你可以檢查 Suricata 的日誌是否有相應的警報。默認情況下啟用了兩個日誌。第一個位於 /var/log/suricata/fast.log,第二個是位於 /var/log/suricata/eve.log 的機器可讀取日誌。

檢查 /var/log/suricata/fast.log

要在 /var/log/suricata/fast.log 中檢查與您的 curl 請求對應的日誌條目,請使用 grep 命令。使用快速入門文檔中的 2100498 規則識別符,使用以下命令搜索匹配它的條目:

  1. grep 2100498 /var/log/suricata/fast.log

如果您的請求使用了 IPv6,那麼您應該會收到以下類似的輸出,其中 2001:DB8::1 是您系統的公共 IPv6 地址:

Output
10/21/2021-18:35:54.950106 [**] [1:2100498:7] GPL ATTACK_RESPONSE id check returned root [**] [Classification: Potentially Bad Traffic] [Priority: 2] {TCP} 2600:9000:2000:4400:0018:30b3:e400:93a1:80 -> 2001:DB8::1:34628

如果您的請求使用了 IPv4,那麼您的日誌應該會有類似以下的消息,其中 203.0.113.1 是您系統的公共 IPv4 地址:

Output
10/21/2021-18:35:57.247239 [**] [1:2100498:7] GPL ATTACK_RESPONSE id check returned root [**] [Classification: Potentially Bad Traffic] [Priority: 2] {TCP} 204.246.178.81:80 -> 203.0.113.1:36364

請注意輸出中突出顯示的 2100498 值,這是 Suricata 用於識別規則的簽名 ID(sid)。

檢查 /var/log/suricata/eve.log

Suricata 還使用 JSON 格式將事件記錄到 /var/log/suricata/eve.log(別名為 EVE 日誌)。

Suricata文件中的條目建議使用jq工具來讀取和過濾。如果您的系統沒有安裝jq,請使用以下dnf命令安裝:

  1. sudo dnf install jq

安裝了jq後,您可以使用以下命令通過搜索2100498簽名來過濾EVE日誌中的事件:

  1. jq 'select(.alert .signature_id==2100498)' /var/log/suricata/eve.json

該命令檢查每個JSON條目,並打印任何具有與您搜索的2100498值匹配的alert對象的signature_id鍵。輸出將類似於以下內容:

Output
{ "timestamp": "2021-10-21T19:42:47.368856+0000", "flow_id": 775889108832281, "in_iface": "eth0", "event_type": "alert", "src_ip": "203.0.113.1", "src_port": 80, "dest_ip": "147.182.148.159", "dest_port": 38920, "proto": "TCP", "community_id": "1:vuSfAFyy7oUq0LQC5+KNTBSuPxg=", "alert": { "action": "allowed", "gid": 1, "signature_id": 2100498, "rev": 7, "signature": "GPL ATTACK_RESPONSE id check returned root", "category": "Potentially Bad Traffic", . . . }

請注意突出顯示的"signature_id": 2100498,行,這是jq正在搜索的鍵。還請注意JSON輸出中突出顯示的"community_id": "1:vuSfAFyy7oUq0LQC5+KNTBSuPxg=",行。此鍵是您在Suricata配置文件中啟用的生成的Community Flow識別符。

每個警報將生成一個唯一的Community Flow識別符。其他NMS工具也可以生成相同的識別符,以便將Suricata警報與其他工具的輸出進行交叉參考。

A matching log entry in either log file means that Suricata successfully inspected the network traffic, matched it against a detection rule, and generated an alert for subsequent analysis or logging. A future tutorial in this series will explore how to send Suricata alerts to a Security Information Event Management (SIEM) system for further processing.

步驟7 — 處理Suricata警報

一旦您設置並測試了警報,您可以選擇如何處理它們。對於某些用例,記錄警報以進行審計可能已經足夠;或者您可能更喜歡採取更主動的方法來阻止產生重複警報的系統的流量。

如果您想要根據Suricata生成的警報來阻止流量,一種方法是使用EVE日誌中的條目,然後添加防火牆規則以限制對系統的訪問。您可以使用jq工具從警報中提取特定字段,然後添加UFW或IPtables規則來阻止請求。

同樣,此示例是一個假設性的場景,使用故意製作的請求和響應數據。您對您的環境應該能夠訪問的系統和協議的了解至關重要,以確定哪些流量是合法的,哪些可以被阻止。

結論

在本教程中,您從OISF軟件存儲庫安裝了Suricata。以這種方式安裝Suricata可以確保您在Suricata推出新版本時可以收到更新。安裝Suricata後,您編輯了默認配置以添加用於其他安全工具的Community Flow ID。您還啟用了實時規則重新加載,並下載了初始的一組規則。

一旦您驗證了Suricata的配置,就開始了進程並生成了一些測試的HTTP流量。您驗證了Suricata能夠通過檢查兩個默認日誌來檢測可疑流量,以確保它們包含了與您測試的規則相對應的警報。

有關Suricata的更多信息,請訪問官方Suricata網站。有關您在本教程中配置的任何配置選項的更多詳細信息,請參閱Suricata用戶指南

現在您已安裝並配置了Suricata,可以繼續閱讀本系列教程中的下一篇教程了解Suricata簽名,在其中您將探索如何編寫自己的定製Suricata規則。您將學習不同的創建警報的方法,甚至根據無效的TCP/IP封包、DNS查詢的內容、HTTP請求和響應,甚至TLS握手等標準,來丟棄流量。

Source:
https://www.digitalocean.com/community/tutorials/how-to-install-suricata-on-centos-8-stream