Bro
目錄
Bro簡介
Bro特點
Bro基本架構
Dynamic Protocol Detection(DPD)
Bro集羣部署
Bro腳本
Bro日誌記錄
安裝部署
參考
Bro簡介
Bro是一款被動的開源流量分析器。它主要用於對鏈路上所有深層次的可疑行爲流量進行一個安全監控,其支持在安全域之外進行大範圍的流量分析。更通俗一點,Bro是一款集成了TCPDUMP(抓包),WIRESHARK(流量分析),SNORT(×××檢測),SYSLOG(日誌記錄),PYTHON/PERL(有靈活抽象的數據結構,支持腳本自定義處理)功能的網絡流量分析利器。
Bro特點
-
部署
- 在Unix-like系統上運行
- 基於端口或者網絡分流器的被動流量分析
- 使用libpcap的抓包
- 支持實時分析和離線分析
- 支持集羣化部署
- 單機或者集羣化部署都是使用統一的管理工具
- 使用BSD開源協議
- 分析
- 離線分析也支持日誌記錄
- 應用層協議支持Port-independent分析
- 支持多種應用層協議,包含DNS,FTP,HTTP,IRC,SMTP,SSH,SSL等
- 能夠分析應用層協議交換的文件內容
- 全IPv6支持
- 隧道檢測與分析,包含Ayiya, Teredo, GTPv1等
- 分析協議期間會進行完整性檢測
- 支持IDS風格的正則匹配
- 腳本語言
- 能完成任意分析任務的語言
- 基於事件的編程
- 特定於域的數據類型,如IP地址(透明地處理IPv4和IPv6)、端口號和計時器
- 支持跟蹤和管理網絡狀態
- 接口
- 默認輸出爲結構化的ASCII日誌
- 可以使用ElasticSearch等存儲數據(通過收集json日誌或者es plugin)
- 將外部的輸入實時整合分析
- Bro提供擴展的C庫,讓事件能與外部程序交換傳輸
- 通過腳本可以觸發任意外部處理邏輯
Bro部署架構
- 部署方式和其它NIDS相似
- 檢測出入的所有流量
- 採用被動檢測方式
部署架構圖:
Bro基本架構
從官方給的架構圖來看我們發現Bro主要有兩大組件:
- 事件引擎:它將傳入的數據包流轉化爲一系列高級事件。這些事件反映了網絡活動,即描述了我們所看到的,但不關心其中的問題或者它是否重要。例如,連接上的每個HTTP請求都轉換爲相應的http_request事件,該事件攜帶相關的IP地址和端口、被請求的URI和正在使用的HTTP版本。然而,該事件並不傳達任何進一步的解釋,例如該URI是否對應於一個已知的惡意軟件站點等。事件引擎採用c/c++編譯,性能很好,瞭解具體的事件種類可以查看如下鏈接(查看以event.bif.bro結尾的腳本):
https://www.bro.org/sphinx/script-reference/scripts.html - 腳本解釋器:腳本解釋器執行一組用Bro的自定義腳本語言編寫的事件處理程序。這些腳本可以表示站點的安全策略,例如當檢測到不同類型的活動時需要採取什麼行動。更廣泛地說,它們可以從輸入流中派生任何想要的屬性和統計信息。Bro的語言具有廣泛的領域特定類型和支持功能,至關重要的是它允許腳本隨時間保持狀態,使它們能夠跟蹤和關聯它們在連接和主機邊界上觀察到的事物的演化。Bro腳本可以生成實時警報,也可以根據需要執行任意外部程序,例如,觸發對×××的主動響應。
如上官網給的架構圖是不是特別簡單,在實際情況下一個完整請求的通常要經過多個事件和對應的腳本去處理。我們以一個http請求大概來描述一下:
Dynamic Protocol Detection(DPD)
Port-based Protocol Analysis
瞭解DPD之前,我們先了解一下Port-based Protocol Analysis。這是傳統NIDS的檢測協議的方式,根據端口來判斷使用的是哪一種協議。如80端口認爲是http協議,443端口認爲是https協議等。這種方式有點是簡單,但是缺點也是顯而易見,這種方式像ftp協議也是分析不了的。
DPD簡介
Bro使用動態協議檢測框架,我們將分析器樹與每個連接關聯起來。此樹可以包含任意數量的各種分析器,並且可以在連接的整個生命週期內進行修改。即我們可以動態啓用/禁用分析器。它提供了兩個功能:
- 可以獨立於端口執行協議分析。通過使用一組匹配典型協議對話的簽名,Bro通過查看payload以匹配正確的分析器。當這樣的簽名匹配時,它將打開相應的分析器。
- 當分析程序明顯地解析錯誤的協議時,我們可以關閉它們。這允許我們使用鬆散的協議簽名,如果有解析錯誤,可以並行多個分析程序分析。
DPD協議簽名
有固定格式協議協議通過特徵提取即可識別,而對於無固定格式協議,無法採用通用方法提取協議指紋,而只能針對特定協議特定分析提取協議指紋的可能性。所幸的是,屬於該類型的應用層協議很少。因此,對於這種情形可以單獨對待。如下爲http協議簽名樣例:
signature dpd_http_client {
ip-proto == tcp
payload /^[[:space:]]*(GET|HEAD|POST)[[:space:]]*/
tcp-state originator
}
signature dpd_http_server {
ip-proto == tcp
payload /^HTTP\/[0-9]/
tcp-state responder requires-reverse-signature dpd_http_client
enable "http"
}
Bro 集羣架構
集羣架構簡介
-
Frontend:前端是一個分離的硬件設備或主機技術,能夠將流量劃分爲許多的stream或flow。並且使用基於ip地址的hash算法給後端Worker轉發請求。
-
Worker:嗅探網絡流量並對重新組裝的數據包進行協議分析的進程。集羣的大部分工作都發生在Worker身上,由於所有的協議解析和大多數分析都將在這裏進行,所以推薦使用大內存和多CPU的機器。由於幾乎所有的日誌都會發送到Manger,所以磁盤很小即可。
-
Proxy:代理是一個管理同步狀態的Bro進程。變量可以在連接的進程之間自動同步。Proxy幫助Worker直接共享信息,而不需要Worker彼此直連。同步的信息有完整的主機或者服務列表(例如這臺主機或這個服務被標識爲需要執行完整的TCP握手)或者共享某個連接需要應用的協議分析器等。
- Manager:進程有兩個主要任務,即從該集羣的其他節點接收日誌消息以及notices信息。所有數據會輸出到一個單獨的日誌,而不是許多離散的日誌。管理器還利用機會去複製通知,並且它有能力這樣做,因爲它是通知的阻塞點,以及通知如何被處理爲操作(例如,電子郵件、分頁或阻塞)。管理端進程首先由BroControl啓動,僅開放特定端口等待連接,他不會初始任何對其他集羣的連接,一旦worker啓動並連接到Manager,日誌和notices信息將開始從工作端抵達管理端進程。
Berkeley Lab Cyber Security Team(伯克利實驗室網絡安全團隊)Bro集羣部署規模
分析流量:100g
使用的機器數量:5臺物理機
每臺機器配置:128g內存,12核心cpu,120g SSD盤+1T機械硬盤
部署情況:每臺機器部署一個Proxy和10個Worker
參考地址:https://commons.lbl.gov/display/cpp/100G+Intrusion+Detection
Bro腳本
需求:如果http的get請求的uri中包含passwd敏感詞則報警。
腳本如下:
event http_request(c: connection, # Connection.
method: string, # HTTP method.
original_URI: string, # Requested URL.
unescaped_URI: string, # Decoded URL.
version: string) # HTTP version.
{
if ( method == "GET" && unescaped_URI == /.*passwd/ )
NOTICE(...); # Alarm.
}
Bro日誌記錄
默認Bro輸出結構化的ASCII日誌到文件中,通過配置也可以使輸出日誌的格式爲json。默認情況下,Bro會記錄http協議相關的數據到http.log中。http.log默認的格式如下:
#separator \x09
#set_separator ,
#empty_field (empty)
#unset_field -
#path http
#open 2018-05-17-23-00-00
#fields ts uid id.orig_h id.orig_p id.resp_h id.resp_p trans_depth method host uri referrer version user_agent request_body_len response_body_len status_code status_msg info_code info_msgtags username password proxied orig_fuids orig_filenames orig_mime_types resp_fuids resp_filenames resp_mime_types
1526569221.715086 Cjtygm3Q2270olTjWa 116.55.236.99 39084 192.168.2.23 80 1 GET m.sda.cn / - 1.1 Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; NetworkBench/8.0.1.332-6700490-2725395) 0 10431 200 OK - - (empty) - - CDN-SRC-IP -> 116.54.1.107 - - - Fp0zSeJlVZ10p7ZD2 - text/html
實際使用中解決的問題
問題一:
請求通過CDN,CDN把請求轉發到我們機房nginx,而客戶端的真實ip通過CDN-SRC-IP這個header傳給nginx。我們從nginx連接的交換機做了端口鏡像,把nginx的流量通過端口鏡像給一臺部署了Bro的流量分析服務器copy了一份。但是,發現http.log中並沒有記錄客戶端的真實ip(即CDN-SRC-IP的值)。
解決:
看Bro的文檔介紹,其能自動識別代理,並把代理ip打印到log中,但是實際上並沒有自動識別到CDN-SRC-IP這個header。然後查看分析http協議的bro腳本,發現自動識別經過代理的請求是通過獲取幾個特定的header來實現的,而這些header不包括自定義的CDN-SRC-IP。故通過修改如下腳本添加CDN-SRC-IP這個header,然後重啓Bro即可。
# vim /usr/local/bro/share/bro/base/protocols/http/main.bro +99
## A list of HTTP headers typically used to indicate proxied requests.
const proxy_headers: set[string] = {
"FORWARDED",
"X-FORWARDED-FOR",
"X-FORWARDED-FROM",
"CLIENT-IP",
"VIA",
"XROXY-CONNECTION",
"PROXY-CONNECTION",
"CDN-SRC-IP",
} &redef;
問題二:
我們想過濾https的流量,來分析https流量中的相關信息。但是通過查看官網文檔和實際測試未能如願
解決:
1,像Bro,snort這種IDS工具都不支持https
2,wireshark(命令行有tshark工具)可以通過導入https server端私鑰,來解密密鑰交換算法是RSA的流量,從而解密https流量。
安裝部署
參見官方文檔:
https://www.bro.org/sphinx/install/install.html
https://www.bro.org/sphinx/quickstart/index.html
參考文章
https://www.bro.org/documentation/index.html
https://www.bro.org/development/howtos/dpd.html
https://www.bro.org/bro-workshop-2011/
https://www.bro.org/sphinx/script-reference/log-files.html
https://www.bro.org/sphinx/logs/index.html
https://www.bro.org/sphinx/scripts/base/protocols/http/main.bro.html