Instalar y configurar el sistema de detección de intrusiones Snort 3 en Ubuntu 22.04
Snort es un sistema de prevención y detección de intrusiones (IDS) de código abierto para defenderse de los ataques DDoS. Utiliza reglas incorporadas que ayudan a definir la actividad maliciosa de la red y utiliza esas reglas para encontrar paquetes que coincidan con ellas y genera alertas para los usuarios. Snort puede identificar los últimos ataques, las infecciones de malware, los sistemas comprometidos y las violaciones de las políticas de red.
Características
- Monitorización del tráfico en tiempo real.
- Registro de paquetes. Análisis de protocolo.
- Coincidencia de contenido. Toma de huellas del sistema operativo.
- Se puede instalar en cualquier entorno de red.
- Crea registros.
En este tutorial, te mostraremos cómo instalar Snort en Ubuntu 22.04.
Requisitos previos
- Un servidor con Ubuntu 22.04.
- Una contraseña de root configurada en el servidor.
Instalar las dependencias necesarias
Antes de empezar, necesitarás instalar algunas dependencias en tu servidor. Puedes instalarlas todas ejecutando el siguiente comando:
apt install build-essential libpcap-dev libpcre3-dev libnet1-dev zlib1g-dev luajit hwloc libdnet-dev libdumbnet-dev bison flex liblzma-dev openssl libssl-dev pkg-config libhwloc-dev cmake cpputest libsqlite3-dev uuid-dev libcmocka-dev libnetfilter-queue-dev libmnl-dev autotools-dev libluajit-5.1-dev libunwind-dev libfl-dev -y
Una vez instaladas todas las dependencias, puedes pasar al siguiente paso.
Instalar Snort DAQ
A continuación, tendrás que instalar la biblioteca de Adquisición de Datos en tu sistema. Por defecto, no está disponible en el repositorio por defecto de Ubuntu. Así que tendrás que compilarla desde el código fuente.
Primero, descarga el DAQ de Snort desde Git con el siguiente comando:
git clone https://github.com/snort3/libdaq.git
Una vez completada la descarga, navega al directorio descargado y configúralo con el siguiente comando:
cd libdaq ./bootstrap ./configure
Deberías ver la siguiente salida:
cc: gcc cppflags: am_cppflags: -fvisibility=hidden -Wall -Wmissing-declarations -Wpointer-arith -Wcast-align -Wcast-qual -Wformat -Wformat-nonliteral -Wformat-security -Wundef -Wwrite-strings -Wextra -Wsign-compare -Wno-unused-parameter -fno-strict-aliasing -fdiagnostics-show-option cflags: -g -O2 am_cflags: -Wstrict-prototypes -Wmissing-prototypes -Wold-style-definition -Wnested-externs ldflags: am_ldflags: libs: code_coverage_enabled: no code_coverage_cppflags: code_coverage_cflags: code_coverage_ldflags: Build AFPacket DAQ module.. : yes Build BPF DAQ module....... : yes Build Divert DAQ module.... : no Build Dump DAQ module...... : yes Build FST DAQ module....... : yes Build netmap DAQ module.... : no Build NFQ DAQ module....... : yes Build PCAP DAQ module...... : yes Build Savefile DAQ module.. : yes Build Trace DAQ module..... : yes Build GWLB DAQ module...... : yes
A continuación, instálalo con el siguiente comando
make make install
Instalar Gperftools
Primero, descarga la última versión de Gperftools con el siguiente comando:
cd wget https://github.com/gperftools/gperftools/releases/download/gperftools-2.9.1/gperftools-2.9.1.tar.gz
Una vez completada la descarga, extrae el archivo descargado con el siguiente comando:
tar xzf gperftools-2.9.1.tar.gz
A continuación, navega hasta el directorio descargado y compílalo con el siguiente comando:
cd gperftools-2.9.1/ ./configure
A continuación, instálalo con el siguiente comando:
make make install
Instalar Snort
A continuación, descarga la última versión de Snort con el siguiente comando
cd wget https://github.com/snort3/snort3/archive/refs/tags/3.1.43.0.tar.gz
A continuación, extrae el archivo descargado con el siguiente comando
tar -xvzf 3.1.43.0.tar.gz
A continuación, navega hasta el directorio extraído y configúralo con el siguiente comando
cd snort3-3.1.43.0 ./configure_cmake.sh --prefix=/usr/local --enable-tcmalloc
Obtendrás la siguiente salida:
snort version 3.1.43.0 Install options: prefix: /usr/local includes: /usr/local/include/snort plugins: /usr/local/lib/snort Compiler options: CC: /usr/bin/cc CXX: /usr/bin/c++ CFLAGS: -fvisibility=hidden -DNDEBUG -g -ggdb -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-free -O2 -g -DNDEBUG CXXFLAGS: -fvisibility=hidden -DNDEBUG -g -ggdb -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-free -O2 -g -DNDEBUG EXE_LDFLAGS: MODULE_LDFLAGS: Feature options: DAQ Modules: Static (afpacket;bpf;dump;fst;gwlb;nfq;pcap;savefile;trace) libatomic: System-provided Hyperscan: OFF ICONV: ON Libunwind: ON LZMA: ON RPC DB: Built-in SafeC: OFF TCMalloc: ON JEMalloc: OFF UUID: ON ------------------------------------------------------- -- Configuring done -- Generating done -- Build files have been written to: /root/snort3-3.1.43.0/build
A continuación, cambia el directorio al directorio de construcción e instala el Snort con el siguiente comando:
cd build make make install ldconfig
Ahora puedes verificar la versión de Snort con el siguiente comando:
snort -V
Obtendrás la siguiente salida:
,,_ -*> Snort++ <*- o" )~ Version 3.1.43.0 '''' By Martin Roesch & The Snort Team http://snort.org/contact#team Copyright (C) 2014-2022 Cisco and/or its affiliates. All rights reserved. Copyright (C) 1998-2013 Sourcefire, Inc., et al. Using DAQ version 3.0.9 Using LuaJIT version 2.1.0-beta3 Using OpenSSL 3.0.2 15 Mar 2022 Using libpcap version 1.10.1 (with TPACKET_V3) Using PCRE version 8.39 2016-06-14 Using ZLIB version 1.2.11 Using LZMA version 5.2.5
Configurar Snort
En primer lugar, tendrás que configurar tu interfaz de red en modo promiscuo para que pueda ver todo el tráfico de red que se le envía.
Puedes configurarlo con el siguiente comando:
ip link set dev eth0 promisc on
Ahora puedes comprobarlo con el siguiente comando:
ip add sh eth0
A continuación, también tendrás que desactivar la Descarga de la Interfaz. En primer lugar, comprueba si esta función está activada o no mediante el siguiente comando:
ethtool -k eth0 | grep receive-offload
Obtendrás la siguiente salida:
generic-receive-offload: on large-receive-offload: off [fixed]
Ahora puedes desactivarla con el siguiente comando:
ethtool -K eth0 gro off lro off
Crear un archivo de servicio Systemd para Snort NIC
A continuación, tendrás que crear un archivo de servicio systemd para Snort NIC.
nano /etc/systemd/system/snort3-nic.service
Añade las siguientes líneas:
[Unit] Description=Set Snort 3 NIC in promiscuous mode and Disable GRO, LRO on boot After=network.target [Service] Type=oneshot ExecStart=/usr/sbin/ip link set dev eth0 promisc on ExecStart=/usr/sbin/ethtool -K eth0 gro off lro off TimeoutStartSec=0 RemainAfterExit=yes [Install] WantedBy=default.target
Guarda y cierra el archivo, luego recarga el demonio systemd para aplicar los cambios:
systemctl daemon-reload
A continuación, inicia y habilita a Snort con el siguiente comando:
systemctl start snort3-nic.service systemctl enable snort3-nic.service
Puedes comprobar el estado de Snort con el siguiente comando:
systemctl status snort3-nic.service
Obtendrás la siguiente salida:
? snort3-nic.service - Set Snort 3 NIC in promiscuous mode and Disable GRO, LRO on boot Loaded: loaded (/etc/systemd/system/snort3-nic.service; disabled; vendor preset: enabled) Active: active (exited) since Tue 2022-10-11 16:24:15 UTC; 6s ago Process: 95745 ExecStart=/usr/sbin/ip link set dev eth0 promisc on (code=exited, status=0/SUCCESS) Process: 95746 ExecStart=/usr/sbin/ethtool -K eth0 gro off lro off (code=exited, status=0/SUCCESS) Main PID: 95746 (code=exited, status=0/SUCCESS) CPU: 11ms Oct 11 16:24:15 ubuntu2204 systemd[1]: Starting Set Snort 3 NIC in promiscuous mode and Disable GRO, LRO on boot... Oct 11 16:24:15 ubuntu2204 systemd[1]: Finished Set Snort 3 NIC in promiscuous mode and Disable GRO, LRO on boot.
Instalar las reglas de Snort
Las reglas son muy importantes para el motor de detección de intrusos Snorts. Primero, crea un directorio para almacenar todas las reglas:
mkdir /usr/local/etc/rules
A continuación, descarga las reglas de la comunidad con el siguiente comando:
wget -qO- https://www.snort.org/downloads/community/snort3-community-rules.tar.gz | tar xz -C /usr/local/etc/rules/
A continuación, edita el archivo de configuración principal de Snort:
nano /usr/local/etc/snort/snort.lua
Define tu red como se muestra a continuación:
HOME_NET = '192.168.56.124/32' EXTERNAL_NET = '!$HOME_NET'
A continuación, define la ruta de tus reglas Snort:
ips = { -- use this to enable decoder and inspector alerts --enable_builtin_rules = true, -- use include for rules files; be sure to set your path -- note that rules files can include other rules files -- (see also related path vars at the top of snort_defaults.lua) variables = default_variables, rules = [[ include /usr/local/etc/rules/snort3-community-rules/snort3-community.rules ]] }
Guarda y cierra el archivo cuando hayas terminado.
Instalar Snort OpenAppID
OpenAppID es un plugin que permite a Snort detectar varias aplicaciones, Facebook, Netflix, Twitter y Reddit, utilizadas en la red.
Puedes descargarlo con el siguiente comando:
wget https://www.snort.org/downloads/openappid/26425 -O OpenAppId-26425.tgz
Una vez completada la descarga, extrae el archivo descargado con el siguiente comando:
tar -xzvf OpenAppId-26425.tgz
A continuación, copia el archivo binario de OpenAppID al directorio del sistema:
cp -R odp /usr/local/lib/
A continuación, edita el archivo de configuración de Snort y define tu ubicación de OpenAppID:
nano /usr/local/etc/snort/snort.lua
Cambia las siguientes líneas:
appid = { app_detector_dir = '/usr/local/lib', log_stats = true, }
Guarda y cierra el archivo, luego crea un directorio de registro de Snort:
mkdir /var/log/snort
Por último, verifica el archivo de configuración de Snort con el siguiente comando:
snort -c /usr/local/etc/snort/snort.lua
Si todo está bien, obtendrás la siguiente salida:
-------------------------------------------------- fast pattern groups src: 59 dst: 158 any: 4 to_server: 56 to_client: 39 -------------------------------------------------- search engine instances: 316 patterns: 10282 pattern chars: 166369 num states: 112212 num match states: 9885 memory scale: MB total memory: 3.42574 pattern memory: 0.550588 match list memory: 1.25256 transition memory: 1.58402 fast pattern only: 6822 -------------------------------------------------- pcap DAQ configured to passive. Snort successfully validated the configuration (with 0 warnings). o")~ Snort exiting
Crear reglas personalizadas de Snort
También puedes crear tus propias reglas personalizadas según tus necesidades. Vamos a crear una regla personalizada para las peticiones ICMP entrantes:
nano /usr/local/etc/rules/local.rules
Añade la siguiente línea:
alert icmp any any -> $HOME_NET any (msg:"ICMP connection test"; sid:1000001; rev:1;)
A continuación, verifica las reglas con el siguiente comando:
snort -c /usr/local/etc/snort/snort.lua -R /usr/local/etc/rules/local.rules
Obtendrás la siguiente salida:
search engine instances: 316 patterns: 10282 pattern chars: 166369 num states: 112212 num match states: 9885 memory scale: MB total memory: 3.42574 pattern memory: 0.550588 match list memory: 1.25256 transition memory: 1.58402 fast pattern only: 6822 -------------------------------------------------- pcap DAQ configured to passive. Snort successfully validated the configuration (with 0 warnings). o")~ Snort exiting
A continuación, ejecuta el siguiente comando para iniciar el Snort en tu interfaz de red utilizando tus reglas personalizadas:
snort -c /usr/local/etc/snort/snort.lua -R /usr/local/etc/rules/local.rules -i eth0 -A alert_fast -s 65535 -k none
A continuación, abre otra interfaz de terminal y haz un ping a tu servidor. Deberías ver el error ICMP en el primer terminal:
10/11-16:45:23.848071 [**] [1:1000001:1] "ICMP connection test" [**] [Priority: 0] [AppID: ICMP] {ICMP} 157.32.34.228 -> 209.23.11.18 10/11-16:45:23.848071 [**] [1:384:8] "PROTOCOL-ICMP PING" [**] [Classification: Misc activity] [Priority: 3] [AppID: ICMP] {ICMP} 157.32.34.228 -> 209.23.11.18 10/11-16:45:24.323038 [**] [1:366:11] "PROTOCOL-ICMP PING Unix" [**] [Classification: Misc activity] [Priority: 3] [AppID: ICMP] {ICMP} 157.32.34.228 -> 209.23.11.18 10/11-16:45:24.323038 [**] [1:1000001:1] "ICMP connection test" [**] [Priority: 0] [AppID: ICMP] {ICMP} 157.32.34.228 -> 209.23.11.18 10/11-16:45:24.323038 [**] [1:384:8] "PROTOCOL-ICMP PING" [**] [Classification: Misc activity] [Priority: 3] [AppID: ICMP] {ICMP} 157.32.34.228 -> 209.23.11.18 ^C** caught int signal == stopping 10/11-16:45:25.353007 [**] [1:366:11] "PROTOCOL-ICMP PING Unix" [**] [Classification: Misc activity] [Priority: 3] [AppID: ICMP] {ICMP} 157.32.34.228 -> 209.23.11.18 10/11-16:45:25.353007 [**] [1:1000001:1] "ICMP connection test" [**] [Priority: 0] [AppID: ICMP] {ICMP} 157.32.34.228 -> 209.23.11.18 10/11-16:45:25.353007 [**] [1:384:8] "PROTOCOL-ICMP PING" [**] [Classification: Misc activity] [Priority: 3] [AppID: ICMP] {ICMP} 157.32.34.228 -> 209.23.11.18
Crea un archivo de servicio Systemd para Snort
A continuación, crea un archivo de servicio systemd para gestionar el Snort a través de systemd.
nano /etc/systemd/system/snort3.service
Añade las siguientes configuraciones:
[Unit] Description=Snort Daemon After=syslog.target network.target [Service] Type=simple ExecStart=/usr/local/bin/snort -c /usr/local/etc/snort/snort.lua -s 65535 -k none -l /var/log/snort -D -i eth0 -m 0x1b -u root -g root ExecStop=/bin/kill -9 $MAINPID [Install] WantedBy=multi-user.target
Guarda y cierra el archivo, luego recarga el demonio systemd con el siguiente comando:
systemctl daemon-reload
A continuación, inicia y habilita el servicio Snort con el siguiente comando:
systemctl enable --now snort3
Ahora puedes verificar el estado de Snort con el siguiente comando:
systemctl status snort3
Obtendrás la siguiente salida:
? snort3.service - Snort Daemon Loaded: loaded (/etc/systemd/system/snort3.service; enabled; vendor preset: enabled) Active: active (running) since Tue 2022-10-11 16:48:28 UTC; 17s ago Main PID: 95898 (snort) Tasks: 2 (limit: 4579) Memory: 233.6M CPU: 2.007s CGroup: /system.slice/snort3.service ??95898 /usr/local/bin/snort -c /usr/local/etc/snort/snort.lua -s 65535 -k none -l /var/log/snort -D -i eth0 -m 0x1b -u root -g > Oct 11 16:48:29 ubuntu2204 snort[95898]: num match states: 9885 Oct 11 16:48:29 ubuntu2204 snort[95898]: memory scale: MB Oct 11 16:48:29 ubuntu2204 snort[95898]: total memory: 3.42574 Oct 11 16:48:29 ubuntu2204 snort[95898]: pattern memory: 0.550588 Oct 11 16:48:29 ubuntu2204 snort[95898]: match list memory: 1.25256 Oct 11 16:48:29 ubuntu2204 snort[95898]: transition memory: 1.58402 Oct 11 16:48:29 ubuntu2204 snort[95898]: fast pattern only: 6822 Oct 11 16:48:29 ubuntu2204 snort[95898]: -------------------------------------------------- Oct 11 16:48:29 ubuntu2204 snort[95898]: pcap DAQ configured to passive. Oct 11 16:48:29 ubuntu2204 snort[95898]: Commencing packet processing
Conclusión
Enhorabuena! has instalado y configurado con éxito Snort 3 en Ubuntu 22.04. Ahora puedes implementar Snort en tu organización y protegerla de los ataques DDoS. No dudes en preguntarme si tienes alguna duda.