如何在Linux上安裝Suricata入侵檢測系統?
譯文【51CTO.com快譯】由于安全威脅持續不斷,配備入侵檢測系統(IDS)已成為如今數據中心環境下最重要的要求之一。然而,隨著越來越多的服務器將網卡升級到10GB/40GB以太網技術,我們越來越難在大眾化硬件上以線速實施計算密集型入侵檢測。擴展IDS性能的一個方法就是使用多線程IDS。在這種IDS下,大量耗用CPU資源的深度數據包檢查工作負載并行化處理,分成多個并發任務。這種并行化檢查機制可以充分發揚多核硬件的優勢,輕松擴展IDS的處理能力。這方面的兩個知名的開源工具就是Suricata(http://suricata-ids.org)和Bro(https://www.bro.org)。
我在本教程中將演示如何在Linux服務器上安裝和配置Suricata IDS。
在Linux上安裝Suricata IDS
不妨用源代碼構建Suricata。你先要安裝幾個所需的依賴項,如下所示。
在Debian、Ubuntu或Linux Mint上安裝依賴項
$ sudo apt-get install wget build-essential libpcre3-dev libpcre3-dbg automake autoconf libtool libpcap-dev libnet1-dev libyaml-dev zlib1g-dev libcap-ng-dev libjansson-dev
在CentOS、Fedora或RHEL上安裝依賴項
$ sudo yum install wget libpcap-devel libnet-devel pcre-devel gcc-c++ automake autoconf libtool make libyaml-devel zlib-devel file-devel jansson-devel nss-devel
一旦你安裝了所有必需的程序包,現在可以安裝Suricata了,如下所示。
首先,從http://suricata-ids.org/download/下載最新的Suricata源代碼,編譯代碼。截至本文撰稿時,最新版本是2.0.8。
$ wget http://www.openinfosecfoundation.org/download/suricata-2.0.8.tar.gz $ tar -xvf suricata-2.0.8.tar.gz $ cd suricata-2.0.8 $ ./configure --sysconfdir=/etc --localstatedir=/var
這是配置的示例輸出結果。
Suricata Configuration:
AF_PACKET support: yes
PF_RING support: no
NFQueue support: no
NFLOG support: no
IPFW support: no
DAG enabled: no
Napatech enabled: no
Unix socket enabled: yes
Detection enabled: yeslibnss support: yes
libnspr support: yes
libjansson support: yes
Prelude support: no
PCRE jit: yes
LUA support: no
libluajit: no
libgeoip: no
Non-bundled htp: no
Old barnyard2 support: no
CUDA enabled: no
現在編譯并安裝它。
$ make $ sudo make install
Suricata源代碼隨帶默認的配置文件。不妨安裝這些默認的配置文件,如下所示。
$ sudo make install-conf
正如你所知,要是沒有IDS規則集,Suricata毫無用處。頗為方便的是,Makefile隨帶IDS規則安裝選項。想安裝IDS規則,運行下面這個命令即可。
$ sudo make install-rules
上述規則安裝命令會從EmergingThreats.net(https://www.bro.org)安裝可用的社區規則集的最新快照,并將它們存儲在/etc/suricata/rules下。
首次配置Suricata IDS
現在就可以配置Suricata了。配置文件位于/etc/suricata/suricata.yaml。使用文本編輯工具打開文件,以便編輯。
$ sudo vi /etc/suricata/suricata.yaml
下面是一些基本的設置,供你開始入門。
“default-log-dir”關鍵字應該指向Suricata日志文件的位置。
default-log-dir: /var/log/suricata/
在“vars”這部分下面,你會找到Suricata使用的幾個重要變量。“HOME_NET”應該指向由Suricata檢查的本地網絡。“!$HOME_NET”(被分配給EXTERNAL_NET)指本地網絡以外的任何網絡。“XXX_PORTS”表明不同服務所使用的一個或多個端口號。請注意:不管使用哪個端口, Suricata都能自動檢測HTTP流量。所以,正確指定HTTP_PORTS變量并不是很重要。
vars: HOME_NET: "[192.168.122.0/24]" EXTERNAL_NET: "!$HOME_NET" HTTP_PORTS: "80" SHELLCODE_PORTS: "!80" SSH_PORTS: 22
“host-os-policy”這部分用來防范一些利用操作系統的網絡堆棧的行為(比如TCP重組)來規避檢測的常見攻擊。作為一項應對措施,現代IDS想出了所謂的“基于目標的”檢測,檢查引擎根據流量的目標操作系統,對檢測算法進行微調。因而,如果你知道每個本地主機運行什么操作系統,就可以將該信息提供給Suricata,從而有望提高其檢測速度。這時候用到了“host-os-policy“部分。在該例子中,默認的IDS策略是Linux;如果不知道某個IP地址的操作系統信息,Suricata就會運用基于Linux的檢查策略。如果捕獲到192.168.122.0/28和192.168.122.155的流量,Suricata就會運用基于Windows的檢查策略。
host-os-policy: # 這些是Windows機器。 windows: [192.168.122.0/28, 192.168.122.155] bsd: [] bsd-right: [] old-linux: [] # 將Linux作為默認策略。 linux: [0.0.0.0/0] old-solaris: [] solaris: ["::1"] hpux10: [] hpux11: [] irix: [] macos: [] vista: [] windows2k3: []
在“threading”這部分下面,你可以為不同的Suricata線程指定CPU親和性(CPU affinity)。默認情況下,CPU親和性被禁用(“set-cpu-affinity: no”),這意味著Suricata線程將被安排在任何可用的CPU核心上。默認情況下,Suricata會為每個CPU核心創建一個“檢測”線程。你可以調整這個行為,只要指定“detect-thread-ratio: N”。這會創建N x M個檢測 線程,其中M是指主機上CPU核心的總數。
threading: set-cpu-affinity: no detect-thread-ratio: 1.5
就上述線程設置而言,Suricata會創建1.5 x M個檢測線程,其中M是系統上CPU核心的總數。
想了解關于Suricata配置的更多信息,你可以閱讀默認的配置文件本身,為了便于理解,加有大量注釋。
使用Suricata執行入侵檢測
現在可以試著運行Suricata了。在啟動它之前,還有一個步驟要完成。
如果你使用pcap捕獲模式,強烈建議關閉Suricata偵聽的那個網卡上的任何數據包卸載功能(比如LRO/GRO),因為那些功能可能會干擾數據包實時捕獲。
下面介紹如何關閉網絡接口eth0上的LRO/GRO:
$ sudo ethtool -K eth0 gro off lro off
請注意:視使用的網卡而定,你可能會看到下列警示信息,可以忽視這個信息。它只是意味著你的網卡不支持LRO。
Cannot change large-receive-offload
Suricata支持多種運行模式。運行模式決定了不同的線程如何用于IDS。下面這個命令列出了所有可用的運行模式。
$ sudo /usr/local/bin/suricata --list-runmodes
Suricata使用的默認運行模式是autofp(代表“自動流綁定負載均衡模式”)。在這種模式下,來自每一路流的數據包被分配給單一的檢測線程。流被分配給了未處理數據包數量最少的線程。
最后,不妨啟動Suricata,看看它的實際運行情況。
$ sudo /usr/local/bin/suricata -c /etc/suricata/suricata.yaml -i eth0 --init-errors-fatal
在這個例子中,我們監控一個8核系統上的網絡接口eth0。如上所示,Suricata創建了13個數據包處理線程和3個管理線程。數據包處理線程包括1個PCAP數據包捕獲線程和12個檢測線程(相當于8 x 1.5)。這意味著,一個捕獲線程捕獲的數據包經負載均衡處理后,變成了IDS面前的12個檢測線程。管理線程是一個流管理器和兩個計數器/統計相關線程。
下面是Suricata進程的線程視圖(由htop描繪)。
Suricata檢測日志存儲在/var/log/suricata目錄下。
$ tail -f /var/log/suricata/fast.log 04/01/2015-15:47:12.559075 [**] [1:2200074:1] SURICATA TCPv4 invalid checksum [**] [Classification: (null)] [Priority: 3] {TCP} 172.16.253.158:22 -> 172.16.253.1:46997 04/01/2015-15:49:06.565901 [**] [1:2200074:1] SURICATA TCPv4 invalid checksum [**] [Classification: (null)] [Priority: 3] {TCP} 172.16.253.158:22 -> 172.16.253.1:46317 04/01/2015-15:49:06.566759 [**] [1:2200074:1] SURICATA TCPv4 invalid checksum [**] [Classification: (null)] [Priority: 3] {TCP} 172.16.253.158:22 -> 172.16.253.1:46317
為了易于導入,還有JSON格式的日志:
$ tail -f /var/log/suricata/eve.json
{"timestamp":"2015-04-01T15:49:06.565901","event_type":"alert","src_ip":"172.16.253.158","src_port":22,"dest_ip":"172.16.253.1","dest_port":46317,"proto":"TCP","alert":{"action":"allowed","gid":1,"signature_id":2200074,"rev":1,"signature":"SURICATA TCPv4 invalid checksum","category":"","severity":3}}
{"timestamp":"2015-04-01T15:49:06.566759","event_type":"alert","src_ip":"172.16.253.158","src_port":22,"dest_ip":"172.16.253.1","dest_port":46317,"proto":"TCP","alert":{"action":"allowed","gid":1,"signature_id":2200074,"rev":1,"signature":"SURICATA TCPv4 invalid checksum","category":"","severity":3}}
結束語
我在本教程中演示了如何在多核Linux服務器上安裝一個Suricata IDS。不像單線程Snort IDS,Suricata輕松就能得益于采用多線程技術的多核硬件。想最大限度地提高性能、擴大檢測覆蓋范圍,Suricata方面需要進行大量的定制工作。Suricata人員精心維護在線維基(https://redmine.openinfosecfoundation.org/projects/suricata/wiki),如果你想把Suricata部署在自己的環境中,我強烈建議你認真看一下。
你目前在使用Suricata嗎?如果是的話,歡迎交流經驗和心得!
英文:How to install Suricata intrusion detection system on Linux
【51CTO譯稿,合作站點轉載請注明原文譯者和出處為51CTO.com】