标签:结构化 cpu ssd 分享 解析 1.7 介绍 没有 解析错误
BroBro简介
Bro特点
Bro基本架构
Dynamic Protocol Detection(DPD)
Bro集群部署
Bro脚本
Bro日志记录
安装部署
参考
Bro是一款被动的开源流量分析器。它主要用于对链路上所有深层次的可疑行为流量进行一个安全监控,其支持在安全域之外进行大范围的流量分析。更通俗一点,Bro是一款集成了TCPDUMP(抓包),WIRESHARK(流量分析),SNORT(×××检测),SYSLOG(日志记录),PYTHON/PERL(有灵活抽象的数据结构,支持脚本自定义处理)功能的网络流量分析利器。
部署
部署架构图:
从官方给的架构图来看我们发现Bro主要有两大组件:
如上官网给的架构图是不是特别简单,在实际情况下一个完整请求的通常要经过多个事件和对应的脚本去处理。我们以一个http请求大概来描述一下:
了解DPD之前,我们先了解一下Port-based Protocol Analysis。这是传统NIDS的检测协议的方式,根据端口来判断使用的是哪一种协议。如80端口认为是http协议,443端口认为是https协议等。这种方式有点是简单,但是缺点也是显而易见,这种方式像ftp协议也是分析不了的。
Bro使用动态协议检测框架,我们将分析器树与每个连接关联起来。此树可以包含任意数量的各种分析器,并且可以在连接的整个生命周期内进行修改。即我们可以动态启用/禁用分析器。它提供了两个功能:
有固定格式协议协议通过特征提取即可识别,而对于无固定格式协议,无法采用通用方法提取协议指纹,而只能针对特定协议特定分析提取协议指纹的可能性。所幸的是,属于该类型的应用层协议很少。因此,对于这种情形可以单独对待。如下为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"
}
Frontend:前端是一个分离的硬件设备或主机技术,能够将流量划分为许多的stream或flow。并且使用基于ip地址的hash算法给后端Worker转发请求。
Worker:嗅探网络流量并对重新组装的数据包进行协议分析的进程。集群的大部分工作都发生在Worker身上,由于所有的协议解析和大多数分析都将在这里进行,所以推荐使用大内存和多CPU的机器。由于几乎所有的日志都会发送到Manger,所以磁盘很小即可。
Proxy:代理是一个管理同步状态的Bro进程。变量可以在连接的进程之间自动同步。Proxy帮助Worker直接共享信息,而不需要Worker彼此直连。同步的信息有完整的主机或者服务列表(例如这台主机或这个服务被标识为需要执行完整的TCP握手)或者共享某个连接需要应用的协议分析器等。
分析流量:100g
使用的机器数量:5台物理机
每台机器配置:128g内存,12核心cpu,120g SSD盘+1T机械硬盘
部署情况:每台机器部署一个Proxy和10个Worker
参考地址:https://commons.lbl.gov/display/cpp/100G+Intrusion+Detection
需求:如果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输出结构化的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://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
标签:结构化 cpu ssd 分享 解析 1.7 介绍 没有 解析错误
原文地址:http://blog.51cto.com/leejia/2135755