viernes, 2 de marzo de 2018

Setup de un IDS Snort en un dispositivo ARM (I): básico

Un sistema de detección de intrusiones (Intrusion Detection System, IDS) es un sistema software o hardware que automatiza el proceso de monitorización de eventos de red o en el computador, analizandolos con objeto de encontrar trazas de problemas de seguridad.

Desde sus inicios en 1998 Snort ha sido la solución IDS/IPS de referencia. Snort, en su versión actual 2.9.9, es un motor de análisis mono hilo extremadamente eficiente, con un rendimiento que permite el análisis de paquetes en redes con un ancho de banda en torno a 200-500Mbits/s.


Publicaré una serie de post sobre Snort en ARM que abarcan desde la instalación básica (en este capítulo), actualización automática de reglas, copia de logs a BD con Barnyard2 e incluso una prueba de concepto. Como colofón, se podría crear un punto de acceso WiFi con Snort monitorizando la entrada y salida de la red. Algo tal que así:


Requisitos previos


Para la puesta en marcha del IDS Snort en un equipo con arquitectura ARM y sistema operativo Ubuntu Server 16.04 LTS (ARMBIAN) deberemos descargar la imagen ISO correspondiente a la distribución ARMBIAN para la SBC (Single Board Computer) que vayamos a utilizar del sitio web de Armbian (https://www.armbian.com/download/). En mi caso, usaré una Orange Pi Plus 2E.

Una vez descargado, montaremos la imagen ISO en la tarjeta SD usando el comando dd en Linux o con la aplicación Win32DiskImage.exe en Windows.

El siguiente paso será conectar nuestro micro ordenador al router (ADSL o fibra) por red ethernet.


Es importante indicar que partimos de un router con configuración para DHCP, de forma que nuestro equipo podrá adquirir los datos de red necesarios para disponer de conectividad.

¿Y ahora cómo nos conectamos al dispositivo?


Por defecto, ARMBIAN viene preconfigurado con OPENSSH, con lo cual podremos fácilmente conectarnos a la SBC con el usuario root y su password 1234.


Una vez dentro, procederemos a cambiar la clave de root, crear un usuario sudoer y establecer su clave de acceso.

# cambiar clave de root
passwd root
# crear usuario sudoer
useradd homeids --home=/home/homeids --shell=/bin/bash
# darle permisos de sudo
usermod -aG sudo homeids
# establecer la clave del usuario
passwd homeids

Desde este momento nos conectaremos con el usuario homeids.

Y para finalizar estos primeros pasos, tendremos que asegurarnos que sus repositorios de instalación (apt-get) se encuentran actualizados realizando los siguientes comandos y reiniciando el equipo:

# Instalar actualizaciones
sudo apt-get update
sudo apt-get dist-upgrade -y
sudo apt-get install -y openssh-server
# y reiniciar
sudo reboot

Y el último paso antes de proceder con la instalación de paquetes es el de asegurarnos de tener instalado todo lo necesario para la compilación y generación de los ejecutables con build-essentials:

sudo apt-get install -y build-essential

Ya estamos en condiciones de instalar el software necesario.


Instalando Snort

Entre los prerequisitos de Snort nos encontramos con las librerias pcap (libpcap-dev), PCRE (libpcre3-dev), Libdnet (libdumbnet-dev) y su DAQ para la adquisición de paquetes. Afortunadamente tanto pcap como PCRE y Libdnet estan disponibles desde los repositorios de Ubuntu por lo que solo debemos hacer uso de apt-get.

# librerias pcap como PCRE y Libdnet
sudo apt-get install -y libpcap-dev libpcre3-dev libdumbnet-dev
#pre requisistos de DAQ
sudo apt-get install -y bison flex


A continuación descargaremos e instalaremos la librería DAQ 2.0.6:


wget https://snort.org/downloads/snort/daq-2.0.6.tar.gz
tar -xvzf daq-2.0.6.tar.gz
cd daq-2.0.6
./configure
make
sudo make install

Para mejorar la funcionalidad, los manuales oficiales de Snort recomiendan la instalación de las siguientes librerías.

sudo apt-get install -y zlib1g-dev liblzma-dev openssl libssl-dev libnghttp2-dev

Descarga, compilación e instalación de Snort con Packet Performance Monitoring (PPM), el cual nos permite realizar pruebas de rendimiento y monitorización de reglas y preprocesadores.

wget https://snort.org/downloads/snort/snort-2.9.9.0.tar.gz
tar -xvzf snort-2.9.9.0.tar.gz
cd snort-2.9.9.0
./configure --enable-sourcefire
make
sudo make install

Y tras esto ejecutamos el siguente comando para actualizar las librerias compartidas:



sudo ldconfig

Creación del enlace simbólico en /usr/sbin:



sudo ln -s /usr/local/bin/snort /usr/sbin/snort

Y ya estamos en condiciones de ver si Snort está correctamente habilitado en el sistema consultando su version con el siguiente comando:



snort -V

Esto nos mostrará un mensaje tal que as:




A continuación crearemos los permisos, archivos y directorios necesarios.

Comenzamos con la creación del usuario y grupo snort:


sudo groupadd snort
sudo useradd snort -r -s /sbin/nologin -c SNORT_IDS -g snort

Continuamos con la creación de los directorios de trabajo


sudo mkdir /etc/snort
sudo mkdir /etc/snort/rules
sudo mkdir /etc/snort/rules/iplists
sudo mkdir /etc/snort/preproc_rules
sudo mkdir /usr/local/lib/snort_dynamicrules
sudo mkdir /etc/snort/so_rules

Creamos los ficheros básicos que usa snort:


sudo touch /etc/snort/rules/iplists/black_list.rules
sudo touch /etc/snort/rules/iplists/white_list.rules
sudo touch /etc/snort/rules/local.rules
sudo touch /etc/snort/rules/snort.rules
sudo touch /etc/snort/sid-msg.map
sudo touch /etc/snort/sid-msg1.map

Creación del directorio de logs:

sudo chmod -R 5775 /etc/snort
sudo chmod -R 5775 /var/log/snort
sudo chmod -R 5775 /var/log/snort/archived_logs
sudo chmod -R 5775 /etc/snort/so_rules
sudo chmod -R 5775 /usr/local/lib/snort_dynamicrules

Y finalmente asiganción de permisos a los directorios y archivos creados:

sudo chown -R snort:snort /etc/snort
sudo chown -R snort:snort /var/log/snort
sudo chown -R snort:snort /usr/local/lib/snort_dynamicrules


Pero claro, los archivos que tenemos actualmente en el directorio de snort estan vacios, por lo que copiaremos la configuración por defecto del directorio de instalación:


cd ~/snort-2.9.9.0/etc/
sudo cp *.conf* /etc/snort
sudo cp *.map /etc/snort
sudo cp *.dtd /etc/snort
cd ~/snort-2.9.9.0/src/dynamic-preprocessors/build/usr/local/lib/snort_dynamicpreprocessor/
sudo cp * /usr/local/lib/snort_dynamicpreprocessor/

Ya solo nos queda configurar Snort.


Configuración de Snort

La configuración de Snort, por defecto, suele estar en el fichero /etc/snort/snort.conf (que anteriormente hemos copiado). Lo primero será comentar todas las lineas de reglas del fichero


sudo sed -i "s/include \$RULE\_PATH/#include \$RULE\_PATH/" /etc/snort/snort.conf

A continuación, editamos el fichero para realizar los siguientes cambios:


sudo nano /etc/snort/snort.conf


En la línea 45 indicaremos la red local (por regla general será 192.168.1.0/24)


ipvar HOME_NET 192.168.1.0/24


En la lineas lineas desde posteriores a la 104 editaremos las siguientes propiedades:


var RULE_PATH /etc/snort/rules
var SO_RULE_PATH /etc/snort/so_rules
var PREPROC_RULE_PATH /etc/snort/preproc_rules
var WHITE_LIST_PATH /etc/snort/rules/iplists
var BLACK_LIST_PATH /etc/snort/rules/iplists


Y descomentamos la linea 521 configurar formato de salida (añadir la siguiente línea):


output unified2: filename snort.u2, limit 128

Descomentamos la línea 546:



include $RULE_PATH/local.rules


Y añadiremos el fichero donde PulledPork almacenará las reglas descargadas en la línea 547:

include $RULE_PATH/snort.rules

Para finalizar, añadiremos una linea de pruebas al fichero /etc/snort/rules/local.rules, en concreto, una que nos alertará del uso del protocolo ICMP (ping):

alert icmp any any -> $HOME_NET any (msg:"ICMP test detected"; GID:1; sid:10000001; rev:001; classtype:icmp-event;)


Y en tanto el fichero /etc/snort/sid-msg.map como en el /etc/snort/sid-msg1.map las siguientes lineas:

#v2
1 || 10000001 || 001 || icmp-event || 0 || ICMP Test detected || url,tools.ietf.org/html/rfc792


Ya estaremos en condiciones de probar la configuración con:

sudo snort -T -c /etc/snort/snort.conf -i eth0


Para ejecutar snort, ejecutaremos el comando:

sudo /usr/local/bin/snort -q -u snort -g snort -c /etc/snort/snort.conf -i eth0

Donde eth0 es la interfaz que queremos monitorizar (eth0 para la lan, y wlan0 para la WiFi).