内容简介:Bro简介Bro特点Bro基本架构
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;
安装部署
以上所述就是小编给大家介绍的《Bro浅析》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。