近來,咱們一直都在經過一些開源免費的工具,來幫助中小企業提高其網絡威脅檢測能力。在本文中,咱們將手把手的教你們經過Kibana,Wazuh和Bro IDS來提升自身企業的威脅檢測能力。html
Wazuh是一款以OSSEC做爲引擎的基於主機的入侵檢測系統。經過與ELK的結合,便於管理員經過日誌平臺查看系統日誌信息,告警信息,規則配置信息等。node
這裏有份很是詳細的Wazuh官方文檔,你能夠參考該文檔進行安裝安裝成功後,你能夠經過。HTTP:// YOUR_SERVER:5601訪問Kibana和Wazuh。git
BRO是一個開源的IDS項目。它的安裝相對容易,但使用Kibana進行設置就會複雜許多。咱們嘗試了好幾個網上的安裝教程,但都沒有成功。因此,咱們建立了咱們本身的安裝指南,你只需重複咱們的安裝步驟便可(避免在此過程浪費時間)。github
默認狀況下,Ubuntu的上已安裝了Git的。所以,你可使用如下命令克隆存儲庫。這些文件將被放入名爲兄弟的目錄中。shell
git clone --recursive git://git.bro.org/bro
切換到項目目錄json
cd bro
運行兄弟的配置(這個過程應該不到一分鐘就能完成)。api
./configure make
在運行時,你會在大多數輸出行的開頭看到完成百分比。ruby
完成後,安裝兄弟(這也應該用不到一分鐘的時間)。服務器
sudo make install
兄弟將被安裝在在/ usr /本地/兄弟目錄中。網絡
如今咱們須要將在/ usr /本地/兄弟目錄添加到$ PATH中。要確保它在全局可用,最好的方法是在/etc/profile.d中目錄下指定文件中的路徑。咱們將該文件稱爲3rd-party.sh。
export PATH=$PATH:/usr/local/bro/bin
如今,咱們已經安裝了兄弟,接下來咱們還須要對它進行一些配置更改才能正常運行。
。這裏咱們須要對一些兄弟的配置文件進行修改這些文件都位於在/ usr /本地/兄弟的/ etc目錄中,主要包含如下三個文件:
node.cfg,用於配置要監視的節點。
networks.cfg,包含節點本地的CIDR表示法網絡列表。
broctl.cfg,郵件,日誌記錄和其餘設置的全局BroControl配置文件。
讓咱們看看每一個文件中須要修改的地方。
要配置弟兄的監視節點,咱們須要修改node.cfg文件。
開箱即用,兄弟被配置爲在獨立模式下運行。由於這是獨立安裝的,因此你不須要修改此文件,但最好是檢查下其中的值是否正確。
打開文件進行編輯。
sudo nano /usr/local/bro/etc/node.cfg
在布部分,咱們找到接口參數。這裏的默認值爲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/8 Private IP space 172.16.0.0/12 Private IP space 192.168.0.0/16 Private IP space
刪除現有的三個條目,而後添加咱們本身的條目。你能夠經過ip addr show命令來檢查服務器接口的網絡地址。你的networks.cfg文件最終應該看起來像下面這樣:
示例/usr/local/bro/etc/networks.cfg
192.168.1.0/24 Public IP space 172.16.100.0/24 Private IP space
完成編輯後保存並關閉文件。接下來,咱們將配置郵件和日誌記錄設置。
BroControl用於管理Bro的安裝 - 啓動和中止服務,部署Bro以及執行其餘管理任務。它既是命令行工具又是一個交互式的shell。
若是使用sudo / usr / local / bro / bin / broctl調用broctl,它將啓動一個交互式shell:
Welcome to BroControl 1.5-21 Type "help" for help. [BroControl] >
你也可使用退出命令退出交互式外殼。
在外殼中,你能夠運行任何有效的弟兄命令。你也能夠直接從命令行運行相同的命令,而無需調用殼。在命令行運行命令的一大優點就是,容許你將broctl命令的輸出經過管道,傳輸到標準的Linux命令中。在接下來的部分,咱們都將在命令行中調用broctl命令。
首先,咱們使用broctl deploy啓動Bro。
sudo /usr/local/bro/bin/broctl deploy
默認狀況下,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;
接着,咱們重啓兄弟。如今,咱們全部的日誌文件都應該已經轉換爲了JSON格式。
sudo /usr/local/bro/bin/broctl restart
首先,咱們將原始的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中建立咱們的兄銼文件配置:
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配置/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你的兄文件的位置,以下所示:
而後回到探索,你應該可以看到你的兄弟日誌!
首先,在咱們這裏進行註冊以避免費電子雜誌情報威脅源。
選擇你的容器,飼料和傳感器(見如下的飼料截圖)。
你將看到一個api code,咱們將其複製到剪貼板或記事本中。
遵循臨界堆疊英特爾二進制文件的客戶端安裝說明進行安裝:
而後使用api code(須要聯網)將二進制文件鏈接到feed,此時它應該下載已訂閱的威脅情報源。
critical-stack-intel api [api_code_here]
並重啓兄弟
sudo /usr/local/bro/bin/broctl restart
使用如下命令列出提要:
critical-stack-intel list
但願經過本文的學習,可以讓你輕鬆的按照咱們的說明來建立你本身的HIDS和NIDS監控系統,並進一步的提高大家企業的威脅檢測能力。