Instalación de Snort en Debian
Contenido |
Resumen
Configuración y puesta en marcha de un IDS en Debian Jessie con Snort, complementando su funcionalidad con Barnyard2 y PulledPork.
Introducción
La presente guía instala un snort casi listo para entrar en producción según el uso al que se le haya destinado. En cierto momento del procedimiento descrito en esta guía, debe revisar la configuración de IDS con Snort en Debian o IPS con Snort en Debian
La presenta guía es básicamente una traducción de Snort 2.9.8.x on Ubuntu 12, 14, and 15 with Barnyard2, PulledPork, and Snorby, pero he ahorrado muchas explicaciones y tuve razones para no seguir el trabajo con Snorby a la espera de un nuevo lanzamiento
Primeros pasos
Consideramos la idea de trabajar en el directorio /usr/local/src
, lo que significa que todas las rutas relativas parten de ese directorio.
Considere que puede usar un servidor externo de postgres o mysql para como almacén para Barnyard.
Considere que el modo promiscuo de la tarjeta de red le permitirá esnifar paquetes en su mismo segmento de broadcast, usualmente un switch (Limitado aún más si este se encuentra configurado con VLAN), así que para capturar tráfico de otros segmentos de la red, debe configurar algo como Port Mirroring o usar algo como un Network Tap.
Instalación de software previo
Instalamos los paquetes de desarrollo y demás librerías que vamos a usar para el proceso de compilación
aptitude install libpcap-dev libpcre3-dev libdumbnet-dev build-essential flex bison zlib1g-dev liblzma-dev openssl libssl-dev autoconf libtool
Los siguientes paquetes sólo son necesarios cuando se piensa configurar a Snort como IPS, ya que son necesarios para activar el módulo NFQ en de DAQ
aptitude install libnfnetlink-dev libnetfilter-queue-dev
Sobre los paquetes para la posterior instalación de Barnyard2, existe una sutil diferencia sobre construirlo con soporte para mysql o postgres (O ambos a la vez) Además, si no se tiene un servidor mysql o postgres externo, será necesario instalar el paquete mysql-server o postgresql respectivamente.
aptitude install libmysqlclient-dev mysql-client aptitude install postgresql-client libpq-dev
Procedimiento
DAQ
Empezamos instalando el primer paquete dependencia: DAQ (Data Adquisition library) Obtenemos, configuramos, compilamos e instalamos:
wget https://www.snort.org/downloads/snort/daq-2.0.6.tar.gz tar -xzvf daq-2.0.6.tar.gz cd daq-2.0.6 ./configure make make install ldconfig
Como una nota, la construcción de los módulos va de la siguiente forma por defecto, y es de lo más interesante a cambiar en las opciones de ./configure
si se desea:
Build AFPacket DAQ module.. : yes Build Dump DAQ module...... : yes Build IPFW DAQ module...... : yes Build IPQ DAQ module....... : no Build NFQ DAQ module....... : no Build PCAP DAQ module...... : yes Build netmap DAQ module.... : no
Snort
Obtenemos, configuramos, compilamos e instalamos snort
cd /usr/local/src wget https://www.snort.org/downloads/snort/snort-2.9.8.0.tar.gz tar -xzvf snort-2.9.8.0.tar.gz cd snort-2.9.8.0 ./configure --enable-sourcefire make make install
La opción --enable-sourcefire
habilita las mismas configuraciones tal como la usa la gente de sourcefire, y parece que eso lo hace bastante recomendable en tanto son obviamente ellos los que lo hacen
Primeras configuraciones con snort
- Creamos los usuarios sin derechos administrativos con los cuales vamos a correr snort.
groupadd snort useradd snort -r -s /usr/sbin/nologin -c "Snort IDS" -g snort
- Crea los directorios de snort
mkdir -p /etc/snort/{rules{,/iplists},prepoc_rules,so_rules} mkdir /usr/local/lib/snort_dynamicrules
- Crea algunos archivos para almacenar reglas y listas IP
touch /etc/snort/{sid-msg.map,rules/{local.rules,iplists/{black,white}_list.rules}}
- Existen ficheros de configuración creados durante la compilación, los movemos a su nuevo hogar.
cp /usr/local/src/snort-2.9.8.0/etc/*.{conf*,map,dtd} /etc/snort/
- Crea los directorios para logging
mkdir -p /var/log/snort/archived_logs
- Ajusta la propiedade los algunos ficheros y directorios
chown -R snort:snort /etc/snort/ /var/log/snort/ /usr/local/lib/snort_dynamicrules/
Puede revisar que haya realizado bien los pasos anteriores al revisar el directorio con tree
root@snorti:/usr/src# tree /etc/snort/ /etc/snort/ ├── attribute_table.dtd ├── classification.config ├── file_magic.conf ├── gen-msg.map ├── prepoc_rules ├── reference.config ├── rules │ ├── iplists │ │ ├── black_list.rules │ │ └── white_list.rules │ └── local.rules ├── sid-msg.map ├── snort.conf ├── so_rules ├── threshold.conf └── unicode.map
Instalación de Barnyard2
- Obtenemos, extraemos, configuramos e instalamos Barnyard
cd /usr/local/src wget https://github.com/firnsy/barnyard2/archive/7254c24702392288fe6be948f88afb74040f6dc9.tar.gz -O barnyard2-2-1.14-336.tar.gz tar -xzvf barnyard2-2-1.14-336.tar.gz cd barnyard2-7254c24702392288fe6be948f88afb74040f6dc9/ ./configure --with-mysql --with-mysql-libraries=/usr/lib/`uname -m`-linux-gnu/ --with-postgresql autoreconf -fvi -I ./m4
- Lo siguiente según https://github.com/firnsy/barnyard2/issues/131
ln -s /usr/include/dumbnet.h /usr/include/dnet.h ldconfig
- Y ahora entramos a terrenos conocidos
./configure --with-mysql --with-mysql-libraries=/usr/lib/`uname -m`-linux-gnu/ --with-postgresql make make install
- Empezamos la configuración moviendo todos los ficheros a una ubicación compartida con snort:
cp barnyard2-7254c24702392288fe6be948f88afb74040f6dc9/etc/barnyard2.conf /etc/snort/ mkdir /var/log/barnyard2 touch /var/log/snort/barnyard2.waldo chown -R snort:snort -R /var/log/barnyard2 /var/log/snort/barnyard2.waldo
Configuración
- Abrimos el fichero de configuaración /etc/snort/barnyard2.conf
Hacia la línea 347 hallamos unos ejemplos de como configurar el acceso a la base de datos, básicamente pueden quedar de esta forma
# Por cierto, ambos pueden perfectamente funcionar al mismo tiempo, el uso de recursos puede hacer que esto no sea la mejor idea a implementar output database: log, postgresql, dbname=snorti host=192.168.2.3 user=snorti password=snorti output database: log, mysql, dbname=snorti host=192.168.2.3 user=snorti password=snorti
- Nos ocupamos de la base de datos a la cual hacemos referencia en el fichero de configuración de barnyard2
El administrador de la base de datos podría crear la base de datos de la siguiente forma:
# En caso de mysql administrador@bd:~$ mysql -u root -p mysql> create database snort; mysql> grant all privileges on snorto.* to snorto@'%' identified by 'snorto'; # En el caso de postgres root@bd:~# su - postgres postgres@bd:~$ createuser -DRSP snorto Ingrese la contraseña para el nuevo rol: Ingrésela nuevamente: postgres@bd:~$ createdb snorto -O snorto
- Creamos el esquema según el script que barnyard2 ofrece como usuario que nos han proporcionado:
# MySQL mysql -h 192.168.2.3 -u snorto -p snorto < /usr/local/src/barnyard2-7254c24702392288fe6be948f88afb74040f6dc9/schemas/create_mysql # Postgres psql -h 192.168.2.3 -U snorto snorto -f /usr/local/src/barnyard2-7254c24702392288fe6be948f88afb74040f6dc9/schemas/create_postgresql
- Configuramos snort para que use unified2, un formato binario en el que le es eficiente escribir, y del cuyos archivos resultantes se servirá barnyard para leer los datos.
Las lineas 521 y 522 del fichero de configuración en snort (/etc/snort/snort.conf) queda de la siguiente forma:
# output unified2: filename merged.log, limit 128, nostamp, mpls_event_types, vlan_event_types output unified2: filename snort.u2, limit 128
Pulledpork
La última etapa para obtener un IDS funcional son las reglas con las que trabaja. Pulledpork se encargará de obtener las últimas actualizaciones de las reglas de la comunidad, combinarlas con las nuestras y configurar el fichero /etc/snort/sid-msg.map
de una manera bastante automatizada.
wget https://github.com/shirkdog/pulledpork/archive/5d3a6b6359bfb09038bb2713bebe9099fbaf4f54.tar.gz tar xzvf 5d3a6b6359bfb09038bb2713bebe9099fbaf4f54.tar.gz cd pulledpork-5d3a6b6359bfb09038bb2713bebe9099fbaf4f54/ cp pulledpork.pl /usr/local/bin/ chmod +x /usr/local/bin/pulledpork.pl cp etc/* /etc/snort/ pulledpork.pl -V
Después de tan ardua instalación, probamos que funcione:
root@snorto:/usr/local/src/pulledpork-72d28b1a1c816509a52bf39c9dbabea98400e6a0# pulledpork.pl -V PulledPork v0.7.2 - E.Coli in your water bottle!
Configuración
Es altamente recomendable crear una cuenta en http://snort.org para obtener el código Oinkcode que PulledPork necesita para descargar las reglas oficiales. Las listas negras de Talos para uso del preprocesador reputation y las reglas de la comunidad snort son el resto de listas que PulledPork se encargará de integrar en nuestro IDS.
- Preconfiguramos el fichero al apuntar los archivos a nuestra verdadera ubicación
sed -i 's_/usr/local/etc/_/etc/_g' /etc/snort/pulledpork.conf
- Luego configuramos de la siguiente forma:
- Colocar el OinkCode en la línea 19 y 26, en lugar de <oinkcode>. Si no se desea registrar en http://snort.org, habrá que comentar estas líneas.
- Cambiar en la línea 96: sid_msg_version=1 a sid_msg_version=2
- Cambiar en la línea 133: distro a distro=Debian-8-0
- Cambiar la línea 141 para que quede black_list=/etc/snort/rules/iplists/black_list.rules
- Ejecutamos pulledPork por primera vez, con lo que verificamos la configuración:
pulledpork.pl -E -l -c /etc/snort/pulledpork.conf
Puesta en marcha.
Hasta ahora, tenemos ya todo listo para trabajar, por lo que el paso final es integrarlo al sistema por medio de systemd los unos y crontab el otro.
Para snort, creamos el fichero /lib/systemd/system/snort.service con el siguiente contenido:
[Unit] Description=Snort NIDS Daemon After=syslog.target network.target [Service] Type=simple ExecStart=/usr/local/bin/snort -q -u snort -g snort -c /etc/snort/snort.conf -i eth0 [Install] WantedBy=multi-user.target
Lo activamos para que inicie con el sistema y lo iniciamos por esta vez:
systemctl enable snort.service systemctl start snort.service
Para barnyard, creamos el fichero /lib/systemd/system/barnyard2.service con el siguiente contenido:
[Unit] Description=Barnyard2 Daemon After=syslog.target network.target [Service] Type=simple ExecStart=/usr/local/bin/barnyard2 -n -c /etc/snort/barnyard2.conf -d /var/log/snort -f snort.u2 -q -w /var/log/snort/barnyard2.waldo -g snort -u snort -D -a /var/log/snort/archived_logs [Install] WantedBy=multi-user.target
Activamos e iniciamos:
systemctl enable barnyard2.service systemctl start barnyard2.service
A PulledPork le colocamos en el crontab para que revise por nuevas reglas a diario.
echo -e '#!/bin/sh\n/usr/local/bin/pulledpork.pl -E -l -c /etc/snort/pulledpork.conf' > /etc/cron.daily/pulledpork