Detección de intrusos con Snort

En estos días donde todo esta globalizado y conectado es esencial la seguridad de nuestros sistemas, al igual que es muy necesario la configuración de un cortafuegos, como hablamos recientemente, también es importante tener un sistema habilitado para la detección de intrusos (IDS).

En el el caso de esta entrada veremos en que consiste un IDS, de uno de que utiliza licencias libres llamado Snort

Logo del producto Snort

¿En qué consiste un IDS y cómo funciona?

Hemos de partir de la base que aunque tengamos el cortafuegos habilitado, por normal general, tendremos muchos puertos habiertos, como por ejemplo el 80 y el 443 para las aplicaciones web. Por lo que debemos tener un sistema adicional que nos ayude a controlar estas puertas abiertas. Por lo que para llevar un mayor control debemos de utilizar un sistema IDS, esto es, un sistema de detección de intrusos y también de vulnerabilidades.

Existen los IDS activos y los pasivos. Con los primeros se genera entradas en el registro y se generan alertas. Con los segundos en cambio, además de realizar las mismas funciones que con el pasivo, también se generarían acciones, como bloquear direcciones IP o cerrar el acceso a puertos restringidos. 

Además desde el punto de vistra del programario (software) existen diferentes tipos de herramienta, los sistemas de detección de intrusos (HIDS), sistemas de detección de intrusos en red (IDPS), los sistemas de detección de intrusos basados en firmas (SIDS) y por último los sistemas de detección de intrusos basados en anomalías. Si quieres más información sobre los diferentes tipos de IDS, al final de la entrada os dejo más información.

Esqueda de sistema HIDS (Fuente Wikimedia)

Los sistemas IDS utilizan tres métodos para detectar el tráfico malévolo como diría el amigo RMS. Estos son la detección de anomalías, el análisis de protocolos y el análisis de firmas.

  • Con la detección de anomalías tenemos como objetivo detectar un comportamiento anormal. Ejemplo de ello sería un volumen de tráfico ICMP (el que usa ping) inusual y muy elevado, que nos indicaría que somos el blanco o el emisor de un ataque de DDoS (Denegación de servicio)
  • Respecto al análisis de protocolos se busca un tráfico de aplicación que no cumple el estándar del protocolo habitual.
  • Por último, el análisis de firmas permite identificar ataques o compartamientos perjudiciales ya publicados. Suele ser la técnica más eficaz y la que no está sujeta a errores, ya que sólo se generan ataques o intrusiones que ya han tenido éxito en otro lugar, por lo que, pueden ser fácilmente identificados.

Es importante que nuestro IDS actualice la información de forma habitual,  para así tener actualizadas siempre sus técnicas de análisis así como de las bases de datos de firmas.

Existen una serie de organizaciones, asociaciones y empresas que nos permisos estar al corriente de las evoluciones en materia de técnicas de intrusión y ataques. Las principales son:

Snort, el IDS más popular

Cómo hemos dicho Snort es uno de los IDS más populares, además es software libre, ya que utiliza una licencia GPL.  Se encarga de analizar todo el tráfico y aporta un complementos de seguridad apreciable en la red. Ofrece la capacidad de almacenamiento de bitácoras en archivos de texto y en bases de datos abiertas, como MySQL o MariaDB. Además implementa un motor de detección de ataques y escaneo de puertos que permite registrar, alertar y responder ante cualquier anomalía previamente definida.

Se compone de un servicio y de archivos de configuración generalmente ubicados en /etc/snort. Su fichero de configuración prinicpal es snort.conf y las reglas se guardan en la carpeta rules.

El comando principal es oinkmaster que sirve para actualizar las reglas que tenemos indicas en el fichero de configuración oinkmaster.conf

¿Cómo funciona Snort?

Snort utiliza archivos de reglas, como hemos comentado antes, que se deben descargar del sitio web del editor. Aunque más adelante os explicaré como utilizar la herramienta Snorter, que facilita su gestión, es importante saber cómo funciona Snort.

Veamos cómo se presentan las reglas en el fichero oinkmaster.conf

url = https://www.snort.org/snort-rules/archivo_de_reglas

En el archivo_de_reglas se representa el archivo con las reglas en formato tar.gz Debemos tener en cuenta que hay que estar suscrito al editor, aunque hay otras páginas web que ofrecen archivos de actualización de forma gratuita.

Para cargar las reglas desde el directorio de reglas, lo haremos así:

oinkmaster -o dir_reglas

Gestionando las alertas

Una vez ya tenemos el sistema funcionando, cuando detecta tráfico perjudicial, dejará una traza en el archivo de registro, a través de syslog y enviará una copia del paquete en un archivo con formato tcpdump, que es compatible con Wireshark, al utilizar el formato lippcap. Aunque como hemos dicho también se puede enviar a información a una base de datos, como MySQL/MariaDB.

Instalación manual de Snort

Veamos la instalación manual del producto sobre un sistema con Debian 10. Primero de todo debemos instalar los siguientes paquetes previos, que nos servirán para poder compilar la herramienta desde el código fuente:

sudo apt install -y gcc libpcre3-dev zlib1g-dev libluajit-5.1-dev 
sudo apt install libpcap-dev openssl libssl-dev libnghttp2-dev libdumbnet-dev 
sudo apt install bison flex libdnet autoconf libtool

Creamos el directorio de trabajo:

mkdir ~/snort_src && cd ~/snort_src

El propio Snort utiliza algo llamado biblioteca de adquisición de datos (DAQ) para realizar llamadas abstractas a bibliotecas de captura de paquetes. Debemos descargar el paquete fuente de DAQ más reciente del sitio web de Snort con el comando wget.

Descargamos la última versión, a fecha de esta entrada:

wget https://www.snort.org/downloads/snort/daq-2.0.7.tar.gz

Descomprimimos:

tar xvzf daq-2.0.7.tar.gz

Antes de continuar, la última versión requiere un paso adicional para reconfigurar automáticamente DAQ antes de ejecutar la configuración. Usamos el comando a continuación que requiere que tenga instalados autoconf y libtool.

autoreconf -f -i

Accedemos a la carpeta y compilamos:

cd daq-2.0.7
./configure
make
sudo make install

Volvemos a la carpeta inicial y descargamos la última versión de Snort

cd ..
wget https://www.snort.org/downloads/snort/snort-2.9.16.1.tar.gz

Una vez descargada la última versión, descomprimirmos y compilamos:

tar xvzf snort-2.9.16.1.tar.gz
cd snort-2.9.16.1
./configure --enable-sourcefire && make && sudo make install

La instalación puede tardar un rato, depende la potencia del equipo.

Creando árbol de ficheros y asignando permisos

Creamos el usuario y el grupo corresponde para trabajar con la aplicación:

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

Creamos las carpetas donde se guardarán las reglas:

sudo mkdir -p /etc/snort/rules
sudo mkdir /var/log/snort
sudo mkdir /usr/local/lib/snort_dynamicrules

Asignamos los permisos:

sudo chmod -R 5775 /etc/snort
sudo chmod -R 5775 /var/log/snort
sudo chmod -R 5775 /usr/local/lib/snort_dynamicrules
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

Creamos los ficheros de reglas, de momento vacíos:

sudo touch /etc/snort/rules/white_list.rules
sudo touch /etc/snort/rules/black_list.rules
sudo touch /etc/snort/rules/local.rules

Por último en esta parte copiamos los ficheros de configuración:

sudo cp ~/snort_src/snort-2.9.16.1/etc/*.conf* /etc/snort
sudo cp ~/snort_src/snort-2.9.16.1/etc/*.map /etc/snort

Configuración de Snort

Una vez instalado el producto, ya podemos actualizar la información desde el portal de Snort, para ello debemos obtener un código llamado OINKMODE. Para obtenerlo solo debemos registrarnos en su web, que es gratuito y de esa manera obtendenremos dicho código. Una vez ya lo tengamos podemos utilizarlo:

#A modo de ejemplo
wget https://www.snort.org/rules/snortrules-snapshot-2983.tar.gz?oinkcode=nuestro-codigo \
-O snortrules-snapshot-2983.tar.gz

Una vez hecho esto descomprimirmos los ficheros dentro de la carpeta rules:

tar -xvzf snortrules-snapshot-.tar.gz -C /etc/snort/rules

Configurando la red

Todavía falta la parte donde debemos indicar en que interfaz queremos que el sistema escuche. Con los archivos de configuración y reglas en su lugar, editamos el fichero snort.conf para modificar algunos parámetros. Abrimos el archivo de configuración en nuestro editor de texto favorito, por ejemplo:

sudo vi /etc/snort/snort.conf

Indicamos la red de nuestra casa u oficina:

# Setup the network addresses you are protecting
ipvar HOME_NET 192.168.0.0/24

Además indicamos la siguiente información:

# Set up the external network addresses. Leave as "any" in most situations
ipvar EXTERNAL_NET !$HOME_NET
# Path to your rules files (this can be a relative path)
var RULE_PATH /etc/snort/rules
var SO_RULE_PATH /etc/snort/so_rules
var PREPROC_RULE_PATH /etc/snort/preproc_rules
# Set the absolute path appropriately
var WHITE_LIST_PATH /etc/snort/rules
var BLACK_LIST_PATH /etc/snort/rules

En el mismo archivo snort.conf, nos desplazamos hacia abajo hasta la sección 6 y configuramos la salida para que unified2 inicie sesión con el nombre de archivo snort.log como se muestra a continuación:

# unified2
# Recommended for most installs
output unified2: filename snort.log, limit 128

Por último, nos movemos hacia la parte inferior del archivo para encontrar la lista de reglas incluidas. Debemos descomentar local.rules para permitir que Snort cargue las reglas personalizadas.

include $RULE_PATH/local.rules

Si utilizamos las reglas comunitarias:

include $RULE_PATH/community.rules

Validar la configuración

Ahora viene la prueba de prueba de fuego, y es validar la configuración:

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

Con un resultado, en mi caso:

Resultado test configuración Snort

Trabajar con Snort en segundo plano

Creamos el fichero de configuración para la unidad de servicio con Systemd:

sudo vi /lib/systemd/system/snort.service

Con el 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

Una vez hecho esto habilitamos el servicio y lo encendemos:

sudo systemctl enable snort.service
sudo systemctl start snort.service

Facilitando la gestión con Snorter

Como hemos visto gestionar Snort puede ser algo complejo y farragoso. Para facilitar nuestro trabajo podemos tirar de la herramienta Snorter. Se trata de un guión o script que se encarga de instalar y configurar, de forma básica, este IDS. Además instalará programas adicionales, para sacar todo su jugo a este sistema de detección de instrusos.

Veamos cuales son, además de Snort, del que ya hemos hablado:

  •  Barnyard2 es un intérprete de código abierto para archivos de salida binarios unified2 de Snort. Su uso principal es permitir que Snort escriba en el disco de manera eficiente y dejando la tarea de analizar datos binarios en varios formatos a una proceso que no hará que Snort pierda tráfico de red. Más info podemos consultar su página en Github (https://github.com/firnsy/barnyard2)
  • Pulledpork se encarga de la gestión de las reglas. Descargará reglas predefinidas para que las pueda utilizar Snort. Para más info también podemos consultar su página en Github (https://github.com/shirkdog/pulledpork)
  • Websnort proporciona una interfaz web para que el usuario y el sistema envíen archivos de captura de paquetes para ejecutarlos en instancias de IDS. Las alertas y los detalles del análisis se devuelven como resultados. Página de Github (https://github.com/shendo/websnort)

Trabajando con Snorter

Este script es compatible, según indica en la web, con varios sistemas GNU/Linux . Entre los que han sido probados encontramos:

  • Debian 9.0
  • Ubuntu 18.04
  • Kali Linux en su versión Rolling Release.
  • Raspberry Pi con Raspbian en sus últimas versiones.

También se puede utilizar su versión para Docker.

En cualquier caso, para todas las versiónes GNU/Linux compatibles debemos descargar los archivos del proyecto:

git clone https://github.com/joanbono/Snorter.git
cd Snorter/src

Una vez hecho esto ya podemos utilizar el guión de instalación:

bash Snorter.sh -h

En cualquier caso es recomendable utilizar un OINKCODE, que nos permitirá utilizar nuestra cuenta de Snort y así tener el sistema actualizado con las últimas reglas. De esta forma:

bash Snorter.sh -o "oinkcode" -i "interfaz"

Para conseguir el código «oinkcode» debemos registrarnos en la página web del proyecto, esto es gratuito. Una vez regitrados el código nos aparecerá en un apartado de nuestro perfil.

Y esto es todo, espera que esta información os sea de utilidad en algun momento.

Fuentes consultadas

Proyecto web de Snorter

Ciberseguridad.com – Sistema de detección de intrusos IDS

A2secure.com – Sistemas IDS, IPS, HIDS, NIPS, SIEM ¿Qué son?

Documentación Red Hat

Upcloud.com – Install Snort in Debian