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
¿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.
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:
- Bugtraq: Es una lista de difusión dedicada a la publicación de vulnerabilidades, su uso y corrección. (https://www.securityfocus.com/)
- CERT: Computer Emergency Response Team. Se trata de una organización que estudia las vulnerabilidades, investiga las evolucaciones en términos de redes y seguridad y ofrece servicios relacionados con la seguridad. (Entrada de Wikipedia al respecto)
- CIAC: Computer Incident Advisory Capability. Una organización de alerta e investigación gestionado por el departament de energía de Estados Unidos. (https://www.energy.gov/cio/about-our-services/integrated-joint-cybersecurity-coordination-center)
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:
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
Ciberseguridad.com – Sistema de detección de intrusos IDS
A2secure.com – Sistemas IDS, IPS, HIDS, NIPS, SIEM ¿Qué son?
Upcloud.com – Install Snort in Debian