Implementación de un IDS (Snort)

Snorty

¿Pero qué es un sistema de detección de intrusiones?

 

Se conoce como sistema de detección de intrusiones (IDS) a un programa de detección de accesos no autorizados a un computador o a una red.

A modo de cultura general existen varios tipos de IDS……………, pero en esta entrada nos vamos a enfocar en Snort como NIDS (Sistema de detección de instrusiones basado en red).

Requerimientos

Sistema operativo …

Configuración del ambiente

# Install Updates and reboot:
sudo apt-get update
sudo apt-get dist-upgrade -y
sudo apt-get install -y openssh-server
sudo reboot

Configuración de la red

Algunas tarjetas de red tienen características denominadas «Descarga de recepción grande» (lro) y «Descarga de recepción genérica» (gro). Con estas funciones habilitadas, la tarjeta de red realiza el reensamblado de paquetes antes de que sean procesados por el kernel. De forma predeterminada, Snort truncará paquetes más grandes que el tamaño predeterminado de 1518 bytes. Además, LRO y GRO pueden causar problemas con el reensamblado basado en objetivos de Stream5. Recomendamos que apague LRO y GRO.

sudo apt-get install -y ethtool

user@snortserver:~$ sudo ifdown enp0s3 && sudo ifup enp0s3
user@snortserver:~$ ethtool -k enp0s3 | grep receive-offload
generic-receive-offload: off
large-receive-offload: off
user@snortserver:~$

Snort no necesita una dirección IP asignada a la interfaz en la que está escuchando, sin embargo, facilita la administración remota del sistema a través de ssh si se puede acceder a una interfaz. En un entorno de producción, se recomienda que use una interfaz en su servidor Snort para la administración y haga que Snort escuche en otras interfaces, pero esto no es necesario. Por defecto, Ubuntu usará DHCP para configurar automáticamente una dirección, si este es el caso, puede verificar su dirección IP ejecutando ifconfig enp0s3. Si no tiene un servidor DHCP que asigne direcciones IP, configure una en su sistema Snort manualmente. Necesitará conectividad a Internet para descargar los paquetes requeridos y las plataformas de software.

Una vez que haya iniciado sesión por primera vez y haya verificado la conectividad a Internet, asegúrese de que el sistema esté actualizado e instale el servidor openssh (para que podamos administrar el sistema de forma remota). Reinicie después de la instalación para asegurarse de que se aplican todos los parches.

Instalación de Prerequisitos de Snort

pcap, PCRE, Libdnet y DAQ.

sudo apt-get install -y build-essential git
sudo apt-get install -y libpcap-dev libpcre3-dev libdumbnet-dev

Muchas guías que instalan Snort en Ubuntu te hacen descargar libdnet desde su página de inicio http://libdnet.sourceforge.net/. Esto es posible y funcionará bien. Sin embargo, el paquete libdumbnet-dev Ubuntu proporciona el mismo software (no instale el paquete libdnet desde los archivos de Ubuntu, ya que es un paquete no relacionado y no proporciona las bibliotecas libdent necesarias). Si desea compilar las bibliotecas libdent desde la fuente y está ejecutando una versión de 64 bits de Ubuntu, use el indicador -fPIC durante la etapa de configuración.

En esta guía, descargaremos una serie de tarbals para varios paquetes de software. Crearemos una carpeta llamada snort src para guardarlas todas en un solo lugar:

mkdir ~/snort_src
cd ~/snort_src

Snort DAQ (biblioteca de adquisición de datos) tiene algunos requisitos previos que deben instalarse:

sudo apt-get install -y bison flex

Descargue e instale la última versión de DAQ desde el sitio web de Snort. Los pasos a continuación usan wget para descargar la versión 2.0.6 de DAQ, que es la última versión en el momento de escribir esta guía.

cd ~/snort_src
wget https://www.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

ls /usr/local/lib/daq

Para instalar Snort en Ubuntu, es necesario instalar un requisito previo adicional que no se menciona en la documentación: zlibg, que es una biblioteca de compresión.

Hay tres bibliotecas opcionales que mejoran la funcionalidad: liblzma-dev, que proporciona descompresión de archivos swf (adobe flash), openssl y libssl-dev, que proporcionan firmas de archivos SHA y MD5:

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

Instalación y Compilación de Snort

Ahora estamos listos para descargar el archivo fuente de Snort, compilar y luego instalar. La opción –enable-sourcefire proporciona Packet Performance Monitoring (PPM), que nos permite realizar una supervisión del rendimiento de las reglas y los preprocesadores, y crea Snort de la misma manera que lo hace el equipo de Snort:

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

*El paquete de la guia no esta actualizado, sustituir por este.

https://www.snort.org/downloads/archive/snort/snort-2.9.8.2.tar.gz

Si está interesado en ver las otras opciones de tiempo de compilación disponibles, ejecute ./configure –help para obtener una lista de todas las opciones de tiempo de compilación. El equipo de Snort ha intentado garantizar que la configuración predeterminada sea buena para la mayoría de las instalaciones básicas, por lo que no debería necesitar cambiar nada a menos que esté tratando de hacer algo especial.

Ejecute el siguiente comando para actualizar las bibliotecas compartidas (obtendrá un error cuando intente ejecutar Snort si omite este paso):

sudo ldconfig

Coloque un enlace simbólico al binario Snort en / usr / sbin:

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

Pruebe Snort ejecutando el binario como un usuario regular, pasándole la marca -V (que le dice a Snort que se verifique a sí mismo y que le pasen los archivos de configuración). Debería ver una salida similar a la que se muestra a continuación (aunque los números de versión exactos pueden ser ligeramente diferentes):

diego@ubuntuLab:~/snort_src/snort-2.9.8.2$ snort -V

Configuración de Snort para ejecutar en modo NIDS

Como no queremos que Snort se ejecute como root, necesitamos crear una cuenta y un grupo sin privilegios para que el daemon se ejecute bajo (snort: snort). También crearemos una serie de archivos y directorios requeridos por Snort, y estableceremos permisos para esos archivos. Snort tendrá los siguientes directorios: Configuraciones y archivos de reglas en / etc / snort Las alertas se escribirán en / var / log / snort Las reglas compiladas (reglas .so) se almacenarán en / usr / local / lib / snort_dynamicrules

# Create the snort user and group:
sudo groupadd snort
sudo useradd snort -r -s /sbin/nologin -c SNORT_IDS -g snort
# Create the Snort directories:
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
# Create some files that stores rules and ip lists
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/sid-msg.map
# Create our logging directories:
sudo mkdir /var/log/snort
sudo mkdir /var/log/snort/archived_logs
# Adjust permissions:
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

También queremos cambiar la propiedad de los archivos que creamos anteriormente para asegurarnos de que Snort pueda acceder a los archivos que utiliza:

# Change Ownership on folders:
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

Snort necesita algunos archivos de configuración y los preprocesadores dinámicos se copian del archivo fuente de Snort a la carpeta / etc / snort. Los archivos de configuración son:

Para copiar los archivos de configuración y los preprocesadores dinámicos, ejecute los siguientes comandos:

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

Nuestro listado de directorios de Snort se ve así:

diego@ubuntuLab:/etc/snort$ tree /etc/snort
/etc/snort

Ahora necesitamos editar el archivo de configuración principal de Snort, /etc/snort/snort.conf. Cuando ejecutamos Snort con este archivo como argumento, le dice a Snort que se ejecute en modo NIDS.

Debemos comentar todos los archivos de reglas individuales a los que se hace referencia en el archivo de configuración de Snort, ya que en lugar de descargar cada archivo individualmente, usaremos PulledPork para administrar nuestros conjuntos de reglas, que combina todas las reglas en un solo archivo. La siguiente línea comentará todos los conjuntos de reglas en nuestro archivo snort.conf:

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

Ahora cambiaremos manualmente algunas configuraciones en el archivo snort.conf, usando su editor favorito:

Cambie las siguientes líneas para adaptarse a su entorno: la Línea 45, HOME NET debe coincidir con su red interna (amigable). En el siguiente ejemplo, nuestro HOME NET es 10.0.0.0 con una máscara de subred de 24 bits (255.255.255.0):

ipvar HOME_NET 192.168.1.0/24

Nota: No debe configurar EXTERNAL NET en! $ HOME NET como se recomienda en algunas guías, ya que puede hacer que Snort no detecte alertas.

Not necessarily.

Your IDS won’t alert on an internal range attacking another internal range.

I’ve seen:

ipvar EXTERNAL_NET any

to be more expansive.

Nota: Es vital que HOME NET coincida con la subred IP de la interfaz en la que desea que Snort escuche. Por favor use ifconfig enp0s3 | grep «inet add» para asegurarse de que tiene la dirección y el conjunto de máscaras correctos. A menudo, esta será una dirección IP 192.168.1.xo 10.0.0.x.

Establezca las siguientes rutas de archivo en snort.conf, comenzando en la línea 104:

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

Para facilitar las pruebas de Snort, deseamos habilitar el archivo local.rules, donde podemos agregar reglas en las que Snort puede alertar. Anular el comentario (eliminar el símbolo de hash) de la línea 545 para que se vea así:

include $RULE_PATH/local.rules

Una vez que el archivo de configuración esté listo, haremos que Snort verifique que es un archivo válido y que todos los archivos necesarios a los que hace referencia sean correctos. Usamos el indicador -T para probar el archivo de configuración, el indicador -c para indicar a Snort qué archivo de configuración usar, y -i para especificar la interfaz en la que Snort escuchará (este es un nuevo requisito para el 2.9.8.x versión de snort). Ejecute sudo snort -T -c /etc/snort/snort.conf -i enp0s3. Ejecute este comando como se muestra a continuación y busque la siguiente salida (solo se muestran las últimas líneas de la salida para mayor claridad):

Rule application order: activation->dynamic->pass->drop->sdrop->reject->alert->log

Verifying Preprocessor Configurations!

pcap DAQ configured to passive.

Acquiring network traffic from «enp0s3».

Nota Desde Ubuntu 16.04: los nombres de la interfaz han cambiado y son específicos del sistema (ya no figuran como ethN). En el comando anterior, debe reemplazar eth0 con el nombre de su interfaz, como se muestra con el comando ifconfig (en mi caso es enp0s9).

Es una buena idea desplazarse hacia arriba a través de la salida de este comando para tener una idea de lo que Snort está cargando. Mucho de esto no tendrá sentido en este momento, pero será más claro a medida que trabaje más con Snort. Busque los errores y advertencias enumerados.

Escribir una regla simple para probar la detección de snort

En esta etapa, Snort no tiene ninguna regla cargada (nuestros archivos de reglas a los que se hace referencia en snort.conf están vacíos). Puede verificar que Snort no haya cargado ninguna regla si se desplaza hacia arriba en la salida del comando anterior y busca: 0 reglas de Snort leídas.

Para probar las capacidades de detección de Snort, creemos una regla simple que hará que Snort genere una alerta cada vez que Snort vea un mensaje de «solicitud de eco» o «respuesta de eco» ICMP, que es fácil de generar con la utilidad de ping ubicua (esto lo hace fácil prueba de la regla).

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

Barnyard2 no lee la metainformación sobre las alertas del archivo local.rules. Sin esta información, Barnyard2 no sabrá ningún detalle sobre la regla que activó la alerta y generará errores no fatales al agregar nuevas reglas con PulledPork (hecho en un paso posterior). Para asegurarse de que barnyard2 sepa que la regla que creamos con el identificador único 10000001 tiene el mensaje «Prueba de detección ICMP», así como otra información (consulte esta publicación del blog para obtener más información). Agregamos la siguiente línea al archivo /etc/snort/sid-msg.map:

sudo nano  /etc/snort/sid-msg.map

Cuando anuló la línea 545 sin comentar (incluya $ RULE PATH / local.rules) le estaba diciendo a Snort que Snort debería cargar el archivo local.rules. Cuando Snort carga ese archivo en el inicio, verá la regla que creó y la usará en todo el tráfico que vea la interfaz. En este caso, cuando creamos la regla, le dijimos a Snort que debería generar una alerta cuando vea un ping ICMP.

Como hicimos cambios en la configuración de Snort, deberíamos probar el archivo de configuración nuevamente:

Esta vez, si se desplaza hacia arriba a través de la salida, encontrará que se ha cargado una regla (la que creamos en local.rules y cargó con la directiva de inclusión en snort.conf):

Ahora que sabemos que Snort carga correctamente nuestra regla y nuestra configuración, podemos iniciar snort en modo NIDS y decirle que envíe las alertas directamente a la consola. Ejecutaremos Snort desde la línea de comando, usando las siguientes banderas:

Nota: Si está ejecutando Ubuntu 16.04, recuerde que el nombre de su interfaz no es enp0s9.

sudo /usr/local/bin/snort -A console -q -u snort -g snort -c /etc/snort/snort.conf -i enp0s3

Cuando ejecute esta línea, inicialmente no verá ninguna salida; sin embargo, Snort se está ejecutando, procesando todos los paquetes que llegan a enp0s3 (o la interfaz que haya especificado con el indicador -i), comparándolos con las reglas que ha cargado (en este nuestra única regla de ping ICMP), y luego imprimirá todas las alertas generadas cuando un paquete coincida con nuestra regla con la consola.

Desde otra computadora, haga ping a la dirección IP de enp0s3 en la computadora Snort (o haga ping de manera alternativa desde el host de Snort a otra máquina, o a su propia enp0s3, pero no a la interfaz de bucle de retorno), y debería ver la salida de la consola similar a la que se muestra a continuación (En el ejemplo siguiente, el servidor Snort está escuchando en enp0s3 con una dirección IP de 10.0.0.105, y la computadora que genera el ping es 10.0.0.59).