Bro是一个目前比较活跃的开源NIDS系统,差不多两年前我写过一个有关它特性的帖子。http://www.xfocus.net/articles/200310/624.html
Bro:一个开放源码的高级NIDS系统
近些日子陆续收到一些要求详细介绍如何使用的反馈,因此也就起了写个Bro相关系列文章的意,本篇作为此系列的第一篇,先从最基本的安装和配置讲起。安装
由于Bro有一些其他开源NIDS所没有的高级特性(主要在于对策略脚本的支持),因此安装和配置上可能相对麻烦一些,这个帖子希望能提供一些有用的参考。
Bro的官方网站是:
http://www.bro-ids.org/
上面有基本的介绍信息和下载指示,网站的一些栏目内容还待完善中。相对Snort来说,使用Bro的人还是非常少的,因此Bro的邮件列表是一个得以获取帮助非常重要的资源,建议加入这个列表或经常浏览一下邮件列表的Web Archive,相关的信息在如下的链接:
http://www.bro-ids.org/mailing-list.html
最新版本Bro的下载地址:
ftp://bro-ids.org/bro-0.9-current.tar.gz
截止到写这个帖子的时候,Bro软件包的最新版本是0.9a10,在FTP服务器上还可以找到一些老版本。在我的RedHat 7.3测试系统上,0.9a9版本在编译完成后“make install”时会出错,这个问题在Bro的邮件列表上有人提过,没看到Bro的维护团队给出有效的解决方案,但安装0.9a10版本时倒是没碰上什么麻烦,应该算是解决了。
Bro软件需要libpcap库完成抓包功能,也自带了libpcap库,当然也可以在configure的时候指定使用外部已安装的libpcap。顺利的话,安装过程非常简单,就是标准的Unix软件安装四步曲:
# tar zxvf bro-0.9a10.tar.gz
# cd bro-0.9a10
# ./configure
# make
# make install
默认情况下,安装完成以后Bro所有安装文件位于 /usr/local/bro 目录下,目录结构与相应的说明如下:
bro
|-- archive # 用于存储归档文件的目录
|-- bin # 可执行文件目录
| |-- bro # 主执行程序
| |-- cf # 转换时间显示格式的工具
| |-- ef
| |-- hf
| |-- nf
| |-- pf
| `-- rst # 用于切断TCP软件的工具,可以在脚本里调用
|-- doc # 使用及帮助文档目录
| |-- Bro-Ref-Manual.pdf # Bro脚本语言参考手册,PDF格式文档
| |-- Bro-quick-start # Bro快速使用指南目录,HTML格式的文档
. .
. .
. .
| |-- Bro-quick-start.pdf # Bro快速使用指南,PDF格式文档
| |-- Bro-reference-manual # Bro脚本语言参考手册目录,HTML格式文档
. .
. .
. .
| |-- Bro-user-manual # Bro使用手册目录,HTML格式文档
. .
. .
. .
| `-- Bro-user-manual.pdf # Bro使用手册,PDF格式文档
|-- etc # 配置信息目录,Bro的配置文件bro.cfg可以放在这里
| |-- VERSION
| |-- alert_scores
| `-- signature_scores
|-- logs # 日志目录,将来存储Bro的各类日志文件
|-- policy # Bro策略脚本目录,存储Bro自带的各种强大的功能脚本
| |-- OS-fingerprint.bro
| |-- active.bro
| |-- alarm.bro
. .
. .
. .
| |-- sig-addendum.sig
| |-- sig-functions.bro
| |-- signatures.bro
| |-- sigs # 规则文件目录,存放各个规则文件
| | |-- ex.web-rules.sig
| | |-- p0fsyn.osf
| | |-- snort-default.sig
| | |-- ssl-worm.sig
| | `-- worm.sig
. .
. .
. .
| `-- worm.bro
|-- reports # 生成的告警文件存储目录
|-- scripts # 脚本目录,用于存放各种维护操作的脚本
| |-- bro-logchk.pl
| |-- bro_log_compress.sh
| |-- frontend-mail-reports.sh
| |-- frontend-site-report.sh
| |-- host-grep
| |-- host-to-addrs
| |-- mail_notice.sh
| |-- mvlog
| `-- push_logs.sh
|-- site # 用于存放各类自定义规则和脚本的目录,定制自己的Bro功能
| `-- signatures.sig
`-- var # 存放Bro执行过程中生成的临时文件,比如进程ID记录文件等
Bro软件包带的Bro脚本语言参考手册、Bro快速使用指南、Bro使用手册几个文档非常重要,涵盖了从使用入门到编写检测脚本等高级功能的几乎所有细节,如果仔细阅读了这几个文档就没有读本帖子的必要了。
运行
----
如果只是简单测试一下Bro的可用性、调试脚本,Bro可以通过在命令行直接指定参数的方法启动。
Bro程序支持如下的命令行参数:
[root@redhat7 bin]# ./bro -h
bro version 0.9a10
usage: ./bro [options] [file ...]
<file> | policy file, or read stdin
-d | activate policy file debugging
-e <bro code> | augment loaded policies by given code
-f <filter> | tcpdump filter
-g | dump current config into .state dir
-h | command line help
-i <interface> | read from given interface
-p <prefix> | add given prefix to policy file resolution
-r <readfile> | read from given tcpdump file
-s <rulefile> | read rules from given file
-t <tracefile> | activate execution tracing
-w <writefile> | write to given tcpdump file
-v | print version and exit
-z <analysis> | run the specified policy file analysis
-A <writefile> | write transformed trace to given tcpdump file
-C | ignore checksums
-D <size> | DFA state cache size
-F | force DNS
-K <hashkey> | set key for keyed hashing
-L | benchmark for rules
-O | optimize policy script
-P | prime DNS
-R <events.bst> | replay events
-S | enable rule debugging
-T <level> | set 'RE_level' for rules
-W | activate watchdog timer
-x <file.bst> | print contents of state file
-I <foo> | print ID <foo>
$BROPATH | file search path (.:policy:policy/local:policy/sigs:/usr/local/bro/lib/)
$BRO_PREFIXES | prefix list ()
其中比较重要的参数有:
<file> | 所要加载的策略脚本,如果不指定,从标准输入读取脚本代码
-f <filter> | tcpdump格式的BPF过滤器,用于从网络接口过滤读取特定的报文进行分析
-i <interface> | 指定监听的网络接口
-p <prefix> | 增加对以'prefix'开头的脚本的加载解释执行
-r <readfile> | 从'readfile'文件中读取报文记录
-s <rulefile> | 从'rulefile'文件读取检测规则,也就是使用这个参数指定规则文件
-F | 强制使用缓存的域名信息
-O | 优化策略脚本的执行
-P | 不执行策略脚本,而是提取脚本中出现的域名,解析以后把结果缓存起来
$BROPATH | 环境变量,指定脚本和规则文件的搜索路径,此变量是必要的,命令行中指定的脚本都从这个路径中搜索
定义环境变量,执行Bro程序:
[root@redhat7 bro]# export BROPATH=/usr/local/bro/policy
[root@redhat7 bro]# bin/bro -i eth0 -f 'tcp or udp' mt
/usr/local/bro/policy/hot.bro, line 30: warning: no such host: ph33r.the.eleet.com
.
.
.
/usr/local/bro/policy/portmapper.bro, line 139: warning: no such host: sun-rpc.mcast.net
pcap bufsize = 8192
listening on eth0
在进程正式进入监听之前,Bro会试图解析脚本中所有出现的域名并对有问题的域名报错,这个过程可能会花费不少时间,可以先指定'-P'参数缓存一下脚本中的域名,那么在以后的启动命令中通过指定'-F'标记强制使用缓存的记录来加快启动过程。
[root@redhat7 bro]# bin/bro -i eth0 -P -f 'tcp or udp' mt
[root@redhat7 bro]# bin/bro -i eth0 -F -f 'tcp or udp' mt
/usr/local/bro/policy/hot.bro, line 30: warning: no such host: ph33r.the.eleet.com
/usr/local/bro/policy/scan.bro, line 96: warning: no such host: j5004.inktomisearch.com
.
.
.
/usr/local/bro/policy/ftp.bro, line 74: warning: no such host: gvaona1.cns.hp.com
/usr/local/bro/policy/portmapper.bro, line 139: warning: no such host: sun-rpc.mcast.net
pcap bufsize = 8192
listening on eth0
Reading .state/state.bst ...
普通配置
--------
在生产环境中使用Bro,最好采用配置文件加脚本的方式来启动进程,这样做的好处是方便管理。Bro软件包提供了相应的配置和管理脚本,具体的配置过程简述如下:
进入软件包的scripts子目录,执行bro_config脚本
[root@redhat7 scripts]# ./bro_config
Running Bro Configuration Utility
Values enclosed in '[ ]'s are the default value set if you hit return.
Automode not enabled
Using defaults from bro.cfg.example
Checking interfaces ....Done.
Log archive directory [/usr/local/bro/archive]
User id to install and run Bro under [root]
Interface name to listen on. The default is to use the busiest one found. [lo]
eth0
Site name for reports (i.e. LBNL, FOO.COM, BAZ.ORG) [2]
Starting time for a report run (0001 is 12:01 am and 1201 is 12:01pm) [0000]
How often (in hours) to generate an activity report [24]
Email local reports? (YES/NO) [NO]
Do you want to send external reports to a incident reporting org (e.g.: CERT, CIAC, etc) [NO]
Do you want to encrypt email reports (YES/NO) [NO]
May I guess your network configuration for you? [YES]
Checking network
Running localnets script to determine the local network range ...
This will take about 20 seconds
Capturing packets .... done.
Analyzing dump file..... done.
Your network appears to contain the following networks:
Edit local.site.bro by hand if this is not correct
Press any key to now to continue.
[root@redhat7 scripts]# ls /usr/local/bro/etc
alert_scores signature_scores VERSION
在回答完一些问题以后,脚本会以 bro.cfg.example 为模板在当前目录下生成 bro.cfg 文件,这个就是我们会用到的配置文件,将此文件复制到 $BROHOME/etc 目录下(默认情况下就是 /usr/local/bro/etc ),以后我们可能还要修改它。
[root@redhat7 scripts]# cp bro.cfg /usr/local/bro/etc/
复制scripts目录下的 bro.rc 及 bro.rc-hooks.sh 脚本到 $BROHOME/etc 目录:
[root@redhat7 scripts]# cp bro.rc /usr/local/bro/etc/
[root@redhat7 scripts]# cp bro.rc-hooks.sh /usr/local/bro/etc/
复制scripts目录下的 local.lite.bro 策略脚本到 $BROHOME/policy 目录:
[root@redhat7 scripts]# cp local.lite.bro /usr/local/bro/policy/
转到 $BROHOME/etc 目录,给 bro.rc 脚本加上执行位,以后Bro的启动和停止都可以由此脚本来控制:
[root@redhat7 scripts]# cd /usr/local/bro/etc
[root@redhat7 etc]# chmod +x bro.rc
一般来说,脚本生成的 bro.cfg 文件大多还是不符合我们的需要,编辑它才能使Bro如我们所愿地那样工作。bro.cfg 其实只是定义了一些环境变量,通过这些环境变量向 bro.rc 脚本传递参数,bro.rc 根据参数构造出执行 bro 程序的命令行,最终运行 bro 程序。bro.cfg 文件的内容如下,对比较重要的参数加了注释,用户可以根据自己的需要修改:
---------------------------------- 8< -------------------------------------
# Bro工具的主目录
BROHOME=/usr/local/bro
export BROHOME
# Hostname to add into log filenames and reports
BRO_HOSTNAME=Redhat7
# FQDN format
# BRO_HOSTNAME=RedHat7
# Bro软件的可执行文件目录
BRO_BIN_DIR="/usr/local/bro/bin"
# 日志目录
BROLOGS="/usr/local/bro/logs"
export BROLOGS
# 归档目录
BRO_LOG_ARCHIVE="/usr/local/bro/archive"
# 策略脚本的搜索路径
BROPATH="/usr/local/bro/policy:/usr/local/bro/site:/usr/local/bro/policy/rules"
export BROPATH
# Bro初始启动的策略脚本文件,必须在BROPATH搜索路径中,一般情况下可以用 brolite.bro 脚本
# brolite.bro 会加载其他大多数常用的策略脚本,注意,这种配置下,Bro不支持规则匹配。要使
# Bro按规则文件中的定义执行匹配,应该指定为 local.lite.bro ,具体的配置下面有介绍。
BRO_START_POLICY="brolite.bro"
# 自定义规则及策略脚本的存储目录
BROSITE="/usr/local/bro/site"
export BROSITE
# 以BRO_PREFIX开头的脚本文件都会被加载
# BRO_PREFIX="local"
# Bro主程序的存放位置
BRO="/usr/local/bro/bin/bro"
# 没发现下面这个环境变量被引用过,也就是说这个选项在当前的Bro版本中无用
BRO_ADD_OPTS=" -W"
# 附加的Bro主程序的运行参数标记,可以在此增加其他Bro主程序所支持的命令行参数
BRO_OPTS=" -W"
# 监听的网络接口名,多个接口用空格隔开
BRO_CAPTURE_INTERFACE="eth0"
# Multiple interface should be specified as a space delimited list.
# Examples:
# CAPTURE_INTERFACE="sk0 sk1 sk5"
# CAPTURE_INTERFACE="eth0 eth3"
# CAPTURE_INTERFACE="eth0"
# 是否生成抓包文件
BRO_CREATE_TRACE_FILE=NO
# How long to wait during checkpointing after startin a new Bro process and stopping the old one (in seconds).
BRO_CHECKPOINT_OVERLAP_TIME=20
# Base directory where reports will be stored
BRO_REPORT_DIR="/usr/local/bro/reports"
export BRO_REPORT_DIR
# Starting time for a report run (0001 is 12:01 am and 1201 is 12:01pm)
BRO_REPORT_START_TIME=0000
# How often (in hours) to generate an activity report
BRO_REPORT_INTERVAL=24
# This is the how often to rotate the logs (in hours)
BRO_LOG_ROTATE_INTERVAL=24
# 以小时计的重新读取配置文件的时间间隔
BRO_CHECKPOINT_INTERVAL=24
# The maximum time allowed for a Bro process to cleanup and exit (in seconds).
BRO_MAX_SHUTDOWN_TIME=7200 # 2 hours
# Use this to enable the init script to autorestart Bro in the event of an unexpected shutdown (YES/NO)
BRO_ENABLE_AUTORESTART="YES"
# A value less than 1 means there will be no limit to the number of restarts
# Maximum times to try to auto-restart Bro before giving up.
BRO_MAX_RESTART_ATTEMPTS="-1"
# This is normally /var/run/bro and contains the pidfile and other temporal data.
# Location of the run-time directory.
BRO_RUNTIME_DIR="/usr/local/bro/var"
# Email address for local reports to be mailed to
BRO_EMAIL_LOCAL="NO"
# Email address to send from
BRO_EMAIL_FROM="bro@localhost"
# Do you want to send external reports to a incident reporting org (e.g.: CERT, CIAC, etc)
BRO_EMAIL_EXTERNAL="NO"
export BRO_EMAIL_EXTERNAL
# Email address for remote reports to be mailed to
BRO_EMAIL_REMOTE="BRO-IDS@bro-ids.org"
# User id to install and run Bro under
BRO_USER_ID="root"
# Site name for reports (i.e. LBNL, FOO.COM, BAZ.ORG)
BRO_SITE_NAME="SOMESITE"
export BRO_SITE_NAME
# Do you want to encrypt email reports (YES/NO)
BRO_ENCRYPT_EMAIL="NO"
# Location of GPG binary for encrypting email
BRO_GPG_BIN="/usr/local/bin/gpg"
# Default BPF buffer
BRO_BPF_BUFSIZE=4194304
# Do BPF bonding
BRO_BPFBOND_ENABLE="NO"
# Interfaces to bond
BRO_BPFBOND_FLAGS="em0 em1"
# diskspace management settings
# Should I manage diskspace
BRO_DISKSPACE_ENABLE="YES"
# percent full to worry about
BRO_DISKSPACE_PCT=90
# account watching disk space
BRO_DISKSPACE_WATCHER="root"
# days before deleting old logs
BRO_DAYS_2_DELETION=45
# days before compressing logs
BRO_DAYS_2_COMPRESSION=20
# Bulk data capture settings
# Buld data directory
BRO_BULK_DIR="/usr/local/bro/bulk-trace"
# Capture filter for bulk data
BRO_BULK_CAPTURE_FILTER=""
# days before deleting bulk data
BRO_BULK_DAYS_2_DELETION=4
# days before compressing bulk data
BRO_BULK_DAYS_2_COMPRESSION=2
# location of sorted log files, needed by Brooery
BROOERY_LOGS="/usr/local/bro/sorted-logs"
---------------------------------- 8< -------------------------------------
配置完成以后,使用 bro.rc 脚本启动:
[root@redhat7 etc]# ./bro.rc start
bro.rc: Running as non-root user root
bro.rc: Starting ............. SUCCESS
Bro就此开始监听网卡,执行脚本进行检测,在 $BROHOME/logs 目录下可以看到生成的日志文件,ps 可以看到进程。
“bro.rc checkpoint”命令重载配置文件:
[root@redhat7 etc]# ./bro.rc checkpoint
bro.rc: Running as non-root user root
bro.rc: Beginning the checkpoint process
bro.rc: Starting a new Bro instance.
bro.rc: Will wait for 20 seconds before stopping the old Bro instance.
“bro.rc stop”命令终止Bro:
[root@redhat7 etc]# ./bro.rc stop
bro.rc: Running as non-root user root
bro.rc: Stopping ... SUCCESS !
规则配置
--------
从检测的实现方式上来说,Bro与商业的NIDS产品NFR非常相似,采用专用的脚本对网络流量进行分析,因此具有几乎无限的灵活性,当然代价是脚本维护的复杂性。为了能快速地扩展检测能力、方便管理,检测一些简单的单包攻击,Bro 0.8及以后版本引入了规则匹配机制,与Snort类似,Bro可以支持一些包特征的定义,对符合定义的报文触发告警。规则定义存放在规则文件中,Bro可以被配置成读取规则文件中的规则,对网络报文进行匹配。
要使能Bro的规则匹配特性,修改 bro.cfg 文件,指定 BRO_START_POLICY 变量的值为 local.lite.bro ,同时对此脚本做些修改,默认的 local.lite.bro 脚本内容如下:
---------------------------------- 8< -------------------------------------
# $Id: local.lite.bro,v 1.7 2005/03/20 06:51:11 vern Exp $
# This file is intended for host-specific Bro policy.
# What is host-specific? It can be anything that is not the default
# after installation. This is the place to make tweaks and changes
# to modify policy to suit your network environment and preferences.
# The following causes Bro to load local.XXX.bro anytime you
# "@load XXX" (along with first loading XXX.bro).
#
@prefixes = local
@load brolite # root policy which loads all other default policies.
# File generated by the network script for dynamic configuration of
# the local network subnets.
@load site
# Make any changes to policy starting HERE:
# To run signatures, uncomment the following line.
# @load brolite-sigs
@ifdef ( use_signatures )
# Load Bro signatures. This is the default file containing Bro
# signatures.
redef signature_files += "signatures";
@endif
---------------------------------- 8< -------------------------------------
默认的 local.lite.bro 脚本加载了 brolite.bro,也就是说会启动大多数Bro工具自带的检测脚本,但没有打开规则匹配支持,要使能规则匹配:
1. 去掉 “# @load brolite-sigs” 行的注释
2. 修改倒数第二行 “redef signature_files += "signatures";”,指定规则文件。规则文件必须在BROPATH指定的搜索路径中,文件名必须以“.sig”结尾,local.lite.bro 中默认指定为“signatures”,它指的是 $BROHOME/site 目录中默认安装的 signature.sig 文件,此文件中的大多数攻击特征定义转换自Snort的规则。用户可以指定自己规则文件,要增加规则文件,只需增加一行“redef signature_files += another-signature.sig”类似的代码即可。另外一个指定的规则文件的方法是使用“-s”参数,编辑 bro.cfg 文件,在BRO_OPTS环境变量中增加类似“-s another-signature.sig”的选项。
如果用户不想加载使用Bro自带的那些检测脚本,只是让Bro处理规则匹配,那么:
1. 去掉 “# @load brolite-sigs” 行的注释
2. 注释掉“@load brolite”行
3. 在“@load brolite-sigs”行前插入“@load software”
与Snort不同,Bro的规则匹配提供了一些高级特性,在“Bro:一个开放源码的高级NIDS系统”中已有所提及,计划在此系列的下一篇详细介绍Bro的规则。