如何通過Kibana、Wazuh和Bro IDS提高中小企業的威脅檢測能力?
前言
近來,我們一直都在通過一些開源免費的工具,來幫助中小企業提升其網路威脅檢測能力。在本文中,我們將手把手的教大家通過Kibana,Wazuh和Bro IDS來提高自身企業的威脅檢測能力。
什麼是Wazuh?
Wazuh是一款以OSSEC作為引擎的基於主機的入侵檢測系統。通過與ELK的結合,便於管理員通過日誌平臺檢視系統日誌資訊,告警資訊,規則配置資訊等。
安裝ELK & Wazuh
這裡有份非常詳細的 ofollow" rel="nofollow,noindex" target="_blank">Wazuh官方文件 ,你可以參考該文件進行安裝。安裝成功後,你可以通過 http://your_server:5601 訪問Kibana和Wazuh。
安裝Bro
BRO是一個開源的IDS專案。它的安裝相對容易,但使用Kibana進行設定就會複雜許多。我們嘗試了好幾個網上的安裝教程,但都沒有成功。所以,我們建立了我們自己的安裝指南,你只需重複我們的安裝步驟即可(避免在此過程浪費時間)。
Ubuntu 安裝
預設情況下,Ubuntu上已安裝了Git。因此,你可以使用以下命令克隆儲存庫。這些檔案將被放入名為bro的目錄中。
git clone --recursive git://git.bro.org/bro
切換到專案目錄
cd bro
執行Bro的配置(這個過程應該不到一分鐘就能完成)。
./configure make
在執行時,你會在大多數輸出行的開頭看到完成百分比。
完成後,安裝Bro(這也應該用不到一分鐘的時間)。
sudo make install
Bro將被安裝在/usr/local/bro目錄中。
現在我們需要將/usr/local/bro目錄新增到$PATH中。要確保它在全域性可用,最好的方法是在/etc/profile.d目錄下指定檔案中的路徑。我們將該檔案稱為3rd-party.sh。
export PATH=$PATH:/usr/local/bro/bin
現在,我們已經安裝了Bro,接下來我們還需要對它進行一些配置更改才能正常執行。
配置Bro
這裡我們需要對一些Bro的配置檔案進行修改。這些檔案都位於/usr/local/bro/etc目錄中,主要包含以下三個檔案:
node.cfg,用於配置要監視的節點。
networks.cfg,包含節點本地的CIDR表示法網路列表。
broctl.cfg,郵件,日誌記錄和其他設定的全域性BroControl配置檔案。
讓我們看看每個檔案中需要修改的地方。
配置要監控的節點
要配置Bro的監視節點,我們需要修改node.cfg檔案。
開箱即用,Bro被配置為在獨立模式下執行。因為這是獨立安裝的,所以你不需要修改此檔案,但最好是檢查下其中的值是否正確。
開啟檔案進行編輯。
sudo nano /usr/local/bro/etc/node.cfg
在bro部分,我們找到interface引數。這裡的預設值為eth0,這應該與你的Ubuntu 16.04伺服器的公共介面相匹配。如果不一致的話,你就要進行修改。
/usr/local/bro/etc/node.cfg
[bro] type=standalone host=localhost interface=eth0
完成後儲存並關閉檔案。接下來,我們將配置該節點所屬的專用網路。
你可以在networks.cfg檔案中,配置節點所屬的IP網路(即你希望監視的伺服器介面的IP網路)。
我們開啟該檔案。
sudo nano /usr/local/bro/etc/networks.cfg
預設情況下,該檔案附帶三個專用IP地址塊示例。
/usr/local/bro/etc/networks.cfg # List of local networks in CIDR notation, optionally followed by a # descriptive tag. # For example, "10.0.0.0/8" or "fe80::/64" are valid prefixes. 10.0.0.0/8Private IP space 172.16.0.0/12Private IP space 192.168.0.0/16Private IP space
刪除現有的三個條目,然後新增我們自己的條目。你可以通過ip addr show命令來檢查伺服器介面的網路地址。你的networks.cfg檔案最終應該看起來像下面這樣:
示例 /usr/local/bro/etc/networks.cfg
192.168.1.0/24Public IP space 172.16.100.0/24Private IP space
完成編輯後儲存並關閉檔案。接下來,我們將配置郵件和日誌記錄設定。
使用BroControl管理Bro
BroControl用於管理Bro的安裝 – 啟動和停止服務,部署Bro以及執行其他管理任務。它既是命令列工具又是一個互動式的shell。
如果使用sudo /usr/local/bro/bin/broctl呼叫broctl,它將啟動一個互動式shell:
Welcome to BroControl 1.5-21 Type "help" for help. [BroControl] >
你也可以使用exit命令退出互動式shell。
在shell中,你可以執行任何有效的Bro命令。你也可以直接從命令列執行相同的命令,而無需呼叫shell。在命令列執行命令的一大優勢就是,允許你將broctl命令的輸出通過管道,傳輸到標準Linux命令中。在接下來的部分,我們都將在命令列中呼叫broctl命令。
首先,我們使用broctl deploy啟動Bro。
sudo /usr/local/bro/bin/broctl deploy
將Bro日誌轉換為JSON
預設情況下,Bro日誌是TSV(製表符分隔值)檔案! 但對於ElasticSearch而言,使用JSON檔案可以更高效地執行。
我們只需在/usr/share/bro/share/site/bro.local檔案的末尾新增以下內容即可:
@load tuning/json-logs redef LogAscii::json_timestamps = JSON::TS_ISO8601; redef LogAscii::use_json = T;
接著,我們重啟Bro。現在,我們所有的日誌檔案都應該已經轉換為了JSON格式。
sudo /usr/local/bro/bin/broctl restart
Filebeat
首先,我們將原始的wazuh filebeat配置移動到一個新建立的目錄conf.d。你只需複製以下命令即可:
cd /etc/filebeat mkdir conf.d mv filebeat.yml conf.d/ cat << EOF > filebeat.yml filebeat: config_dir: /etc/filebeat/conf.d output: logstash: # The Logstash hosts hosts: ["127.0.0.1:5000"] EOF
然後,在/etc/filebeat/conf.d/filebeat_bro.yml中建立我們的bro filebeat配置:
filebeat: prospectors: - input_type: log paths: - "/usr/local/bro/spool/bro/conn.log" document_type: json json.message_key: log json.keys_under_root: true json.overwrite_keys: true - input_type: log paths: - "/usr/local/bro/spool/bro/dns.log" document_type: json json.message_key: log json.keys_under_root: true json.overwrite_keys: true - input_type: log paths: - "/usr/local/bro/spool/bro/http.log" document_type: json json.message_key: log json.keys_under_root: true json.overwrite_keys: true - input_type: log paths: - "/usr/local/bro/spool/bro/intel.log" document_type: json json.message_key: log json.keys_under_root: true json.overwrite_keys: true # copy inputs to add additional bro logs as needed output: logstash: # The Logstash hosts hosts: ["127.0.0.1:5001"]
Logstash
我們的Logstash配置/etc/logstash/conf.d/bro.conf:
input { beats { port => 5001 codec => "json_lines" } } filter { #Let's get rid of those header lines; they begin with a hash if [message] =~ /^#/ { drop { } } #Now, using the csv filter, we can define the Bro log fields if [type] == "bro-conn_log" { csv { columns => ["ts","uid","id.orig_h","id.orig_p","id.resp_h","id.resp_p","proto","service","duration","orig_bytes","resp_bytes","conn_state","local_orig","missed_bytes","history","orig_pkts","orig_ip_bytes","resp_pkts","resp_ip_bytes","tunnel_parents"] #If you use a custom delimiter, change the following value in between the quotes to your delimiter. Otherwise, insert a literal <tab> in between the two quotes on your logstash system, use a text editor like nano that doesn't convert tabs to spaces. separator => "" } #Let's convert our timestamp into the 'ts' field, so we can use Kibana features natively date { match => [ "ts", "UNIX" ] } # add geoip attributes geoip { source => "id.orig_h" target => "orig_geoip" } geoip { source => "id.resp_h" target => "resp_geoip" } #The following makes use of the translate filter (logstash contrib) to convert conn_state into human text. Saves having to look up values for packet introspection translate { field => "conn_state" destination => "conn_state_full" dictionary => [ "S0", "Connection attempt seen, no reply", "S1", "Connection established, not terminated", "S2", "Connection established and close attempt by originator seen (but no reply from responder)", "S3", "Connection established and close attempt by responder seen (but no reply from originator)", "SF", "Normal SYN/FIN completion", "REJ", "Connection attempt rejected", "RSTO", "Connection established, originator aborted (sent a RST)", "RSTR", "Established, responder aborted", "RSTOS0", "Originator sent a SYN followed by a RST, we never saw a SYN-ACK from the responder", "RSTRH", "Responder sent a SYN ACK followed by a RST, we never saw a SYN from the (purported) originator", "SH", "Originator sent a SYN followed by a FIN, we never saw a SYN ACK from the responder (hence the connection was 'half' open)", "SHR", "Responder sent a SYN ACK followed by a FIN, we never saw a SYN from the originator", "OTH", "No SYN seen, just midstream traffic (a 'partial connection' that was not later closed)" ] } mutate { convert => [ "id.orig_p", "integer" ] convert => [ "id.resp_p", "integer" ] convert => [ "orig_bytes", "integer" ] convert => [ "duration", "float" ] convert => [ "resp_bytes", "integer" ] convert => [ "missed_bytes", "integer" ] convert => [ "orig_pkts", "integer" ] convert => [ "orig_ip_bytes", "integer" ] convert => [ "resp_pkts", "integer" ] convert => [ "resp_ip_bytes", "integer" ] rename =>[ "id.orig_h", "id_orig_host" ] rename =>[ "id.orig_p", "id_orig_port" ] rename =>[ "id.resp_h", "id_resp_host" ] rename =>[ "id.resp_p", "id_resp_port" ] } } } output { #stdout { codec => rubydebug } elasticsearch { hosts => ["localhost:9200"] index => "bro-conn-%{+YYYY.MM.dd}" document_type => "bro" template => "/etc/logstash/bro.json" template_name => "bro" template_overwrite => true } }
我們的bro.json檔案你可以在這裡獲取到: https://gist.github.com/netscylla/27ac9e1472d89dffa5a8267a6af9c9be
最後,我們重啟logstash。
systemctl restart logstash
並檢查你的Kibana儀表板:
首先,我們轉到管理面板,然後單擊索引模式(index patterns),這將告訴kibana你的bro檔案的位置,如下所示:
然後回到discover,你應該能夠看到你的bro日誌!
提取 – Bro和威脅情報
首先,我們在 這裡 進行註冊以獲取免費威脅情報源。
選擇你的Container,feeds 和 sensor(見以下的feeds截圖)。
你將看到一個api code,我們將其複製到剪貼簿或記事本中。
遵循critical-stack-intel二進位制檔案的客戶端安裝說明進行安裝:
然後使用api code(需要聯網)將二進位制檔案連線到feed,此時它應該下載已訂閱的威脅情報源。
critical-stack-intel api [api_code_here]
並重啟bro
sudo /usr/local/bro/bin/broctl restart
使用以下命令列出feeds:
critical-stack-intel list
結語
希望通過本文的學習,能夠讓你輕鬆的按照我們的說明來建立你自己的HIDS和NIDS監控系統,並進一步的提升你們企業的威脅檢測能力。
*參考來源: netscylla ,FB小編secist編譯,轉載請註明來自FreeBuf.COM