Suricata配置文件說明

本系列文章是Suricata官方文檔的翻譯加上本身對其的理解,部分圖片也是來自那篇文章,固然因爲初學,不少方面的理解不夠透徹,隨着深刻後面會對本文進行必定的修正和完善。git

Suricata使用Yaml做爲其配置文件的格式,關於Yaml能夠參考YAML-維基百科。 其中Suricata默認的配置文件是suricata.yaml,以硬編碼的形式寫在源代碼中,固然也能夠在執行的時候添加-c+指定位置的yaml文 件來自定義配置文件。配置文件的第一行內容是%YAML 1.1表示其使用了Yaml 1.1的語法。因爲配置項較多,所以將分爲多篇文章來進行說明,本文是第一篇。github

max-pending-packets

該選項設置了suricata可以同時處理的數據包的數量,最少爲1,最大值取決於內存的大小,更大的內存能夠設置更大的值並擁有更好的性能,默認值是1024。可是官方文檔中並無指出其數量與內存之間的具體關係。設置格式爲:算法

max-pending-packets: 1024
  • 1

runmodes

該選項設置了suricata的運行方式,使用命令./suricata --list-runmodes能夠查看全部的運行方式,部分截圖以下:sql

這裏寫圖片描述

在介紹運行方式(Runmodes)以前首先了解一下suricata的基本組成。Suricata是由所謂的線程(threads)、線程模塊 (thread-modules)和隊列(queues)組成。Suricata是一個多線程的程序,所以在同一時刻會有多個線程在工做。線程模塊是依據 功能來劃分的,好比一個模塊用於解析數據包,另外一個模塊用於檢測數據包等。每一個數據包可能會有多個不一樣的線程進行處理,隊列就是用於將數據包從一個線程傳 遞到另外一個線程。與此同時,一個線程能夠擁有多個線程模塊,可是在某一時刻只有一個模塊在運行(原文是If they have more modules, they can only be active on a a time.看不大懂,感受是這個意思)。數據庫

Suricata的運行方式就是上面介紹的線程(threads)、線程模塊(thread-modules)和隊列(queues)三種元素的不 同組合方式。上圖中的RunMode Type並非配置文件中的runmodes選項,而是後面的Custom Mode也就是自定義模式才能夠在此處設置。好比默認的Runmodes是autofp,在線實時檢測流量的模式中其結構以下,單線程模塊獲取數據包和解 碼,多線程模塊檢測,單模塊輸出:json

這裏寫圖片描述

而在pfring模式下的autofp則有所不一樣,能夠看到它有多個模塊獲取及解碼數據包,經過流綁定隊列分配到多個檢測模塊中進行檢測,這應該是pfring模式獲取數據包效率更高的緣由:ruby

這裏寫圖片描述

default-packet-size

以前的max-pending-packets選項設置了最多同時處理的數據包數量,這些同時處理的數據包都是須要存儲在內存中的,因此須要對每一個 數據包的大小進行限制,而當前選項就是作這個事的。雖然有時候可能須要檢測較大的數據包,可是大部分狀況下爲了性能仍是須要作出必定的限制。其配置方式如 下,默認值是1514,這也是TCP數據包的最大長度(當數據超過這個長度便會使用TCP報文重組技術):服務器

default-packet-size: 1514
  • 1

user and group

用於設置啓動suricata的用戶及其分組。markdown

action-order

action指的是每條規則匹配時須要執行的操做,好比下面這條規則執行alert警告操做:網絡

這裏寫圖片描述

而當前字段設置的是多條規則同時匹配的時候的執行順序。action共有四種:pass、drop、reject、alert。

pass指的是處理的數據包匹配當前規則時直接跳事後面的全部規則,也就是說不匹配後面的規則
drop只能工做在IPS模式下,當數據包匹配到drop的規則時則會被丟棄而且產生一個警告 reject會給數據包的發送和接收端都發生一個拒絕的數據包,若是本來的協議是TCP,則發生reset數據包,不然發送ICMP錯誤的數據包,同時產生一個警告。在IPS模式下也會丟棄匹配到的數據包 alert則對發送和接收者都沒有影響,只會生成一個警告
  • 1
  • 2
  • 3
  • 4

Suricata按照規則的出現順序依次加載,可是處理的順序則根據配置文件中設置的action重要程度來排列。默認的順序以下,表示當一個數據包匹配多條規則時,優先處理的是pass的規則,其次是drop,而後是reject,最後是alert:

action-order: 
 - pass - drop - reject - alert
  • 1
  • 2
  • 3
  • 4
  • 5

Splitting configuration in multiple files

標題並非關鍵字,而是指一個配置文件能夠按照功能分割成多個文件,這樣後面修改某一方面的配置就能夠到指定的配置文件中修改,一樣能夠增長可讀性。配置文件經過include進行包含,好比outputs.yaml:

# outputs.yaml - fast enabled: yes filename: fast.log append: yes - unified2-alert: enabled: yes ...
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

主配置文件以下:

# suricata.yaml ... outputs: !include outputs.yaml ...
  • 1
  • 2
  • 3
  • 4

default-log-dir

Suricata默認的日誌存儲目錄是/var/log/suricata,在配置文件中能夠經過當前選項指定,好比程序目錄下的log文件夾,也能夠在運行時的-l參數指定:

default-log-dir:./log
  • 1

outputs

outputs選項下有不少能夠輸出的配置選項,包括警告、檢測的數據包、產生的結果等。在配置的過程當中並不須要開啓每一種輸出,根據本身的需求進行配置。

警告輸出(fast.log)

這個日誌輸出由單行的警告信息組成,好比下面這個輸出例子由四個警告組成:

這裏寫圖片描述

其配置以下:

# a line based alerts log similar to Snort's fast.log - fast: enabled: yes filename: fast.log append: yes
  • 1
  • 2
  • 3
  • 4
  • 5

事件輸出(eve.log)

Suricata能夠在匹配一條規則後記錄一條信息,該條信息包括數據包的時間戳、五元組信息、對應的簽名信息等,默認存儲在日誌目錄下的 eve.log文件中。下面是幾條典型的eve日誌,這些日誌是json格式的,所以不少其餘的程序能夠對其進行處理產生進一步的輸出:

這裏寫圖片描述

能夠對其進行以下配置,輸出的類型能夠多種多樣,包括文件、系統日誌、輸出到socket等,輸出的內容能夠包括匹配到有alert、http、 dns等規則的數據包信息。簡單的說好比一條規則的action是alert,檢測到有一個數據包匹配這條規則,那數據包和規則的信息則會儲存到事件日誌 中:

# Extensible Event Format (nicknamed EVE) event log in JSON format - eve-log: enabled: yes type: file #file|syslog|unix_dgram|unix_stream filename: eve.json # the following are valid when type: syslog above #identity: "suricata" #facility: local5 #level: Info ## possible levels: Emergency, Alert, Critical, ## Error, Warning, Notice, Info, Debug types: - alert - http: extended: yes # enable this for extended logging information - dns - tls: extended: yes # enable this for extended logging information - files: force-magic: no # force logging magic on all logged files force-md5: no # force logging of md5 checksums #- drop - ssh
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

固然也能夠把不一樣類別的信息輸出到不一樣的日誌文件中,以下配置代表alert和drop輸出到eve-ips.json,http等協議輸出到eve-nsm.json:

outputs:
  - eve-log: enabled: yes type: file filename: eve-ips.json types: - alert - drop - eve-log: enabled: yes type: file filename: eve-nsm.json types: - http - dns - tls
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

還有一些其餘的輸出方法及格式能夠參考EveJSONFormat

數據包輸出(unified2.alert)

當suricata檢測到一個可疑的數據包時即可以將整個數據包以二進制的方式存儲到文件中,目前已經支持了IPv4和IPv6的數據包。其輸出的格式能夠被Barnyard2 (參考網頁)程序處理,這是一個用於將suricata輸出的包存儲到數據庫中的程序,能夠配合
Sguil(參考網頁)進行對網絡流量的實時監控和輸出。通常上的配置格式以下,因爲這裏對每一個文件的大小有32M的限制,因此在文件大於這個值時便會新建一個文件繼續存儲:

- unified2-alert: #The log-name. enabled: yes #This log is enabled. Set 'no' to disable. filename: unified2.alert #The name of the file in the default logging directory. limit: 32mb #The file size limit in megabytes. 
  • 1
  • 2
  • 3
  • 4

在這個選項裏還有一個X-Forwarded-For功能,這個功能是用來記錄通過多個HTTP代理服務器以後真正的客戶端IP地址,而不是代理服 務器的IP地址,HTTP協議會在頭裏面加入一個X-Forwarded-For字段以記錄原始IP以及通過的每一個代理服務器的IP,詳細可參考X-Forwarded-For-維基百科,不管是在客戶端的代理仍是服務端的反向代理(百度百科)都很是有用,默認是關閉的:

# HTTP X-Forwarded-For support by adding the unified2 extra header that # will contain the actual client IP address or by overwriting the source # IP address (helpful when inspecting traffic that is being reversed # proxied). xff: enabled: no # Two operation modes are available, "extra-data" and "overwrite". Note # that in the "overwrite" mode, if the reported IP address in the HTTP # X-Forwarded-For header is of a different version of the packet # received, it will fall-back to "extra-data" mode. mode: extra-data # Header name were the actual IP address will be reported, if more than # one IP address is present, the last IP address will be the one taken # into consideration. header: X-Forwarded-For
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

HTTP日誌(http.log)

HTTP日誌會記錄全部的HTTP流量信息,包含了http請求、HOST字段、URI字段和User-Agent字段,這裏是普通的輸出,除此之 外也能夠在eve-log中指定http以便輸出json格式的內容。另外也能夠設置是否擴展以輸出更多的信息,未擴展時輸出的內容:

07/01/2014-04:20:14.338309 vg.no [**] / [**] Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.114 Safari/537.36 [**] 192.168.1.6:64685 -> 195.88.54.16:80
  • 1
  • 2
  • 3

擴展以後輸出的內容:

07/01/2014-04:21:06.994705 vg.no [**] / [**] Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.114 Safari/537.36 [**] <no referer> [**] GET [**] HTTP/1.1 [**] 301 => http://www.vg.no/ [**] 239 bytes [**] 192.168.1.6:64726 -> 195.88.54.16:80
  • 1
  • 2
  • 3

關於此項的配置以下,擴展選項默認關閉,用戶還能夠經過customformat來自定義輸出的格式,同時也能夠配置輸出到socket文件:

- http-log:                     #The log-name.
    enabled: yes                #This log is enabled. Set 'no' to disable. filename: http.log #The name of the file in the default logging directory. append: yes/no #If this option is set to yes, the last filled http.log-file will not be # overwritten while restarting Suricata. #extended: yes # If set to yes more information is written about the event. #custom: yes # enabled the custom logging format (defined by customformat) #customformat: "%{%D-%H:%M:%S}t.%z %{X-Forwarded-For}i %H %m %h %u %s %B %a:%p -> %A:%P" #filetype: regular # 'regular', 'unix_stream' or 'unix_dgram'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

還有一個存儲DNS流量的配置,與HTTP的相似,就不作過多解釋了。

數據包日誌(pcap-log)

經過pcap-log選項能夠保存全部的數據包,這樣在檢測到問題數據包時就能更容易地找到以前的流量以便對整個事件進行確認和分析。基本配置如 下,與以前的HTTP日誌同樣,pcap文件也是能夠限定大小和文件數的,當一個文件達到限制的大小時便會建立一個新文件,同時這裏還有文件數量的限制:

- pcap-log: 
    enabled:  yes 
    filename: log.pcap 

    # Limit in MB. 
    limit: 32mb
    # If set to a value will enable ring buffer mode. Will keep Maximum of "max-files" of size "limit" max-files: 2000 mode: normal # "normal" (default) or sguil. #sguil_base_dir: /nsm_data/ #ts-format: usec # sec or usec second format (default) is filename.sec usec is filename.sec.usec use-stream-depth: no #If set to "yes" packets seen after reaching stream inspection depth are ignored. "no" logs all packets
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

配置中的mode有兩種狀況,一個是普通的normal,會將文件存儲在以前指定的日誌存儲目錄,而sguil模式則須要sguil_base_dir選項指定目錄,而且存儲的文件按照日期劃分目錄,並加上時間戳:

$sguil-base-dir/YYYY-MM-DD/$filename.<timestamp>
  • 1

最後一個use-stream-depth選項,若是設爲「yes」只會存儲不大於stream.reassembly.depth長度的數據,後面的將會捨棄(在一個stream中),「no」則會存儲全部的數據包。

詳細的警告日誌(alert-debug.log)

若是開啓這一選項,suricata會記錄每個警告產生的詳細信息,包括數據包、規則等各類信息。一個典型的輸出以下所示,這些信息可使得維護人員更快的排除誤報、檢查規則的問題等:

這裏寫圖片描述

雖然這個功能很是有用,可是在生產環境中啓動並非一個明智的行爲,它會在檢測流時處理和輸出大量的信息,致使性能有很大的降低,所以默認的配置是不開啓的:

- alert-debug:                  #The log-name. enabled: no #This log is not enabled. Set 'yes' to enable. filename: alert-debug.log #The name of the file in the default logging directory. append: yes/no #If this option is set to yes, the last filled fast.log-file will not be # overwritten while restarting Suricata. 
  • 1
  • 2
  • 3
  • 4
  • 5

Syslog

這個選項決定了是否將suricata的警告輸出到syslog文件中,配置以下:

- syslog: #This is a output-module to direct log-output to several directions. enabled: no #The use of this output-module is not enabled. facility: local5 #In this option you can set a syslog facility. level: Info #In this option you can set the level of output. The possible levels are: #Emergency, Alert, Critical, Error, Warning, Notice, Info and Debug.
  • 1
  • 2
  • 3
  • 4
  • 5

能夠看到syslog選項默認是關閉的,若是開啓,facility字段表示產生日誌的分類爲local5。關於syslog日誌處理系統的更多信息能夠參考Syslog-維基百科

Drop.log

當suricata工做在IPS模式下的時候,可使用drop操做的規則,這些drop掉的數據包信息就會存儲在drop.log文件中,配置以下:

- drop: enabled: yes #The option is enabled. filename: drop.log #The log-name of the file for dropped packets. append: yes #If this option is set to yes, the last filled drop.log-file will not be #overwritten while restarting Suricata. If set to 'no' the last filled drop.log file will be overwritten.
  • 1
  • 2
  • 3
  • 4
  • 5

檢測引擎相關配置

detect-engine

Suricata在對流量檢測以前須要將全部的規則簽名加載到內存,而數據包在匹配規則時並不須要匹配全部的規則,事實上大量的規則是徹底不必匹 配的,好比當前數據包時基於UDP協議的,那TCP的全部規則都是沒有必要匹配的。所以須要根據必定的依據對全部的規則進行分組,這樣數據包只須要與符合 條件的分組內的全部規則進行匹配便可。而須要如何分組則是一個關鍵的問題。

下面是detect-engine的一種配置。profile選項有high、low和medium三種。high表示分組較多,可是會佔用更多的 內存,性能也會更好;low則正好相反,佔用更少的內存,性能也相對較差;medium是默認配置,是性能和內存使用的折中選擇。除此以外高級用戶能夠在 custom-values字段自定義分組的配置,以下是根據數據包來源、源地址、目的地址、源端口、目的端口來進行分組,這些數字能夠根據實際須要的性 能和需求進行調整:

detect-engine: -profile: medium #The balance between performance and memory usage. This is the default setting. - custom-values: toclient_src_groups: 2 toclient_dst_groups: 2 toclient_sp_groups: 2 toclient_dp_groups: 3 toserver_src_groups: 2 toserver_dst_groups: 4 toserver_sp_groups: 2 toserver_dp_groups: 25 - sgh-mpm-context: auto - inspection-recursion-limit: 3000
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

數據包檢測規則的分組圖能夠看得更清楚:

這裏寫圖片描述

接下來是sgh-mpm-context,這個字段指明MPM算法使用的content是否公用。當其值爲auto時,是否公用取決於配置文件中指 定MPM的算法,若爲ac或ac-gfbs,則使用single模式,表示全部的規則分組使用單個MPM-content,其他算法則使用full模式, 每一個分組擁有本身的MPM-content。而當sgh-mpm-context字段的值爲single或full時則不受MPM算法的影響。關於 suricata的MPM機制能夠參考fast_parttern,後面的配置也會作進一步的說明。

最後的inspection-recursion-limit則是爲了減小suricata的出錯次數,由於網絡流量情況很是複雜,suricata不免會趕上無限循環或是遞歸地處理數據包的狀況,這時指定一個最大值,當循環或遞歸次數大於這個值則中止處理當前數據包。

CUDA(Compute United Device Architecture)

CUDA的翻譯是統一計算設備架構,爲的是讓CPU和GPU在執行運算的時候發揮自身的優點,協同處理,詳細可參考CUDA-維基百科。 因爲這項技術是NVIDIA主導的,且出現時間並不長,所以suricata只是在MPM多模匹配中可使用,而且只有在編譯前的configure時加 入–enable-cuda才具備這項功能,而且目前其餘的GPU並不支持這項功能。所以這裏就不作過多介紹,等後面這項技術推廣開來,便有更加實用的意 義。

pattern-matcher

以前已經瞭解過,suricata在content的多模匹配支持不少算法,不一樣的算法有不一樣的優缺點。設置以下,可選的算法包括b2g, b2gc, b2gm, b3g, wumanber, ac和ac-gfbs(最後兩個是1.0.3版本才加入的):

mpm-algo: b2gc
  • 1

部分算法的詳細配置以下,search_algo表示當前算法所使用的掃描或搜索算法,好比b2gc算法的掃描算法(scan algorithms)有B2gScan和B2gScanBNDMq,搜索算法(search algorithms)有B2gSearch和B2gSearchBNDMq;hash_size表示每種算法的hash表的最大空間,從小到大依次是 lowest (2048) - low (4096) - medium (8192) - high (16384) - higher (32768) – max (65536),越大匹配的性能越好,但對內存的要求也更高;bf_size選項決定了布隆過濾器(Bloom filter-維基百科)佔用內存的大小,可選的值爲low (512) - medium (1024) - high (2048),也是從小到大排列,性能也是愈來愈好:

pattern-matcher: - b2gc: search_algo: B2gSearchBNDMq hash_size: low #Determines the size of the hash-table. bf_size: medium #Determines the size of the bloom- filter. - b3g: search_algo: B3gSearchBNDMq hash_size: low #See hash-size -b2gc. bf_size: medium #See bf-size -b2gc. - wumanber: hash_size: low #See hash-size -b2gc. bf_size: medium #See bf-size -b2gc.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

參考連接

https://redmine.openinfosecfoundation.org/projects/suricata/wiki/Suricatayaml
http://zh.wikipedia.org/wiki/YAML
https://redmine.openinfosecfoundation.org/projects/suricata/wiki/Runmodes
https://redmine.openinfosecfoundation.org/projects/suricata/wiki/EveJSONOutput
https://github.com/firnsy/barnyard2
http://en.wikipedia.org/wiki/Sguil
http://zh.wikipedia.org/wiki/X-Forwarded-For
http://baike.baidu.com/link?url=D2rVWCZz7t62A3ZgDEosF2-sgOdIAaoAk4iwrGkTqF3KRVE_14n-B0eUypHJDa8zCygUhRTbtDYF4i-k0kgMvq
http://de.wikipedia.org/wiki/Syslog
http://zh.wikipedia.org/wiki/CUDA
http://zh.wikipedia.org/wiki/%E5%B8%83%E9%9A%86%E8%BF%87%E6%BB%A4%E5%99%A8

 
0
0
相關文章
相關標籤/搜索