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.

También te podría gustar...