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;

安装部署

参见官方文档:
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

原文地址:http://blog.51cto.com/leejia/2135755

时间: 2024-08-14 18:57:13

Bro浅析的相关文章

Python之encode与decode浅析

 Python之encode与decode浅析 在 python 源代码文件中,如果你有用到非ASCII字符,则需要在文件头部进行字符编码的声明,声明如下: # code: UTF-8 因为python 只检查 #.coding 和编码字符串,为了美观等原因可以如下写法: #-*-coding:utf-8-*- 常见编码介绍: GB2312编码:适用于汉字处理.汉字通信等系统之间的信息交换. GBK编码:是汉字编码标准之一,是在 GB2312-80 标准基础上的内码扩展规范,使用了双字节编码.

浅析PHP的开源产品二次开发的基本要求

浅析PHP的开源产品二次开发的基本要求 第一, 基本要求:HTML(必须要非常熟悉),PHP(能看懂代码,能写一些小系统,如:留言板,小型CMS),Mysql(至少会一种数据库),Javascript(能看懂,能改现成的一些代码),Div+Css(能进行界面的调整,明白CSS是怎么使用的) 第二, 熟悉开源产品的使用,比如 Dedecms,你要知道怎么登录,怎么新建栏目,怎么添加文章,模板标签的使用方法,模型的概念和使用方法等等一些功能 第三, 要熟悉这个开源产品的数据库结构,还要理解里面核心文

word-break|overflow-wrap|word-wrap——CSS英文断句浅析

---恢复内容开始--- word-break|overflow-wrap|word-wrap--CSS英文断句浅析 一 问题引入 今天在再次学习 overflow 属性的时候,查看效果时,看到如下结果,内容在 div 中国换行了,可是两个 P 元素的内容并没有换行,搜索一番没有找到系统的答案,截图到群里请教大神,才知道是英文断句的问题,但是还是不太明白.之前没有遇到这种情况,为了彻底搞清楚,英文断句,又开始学习英文断句到底是怎么回事. 二 换行 每种语言里都有换行,就中文而言,我们最小语言单位

浅析vanish

浅析 VANISH --一种cache 第一部分:理解vanish的准备工作 1.对CDN的小剖析 CDN  content  delivery  network  内容分发(推送)网络,是在现有的Internet中增加一层新的网络架构,将网络内容发布到最接近用户的网络边缘(边缘服务器),使用户最近取得所需内容,解决网络拥挤状态,提高用户访问网站的速度. CDN网络架构主要有两部分组成,中心和边缘两部分,中心指CDN网管中心和DNS重定向解析中心,负责全局负载均衡.边缘主要指异地节点,CDN分发

健康,home? [java的内存浅析]

健康,home? [java的内存浅析] 摘要: 原创出处: http://www.cnblogs.com/Alandre/ 泥沙砖瓦浆木匠 希望转载,保留摘要,谢谢! 乐观上上,how can other kno u,u r yourself!I must be strong and carry on. -泥沙砖瓦浆木匠 一.闲谈下 201407月记着那时候身体垮了下来,呵呵.想说,对自己的说,也是对大家的负责吧.那时候胸疼胸闷,然后几乎累垮了,我还坚持了一星期,那一星期真的迷迷糊糊.完全不能

Mysql查询优化器浅析

--Mysql查询优化器浅析 -----------------------------2014/06/11 1 定义 Mysql查询优化器的工作是为查询语句选择合适的执行路径.查询优化器的代码一般是经常变动的,这和存储引擎不太一样.因此,需要理解最新版本的查询优化器是如何组织的,请参考相应的源代码.整体而言,优化器有很多相同性,对mysql一个版本的优化器做到整体掌握,理解起mysql新版本以及其他数据库的优化器都是类似的. 优化器会对查询语句进行转化,转化等价的查询语句.举个例子,优化器会将

Volley框架源码浅析(一)

尊重原创http://blog.csdn.net/yuanzeyao/article/details/25837897 从今天开始,我打算为大家呈现关于Volley框架的源码分析的文章,Volley框架是Google在2013年发布的,主要用于实现频繁而且粒度比较细小的Http请求,在此之前Android中进行Http请求通常是使用HttpUrlConnection和HttpClient进行,但是使用起来非常麻烦,而且效率比较地下,我想谷歌正式基于此种原因发布了Volley框架,其实出了Voll

HDU 5122 K.Bro Sorting(模拟——思维题详解)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5122 Problem Description Matt's friend K.Bro is an ACMer. Yesterday, K.Bro learnt an algorithm: Bubble sort. Bubble sort will compare each pair of adjacent items and swap them if they are in the wrong o

C语言中文件打开模式(r/w/a/r+/w+/a+/rb/wb/ab/rb+/wb+/ab+)浅析

C语言文件打开模式浅析 在C语言的文件操作语法中,打开文件文件有以下12种模式,如下图: 打开模式  只可以读   只可以写  读写兼备 文本模式 r w a r+ w+ a+ 二进制模式 rb wb ab  rb+ (r+b)   wb+ (w+b)   ab+ (a+b)  其中,二进制模式与文本模式操作相似,只不过是以二进制流的形式读写而已,下面以文本模式为例分析: 1."r" 模式: 1.1 打开文件进行“只读”操作,即只能从文件读取内容. 1.2 若欲操作的文件不存在,则打开