Aumentando el rendimiento de Snort con Barnyard2

En entornos en los que un IDS Snort tiene que procesar una gran cantidad de tráfico es muy posible que su rendimiento se vea afectado y acabe descartando paquetes.

Esto es debido a que Snort no procesa el siguiente paquete hasta que no termina de escribir la alerta en la base de datos. Este proceso de escritura es lento si hablamos de que es necesario una conexión TCP y un insert en la base de datos por cada alerta.

Para estos casos se puede configurar Snort (/etc/snort/snort.conf) para que escriba las alertas en un fichero local en lugar de hacerlo directamente en red:

output unified2:  filename snort.log, limit=128

Con esta línea diremos a Snort que escriba las alertas en un fichero con nomenclatura base snort.log. (el. snort.log.1245910233) con un tamaño máximo de 128MB cada uno.

Como veis se trata del formato unified2, un formato binario optimizado que permitirá a nuestro querido "cerdito" generar alertas más rápidamente.

Pero si tenemos las alertas en un fichero local, ¿cómo las escribimos entonces en la base de datos?.

Para esta tarea tenemos Barnyard2 (en español "corral"), un intérprete open source de los ficheros de salida en formato unified2.

Una vez descargado, en nuestro caso lo configuramos para que soporte Oracle (./configure --with-oracle) y los instalamos (./make && ./make install).

A continuación copiamos el fichero de configuración de ejemplo (cp -p /usr/local/barnyard2-1.x/etc/barnyard2.conf /etc/snort/barnyard2.conf) y modificamos las siguientes líneas:


config hostname:        localhost
config interface: eth0
input unified2
output database: log, oracle, dbname=PRE user=snort password=laquesea hostname=localhost

Cómo podéis ver, Barnyard2 tendrá como entrada un fichero unified2 y como salida escribirá en nuestra base de datos Oracle.

Ahora sólo nos queda lanzar el proceso de Barnyard2 pero, para ello, primero tendremos que elegir su modo de operación entre tres distintas opciones:

1. "-o" batch: sólo se trata el fichero o ficheros de entrada especificados.

2. "-f" continuo: se asigna como entrada un directorio (spool dir) y el patrón de los ficheros que se tratarán, de forma que Barnyard2 procesará los ficheros según vayan apareciendo (nuevos ficheros en cola).

3. "-W" continuo con marcador (bookmark): se trata de un modo continuo pero que usará un fichero de chequeo (fichero .waldo) para empezar a procesar a partir del fichero con timestamp que le indiquemos. El fichero waldo tendrá el siguiente formato:


(ej. /var/log/snort/barnyard.waldo)
/var/log/snort (spool directory)
snort.log (spool filebase)
1256243504 (time_stamp)
0 (record_idx number, all=0)

En nuestro caso elegiremos el modo continuo con marcador "-W" y especificamos los ficheros gen-msg.map y sid-msg.map para que Barnyard2 traduzca los generadores y los IDs de Snort, lanzando Barnyard2 con los siguientes parámetros:


/usr/local/bin/barnyard2 -c /etc/snort/barnyard2.conf -G /etc/snort/gen-msg.map -S /etc/snort/sid-msg.map -d /var/log/snort -f snort.log -w /var/log/snort/barnyard.waldo

Obteniendo finalmente la siguiente salida:


root@ids2:/etc/snort# Running in Continuous mode with inferred config file: /etc/snort/barnyard2.conf

--== Initializing Barnyard2 ==--
Initializing Input Plugins!
Initializing Output Plugins!
Parsing rules files /etc/snort/barnyard2.conf

+++++++++++++++++++++++++++++++++++++++++++++++++++
Initializing rule chains...
Found reference-map config directive (/etc/snort/reference.config)
Found class-map config directive (/etc/snort/classification.config)
Found gen-msg-map config directive (/etc/snort/gen-msg.map)
Found sid-msg-map config directive (/etc/snort/sid-msg.map)
Found hostname config directive (localhost)
Found interface config directive (eth0)
Generating maps
WARNING: Ignoring corrupt/truncated waldofile '/var/log/snort/barnyard.waldo'
database: compiled support for ( oracle )
database: configured to use oracle
database: database name = XE
database: user = snort
database: password is set
database: host = localhost
database: sensor name = localhost:eth0
database: hostname not required for Oracle, use dbname
database: dbname must be in tnsnames.ora
database: sensor id = 3
database: schema version = 107
database: using the "log" facility

--== Initialization Complete ==--

______ -*> Barnyard2 for Snort! <*-
/ ,,_ \ Version 2.1.6 (Build 163)
|o" )~| By the SecurixLive.com Team: http://www.securixlive.com/about.php
+ '''' + (C) Copyright 2008-2009 SecurixLive.

Snort by Martin Roesch & The Snort Team: http://www.snort.org/team.html
(C) Copyright 1998-2007 Sourcefire Inc., et al.

Opened spool file '/var/log/snort/snort.log.1301487108'
Waiting for new data

Comentarios