Cómo instalar y configurar Suricata IDS junto con Elastic Stack en Debian 12

Suricata es una herramienta de Monitorización de Red que examina y procesa cada paquete de tráfico de Internet que fluye a través de tu servidor. Puede generar eventos de registro, activar alertas y eliminar tráfico al detectar cualquier actividad sospechosa.

Puedes instalar Suricata en una sola máquina para supervisar su tráfico o desplegarla en un host de puerta de enlace para escanear todo el tráfico entrante y saliente de otros servidores conectados a ella. Puedes combinar Suricata con Elasticsearch, Kibana y Filebeat para crear una herramienta de Información de Seguridad y Gestión de Eventos (SIEM).

En este tutorial, instalarás Suricata IDS junto con ElasticStack en un servidor Debian 12. Los distintos componentes de la pila son

  • Elasticsearch para almacenar, indexar, correlacionar y buscar los eventos de seguridad del servidor.
  • Kibana para mostrar los registros almacenados en Elasticsearch.
  • Filebeat para analizar el archivo de registro eve.json de Suricata y enviar cada evento a Elasticsearch para su procesamiento.
  • Suricata para escanear el tráfico de red en busca de eventos sospechosos y descartar los paquetes no válidos.

El tutorial se divide en dos partes, la primera tratará sobre la instalación y configuración de Suricata, y la segunda sobre la instalación y configuración de Elastic Stack.

Instalaremos Suricata y la pila Elastic en diferentes servidores para nuestro tutorial.

Requisitos previos

  • Los servidores que alojen Elastic Stack y Suricata deben tener un mínimo de 4 GB de RAM y 2 núcleos de CPU.
  • Los servidores deben poder comunicarse entre sí utilizando direcciones IP privadas.
  • Los servidores deben ejecutar Debian 12 con un usuario sudo no root.
  • Si quieres acceder a los cuadros de mando de Kibana desde cualquier lugar, configura un dominio (kibana.example.com) que apunte al servidor donde se instalará Elasticsearch.
  • Instala los paquetes esenciales en ambos servidores. Es posible que algunos de ellos ya estén instalados.
    $ sudo apt install wget curl nano ufw software-properties-common dirmngr apt-transport-https gnupg2 ca-certificates lsb-release debian-archive-keyring unzip -y
    
  • Asegúrate de que todo está actualizado en ambos servidores.
    $ sudo apt update
    

PARTE 1

Paso 1 – Instalar Suricata

Suricata está disponible en los repositorios oficiales de Debian. Instálalo utilizando el siguiente comando.

$ sudo apt install suricata

El servicio Suricata se activa e inicia automáticamente. Antes de continuar, detén el servicio Suricata, ya que primero tenemos que configurarlo.

$ sudo systemctl stop suricata

Paso 2 – Configurar Suricata

Suricata almacena su configuración en el archivo /etc/suricata/suricata.yaml. El modo por defecto de Suricata es el Modo IDS (Sistema de Detección de Intrusos), en el que el tráfico sólo se registra y no se detiene. Si eres nuevo en Suricata, deberías dejar el modo sin cambios. Una vez que lo hayas configurado y hayas aprendido más, puedes activar el modo IPS (Sistema de Prevención de Intrusiones).

Activar ID de Comunidad

El campo ID de Comunidad facilita la correlación de datos entre registros generados por distintas herramientas de monitorización. Dado que utilizaremos Suricata con Elasticsearch, habilitar el ID de Comunidad puede ser útil.

Abre el archivo /etc/suricata/suricata.yaml para editarlo.

$ sudo nano /etc/suricata/suricata.yaml

Localiza la línea # Community Flow ID y establece el valor de la variable community-id en true.

. . .
      # Community Flow ID
      # Adds a 'community_id' field to EVE records. These are meant to give
      # records a predictable flow ID that can be used to match records to
      # output of other tools such as Zeek (Bro).
      #
      # Takes a 'seed' that needs to be same across sensors and tools
      # to make the id less predictable.

      # enable/disable the community id feature.
      community-id: true
. . .

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite.

Ahora, tus eventos llevarán un ID como 1:S+3BA2UmrHK0Pk+u3XH78GAFTtQ= que podrás utilizar para hacer coincidir conjuntos de datos entre distintas herramientas de monitorización.

Seleccionar interfaz de red

El archivo de configuración predeterminado de Suricata inspecciona el tráfico en el dispositivo/interfaz de red eth0. Si tu servidor utiliza una interfaz de red diferente, tendrás que actualizarla en la configuración.

Comprueba el nombre del dispositivo de tu interfaz de red utilizando el siguiente comando.

$ ip -p -j route show default

Recibirás una salida como la siguiente.

[ {
        "dst": "default",
        "gateway": "159.223.208.1",
        "dev": "eth0",
        "protocol": "static",
        "flags": [ ]
    } ]

La variable dev se refiere al dispositivo de red. En nuestra salida, aparece eth0 como dispositivo de red. Tu salida puede ser diferente dependiendo de tu sistema.

Ahora que sabes el nombre de tu dispositivo, abre el archivo de configuración.

$ sudo nano /etc/suricata/suricata.yaml

Busca la línea af-packet: alrededor de la línea número 580. Bajo ella, establece el valor de la variable interface al nombre del dispositivo de tu sistema.

# Linux high speed capture support
af-packet:
  - interface: eth0
    # Number of receive threads. "auto" uses the number of cores
    #threads: auto
    # Default clusterid. AF_PACKET will load balance packets based on flow.
    cluster-id: 99
. . .

Si quieres añadir interfaces adicionales, puedes hacerlo añadiéndolas al final de la sección af-packet, alrededor de la línea 650.

Para añadir una nueva interfaz, insértala justo encima de la sección - interface: default, como se muestra a continuación.

    #  For eBPF and XDP setup including bypass, filter and load balancing, please
    #  see doc/userguide/capture-hardware/ebpf-xdp.rst for more info.

  - interface: enp0s1
    cluster-id: 98
...
  - interface: default
    #threads: auto
    #use-mmap: no
    #tpacket-v3: yes

En nuestro ejemplo hemos añadido una nueva interfaz enp0s1 y un valor único para la variable cluster-id. Debes incluir un ID de clúster único con cada interfaz que añadas.

Busca la línea pcap: y, debajo de ella, establece el valor de la variable interface en el nombre del dispositivo de tu sistema.

# Cross platform libpcap capture support
pcap:
  - interface: eth0
    # On Linux, pcap will try to use mmap'ed capture and will use "buffer-size"
    # as total memory used by the ring. So set this to something bigger
    # than 1% of your bandwidth.

Para añadir una nueva interfaz igual que antes, insértala justo encima de la sección - interface: default, como se muestra a continuación.

- interface: enp0s1
# Put default values here
  - interface: default
    #checksum-checks: auto

Cuando hayas terminado, guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida.

Paso 3 – Configurar las reglas de Suricata

Suricata, por defecto, sólo utiliza un conjunto limitado de reglas para detectar el tráfico de red. Puedes añadir más conjuntos de reglas de proveedores externos utilizando una herramienta llamada suricata-update. Ejecuta el siguiente comando para incluir reglas adicionales.

$ sudo suricata-update -o /etc/suricata/rules
4/10/2023 -- 14:12:05 - <Info> -- Using data-directory /var/lib/suricata.
4/10/2023 -- 14:12:05 - <Info> -- Using Suricata configuration /etc/suricata/suricata.yaml
4/10/2023 -- 14:12:05 - <Info> -- Using /etc/suricata/rules for Suricata provided rules.
.....
4/10/2023 -- 14:12:05 - <Info> -- No sources configured, will use Emerging Threats Open
4/10/2023 -- 14:12:05 - <Info> -- Fetching https://rules.emergingthreats.net/open/suricata-6.0.10/emerging.rules.tar.gz.
 100% - 4073339/4073339
.....
4/10/2023 -- 14:12:09 - <Info> -- Writing rules to /etc/suricata/rules/suricata.rules: total: 45058; enabled: 35175; added: 45058; removed 0; modified: 0
4/10/2023 -- 14:12:10 - <Info> -- Writing /etc/suricata/rules/classification.config
4/10/2023 -- 14:12:10 - <Info> -- Testing with suricata -T.
4/10/2023 -- 14:12:33 - <Info> -- Done.

La parte -o /etc/suricata/rules del comando indica a la herramienta de actualización que guarde las reglas en el directorio /etc/suricata/rules. Este parámetro es importante, de lo contrario obtendrás el siguiente error durante la validación.

<Warning> - [ERRCODE: SC_ERR_NO_RULES(42)] - No rule files match the pattern /etc/suricata/rules/suricata.rules

Añadir proveedores de conjuntos de reglas

Puedes ampliar las reglas de Suricata añadiendo más proveedores. Puede obtener reglas de una gran variedad de proveedores gratuitos y comerciales.

Puedes listar la lista de proveedores por defecto utilizando el siguiente comando.

$ sudo suricata-update list-sources

Por ejemplo, si quieres incluir el conjunto de reglas tgreen/hunting, puedes activarlo con el siguiente comando.

$ sudo suricata-update enable-source tgreen/hunting
4/10/2023 -- 14:24:26 - <Info> -- Using data-directory /var/lib/suricata.
4/10/2023 -- 14:24:26 - <Info> -- Using Suricata configuration /etc/suricata/suricata.yaml
4/10/2023 -- 14:24:26 - <Info> -- Using /etc/suricata/rules for Suricata provided rules.
4/10/2023 -- 14:24:26 - <Info> -- Found Suricata version 6.0.10 at /usr/bin/suricata.
4/10/2023 -- 14:24:26 - <Info> -- Creating directory /var/lib/suricata/update/sources
4/10/2023 -- 14:24:26 - <Info> -- Enabling default source et/open
4/10/2023 -- 14:24:26 - <Info> -- Source tgreen/hunting enabled

Ejecuta de nuevo el comando suricata-update para descargar y actualizar las nuevas reglas. Suricata, por defecto, puede procesar cualquier cambio en las reglas sin reiniciarse.

Paso 4 – Validar la configuración de Suricata

Suricata incluye una herramienta de validación para comprobar si hay errores en el archivo de configuración y en las reglas. Ejecuta el siguiente comando para ejecutar la herramienta de validación.

$ sudo suricata -T -c /etc/suricata/suricata.yaml -v
4/10/2023 -- 14:24:43 - <Info> - Running suricata under test mode
4/10/2023 -- 14:24:43 - <Notice> - This is Suricata version 6.0.10 RELEASE running in SYSTEM mode
4/10/2023 -- 14:24:43 - <Info> - CPUs/cores online: 2
4/10/2023 -- 14:24:43 - <Info> - fast output device (regular) initialized: fast.log
4/10/2023 -- 14:24:43 - <Info> - eve-log output device (regular) initialized: eve.json
4/10/2023 -- 14:24:43 - <Info> - stats output device (regular) initialized: stats.log
4/10/2023 -- 14:24:53 - <Info> - 1 rule files processed. 35175 rules successfully loaded, 0 rules failed
4/10/2023 -- 14:24:53 - <Info> - Threshold config parsed: 0 rule(s) found
4/10/2023 -- 14:24:54 - <Info> - 35178 signatures processed. 1255 are IP-only rules, 5282 are inspecting packet payload, 28436 inspect application layer, 108 are decoder event only
4/10/2023 -- 14:25:07 - <Notice> - Configuration provided was successfully loaded. Exiting.
4/10/2023 -- 14:25:07 - <Info> - cleaning up signature grouping structure... complete

La bandera -T indica a Suricata que se ejecute en modo de prueba, la bandera -c configura la ubicación del archivo de configuración y la bandera -v imprime la salida detallada del comando. Dependiendo de la configuración de tu sistema y del número de reglas añadidas, el comando puede tardar unos minutos en finalizar.

Paso 5 – Ejecutar Suricata

Ahora que Suricata está configurado e instalado, es el momento de ejecutar la aplicación.

$ sudo systemctl start suricata

Comprueba el estado del proceso.

$ sudo systemctl status suricata

Deberías ver la siguiente salida si todo funciona correctamente.

? suricata.service - Suricata IDS/IDP daemon
     Loaded: loaded (/lib/systemd/system/suricata.service; enabled; preset: enabled)
     Active: active (running) since Wed 2023-10-04 14:25:49 UTC; 6s ago
       Docs: man:suricata(8)
             man:suricatasc(8)
             https://suricata-ids.org/docs/
    Process: 1283 ExecStart=/usr/bin/suricata -D --af-packet -c /etc/suricata/suricata.yaml --pidfile /run/suricata.pid (code=exited, status=0/SUCCESS)
   Main PID: 1284 (Suricata-Main)
      Tasks: 1 (limit: 4652)
     Memory: 211.7M
        CPU: 6.132s
     CGroup: /system.slice/suricata.service
             ??1284 /usr/bin/suricata -D --af-packet -c /etc/suricata/suricata.yaml --pidfile /run/suricata.pid

Oct 04 14:25:49 suricata systemd[1]: Starting suricata.service - Suricata IDS/IDP daemon...
Oct 04 14:25:49 suricata suricata[1283]: 4/10/2023 -- 14:25:49 - <Notice> - This is Suricata version 6.0.10 RELEASE running in SYSTEM mode
Oct 04 14:25:49 suricata systemd[1]: Started suricata.service - Suricata IDS/IDP daemon.

El proceso puede tardar unos minutos en terminar de analizar todas las reglas. Por lo tanto, la comprobación de estado anterior no es una indicación completa de si Suricata está funcionando y listo. Para ello, puedes controlar el archivo de registro mediante el siguiente comando.

$ sudo tail -f /var/log/suricata/suricata.log

Si ves la siguiente línea en el archivo de registro, significa que Suricata se está ejecutando y está listo para supervisar el tráfico de la red. Sal del comando tail pulsando las teclas CTRL+C.

4/10/2023 -- 14:26:12 - <Info> - All AFP capture threads are running.

Paso 6 – Probar las reglas de Suricata

Comprobaremos si Suricata detecta algún tráfico sospechoso. La guía de Suricata recomienda probar la regla ET Open número 2100498 utilizando el siguiente comando.

$ curl http://testmynids.org/uid/index.html

Obtendrás la siguiente respuesta.

uid=0(root) gid=0(root) groups=0(root)

El comando anterior simula devolver la salida del comando id que se puede ejecutar en un sistema comprometido. Para comprobar si Suricata detectó el tráfico, debes comprobar el archivo de registro utilizando el número de regla especificado.

$ grep 2100498 /var/log/suricata/fast.log

Si tu solicitud utilizó IPv6, deberías ver la siguiente salida.

10/04/2023-14:26:37.511168  [**] [1:2100498:7] GPL ATTACK_RESPONSE id check returned root [**] [Classification: Potentially Bad Traffic] [Priority: 2] {TCP} 2600:9000:23d0:a200:0018:30b3:e400:93a1:80 -> 2a03:b0c0:0002:00d0:0000:0000:0e1f:c001:53568

Si tu solicitud utilizó IPv4, deberías ver la siguiente salida.

10/04/2023-14:26:37.511168  [**] [1:2100498:7] GPL ATTACK_RESPONSE id check returned root [**] [Classification: Potentially Bad Traffic] [Priority: 2] {TCP} 108.158.221.5:80 -> 95.179.185.42:36364

Suricata también registra eventos en el archivo /var/log/suricata/eve.log utilizando el formato JSON. Para leer e interpretar esas reglas, necesitas instalar jq, lo cual queda fuera del alcance de este tutorial.

PARTE 2

Hemos terminado con la primera parte del tutorial, en la que instalamos Suricata y lo probamos. La siguiente parte consiste en instalar la pila ELK y configurarla para visualizar Suricata y sus registros. Se supone que la segunda parte del tutorial se realiza en el segundo servidor, a menos que se especifique lo contrario.

Paso 7 – Instalar Elasticsearch

El primer paso para instalar Elasticsearch consiste en añadir la clave GPG de Elastic a tu servidor.

$ wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg

Crea un repositorio para el paquete Elasticsearch creando el archivo /etc/apt/sources.list.d/elastic-7.x.list.

$ echo "deb [signed-by=/usr/share/keyrings/elasticsearch-keyring.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-8.x.list

Actualiza la lista de repositorios de tu sistema.

$ sudo apt update

Instala Elasticsearch y Kibana.

$ sudo apt install elasticsearch

Obtendrás la siguiente salida sobre la instalación de Elasticsearch.

--------------------------- Security autoconfiguration information ------------------------------

Authentication and authorization are enabled.
TLS for the transport and HTTP layers is enabled and configured.

The generated password for the elastic built-in superuser is : IuRTjJr+=NqIClxZwKBn

If this node should join an existing cluster, you can reconfigure this with
'/usr/share/elasticsearch/bin/elasticsearch-reconfigure-node --enrollment-token <token-here>'
after creating an enrollment token on your existing cluster.

You can complete the following actions at any time:

Reset the password of the elastic built-in superuser with
'/usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic'.

Generate an enrollment token for Kibana instances with
 '/usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibana'.

Generate an enrollment token for Elasticsearch nodes with
'/usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s node'.

-------------------------------------------------------------------------------------------------

Utilizaremos esta información más adelante.

Localiza la dirección IP privada de tu servidor utilizando el siguiente comando.

$ ip -brief address show
lo               UNKNOWN        127.0.0.1/8 ::1/128
eth0             UP             159.223.220.228/20 10.18.0.5/16 2a03:b0c0:2:d0::e0e:c001/64 fe80::841e:feff:fee4:e653/64
eth1             UP             10.133.0.2/16 fe80::d865:d5ff:fe29:b50f/64

Anota la IP privada de tu servidor (10.133.0.2 en este caso). Nos referiremos a ella como your_private_IP. La dirección IP pública del servidor (159.223.220.228) la denominaremos your_public_IP en el resto del tutorial. Anota también el nombre de la interfaz de red de tu servidor, eth1.

Paso 8 – Configurar Elasticsearch

Elasticsearch almacena su configuración en el archivo /etc/elasticsearch/elasticsearch.yml. Abre el archivo para editarlo.

$ sudo nano /etc/elasticsearch/elasticsearch.yml

Por defecto, Elasticsearch sólo acepta conexiones locales. Tenemos que cambiarlo para que Kibana pueda acceder a él a través de la dirección IP privada.

Busca la línea #network.host: 192.168.0.1 y añade la siguiente línea justo debajo, como se muestra a continuación.

# By default Elasticsearch is only accessible on localhost. Set a different
# address here to expose this node on the network:
#
#network.host: 192.168.0.1
network.bind_host: ["127.0.0.1", "your_private_IP"]
#
# By default Elasticsearch listens for HTTP traffic on the first free port it
# finds starting at 9200. Set a specific HTTP port here:

Esto garantizará que Elastic pueda seguir aceptando conexiones locales y, al mismo tiempo, esté disponible para Kibana a través de la dirección IP privada.

El siguiente paso es activar algunas funciones de seguridad y asegurarte de que Elastic está configurado para ejecutarse en un único nodo. Si vas a utilizar varios nodos de búsqueda Elastic, omite los dos cambios siguientes y guarda el archivo.

Para ello, añade la siguiente línea al final del archivo.

. . .
discovery.type: single-node

Además, comenta la siguiente línea añadiendo una almohadilla (#) delante de ella.

#cluster.initial_master_nodes: ["kibana"]

Cuando hayas terminado, guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida.

Configurar el cortafuegos

Añade las reglas de cortafuegos adecuadas para Elasticsearch, de forma que sea accesible a través de la red privada.

$ sudo ufw allow in on eth1
$ sudo ufw allow out on eth1

Asegúrate de elegir el nombre de la interfaz en el primer comando como el que obtuviste en el paso 7.

Inicia Elasticsearch

Recarga el demonio de servicio.

$ sudo systemctl daemon-reload

Habilita el servicio Elasticsearch.

$ sudo systemctl enable elasticsearch

Ahora que ya has configurado Elasticsearch, es el momento de iniciar el servicio.

$ sudo systemctl start elasticsearch

Comprueba el estado del servicio.

$ sudo systemctl status elasticsearch
? elasticsearch.service - Elasticsearch
     Loaded: loaded (/lib/systemd/system/elasticsearch.service; enabled; preset: enabled)
     Active: active (running) since Wed 2023-10-04 14:30:55 UTC; 8s ago
       Docs: https://www.elastic.co
   Main PID: 1731 (java)
      Tasks: 71 (limit: 4652)
     Memory: 2.3G
        CPU: 44.355s
     CGroup: /system.slice/elasticsearch.service

Crea contraseñas para Elasticsearch

Tras habilitar la configuración de seguridad de Elasticsearch, el siguiente paso es generar la contraseña para el superusuario de Elasticsearch. La contraseña por defecto se proporcionó durante la instalación y puedes utilizarla, pero se recomienda modificarla.

Ejecuta el siguiente comando para restablecer la contraseña de Elasticsearch. Elige una contraseña fuerte.

$ sudo /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic -i
This tool will reset the password of the [elastic] user.
You will be prompted to enter the password.
Please confirm that you would like to continue [y/N]y


Enter password for [elastic]: <ENTER-PASSWORD>
Re-enter password for [elastic]: <CONFIRM-PASSWORD>
Password for the [elastic] user successfully reset.

Ahora, probemos si Elasticsearch responde a las consultas.

$ sudo curl --cacert /etc/elasticsearch/certs/http_ca.crt -u elastic https://localhost:9200
Enter host password for user 'elastic':
{
  "name" : "kibana",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "KGYx4poLSxKhPyOlYrMq1g",
  "version" : {
    "number" : "8.10.2",
    "build_flavor" : "default",
    "build_type" : "deb",
    "build_hash" : "6d20dd8ce62365be9b1aca96427de4622e970e9e",
    "build_date" : "2023-09-19T08:16:24.564900370Z",
    "build_snapshot" : false,
    "lucene_version" : "9.7.0",
    "minimum_wire_compatibility_version" : "7.17.0",
    "minimum_index_compatibility_version" : "7.0.0"
  },
  "tagline" : "You Know, for Search"
}

Esto confirma que Elasticsearch es totalmente funcional y funciona sin problemas.

Paso 9 – Instalar y Configurar Kibana

Instala Kibana.

$ sudo apt install kibana

El primer paso para configurar Kibana es habilitar la función de seguridad xpack generando claves secretas. Kibana utiliza estas claves secretas para almacenar datos en Elasticsearch. Se puede acceder a la utilidad para generar claves secretas desde el directorio /usr/share/kibana/bin.

$ sudo /usr/share/kibana/bin/kibana-encryption-keys generate -q --force

La bandera -q suprime las instrucciones del comando, y la bandera --force garantiza que se generen secretos nuevos. Recibirás una salida como la siguiente.

xpack.encryptedSavedObjects.encryptionKey: 248eb61d444215a6e710f6d1d53cd803
xpack.reporting.encryptionKey: aecd17bf4f82953739a9e2a9fcad1891
xpack.security.encryptionKey: 2d733ae5f8ed5f15efd75c6d08373f36

Copia la salida. Abre el archivo de configuración de Kibana en /etc/kibana/kibana.yml para editarlo.

$ sudo nano /etc/kibana/kibana.yml

Pega el código del comando anterior al final del archivo.

. . .
# Maximum number of documents loaded by each shard to generate autocomplete suggestions.
# This value must be a whole number greater than zero. Defaults to 100_000
#unifiedSearch.autocomplete.valueSuggestions.terminateAfter: 100000

xpack.encryptedSavedObjects.encryptionKey: 3ff21c6daf52ab73e932576c2e981711
xpack.reporting.encryptionKey: edf9c3863ae339bfbd48c713efebcfe9
xpack.security.encryptionKey: 7841fd0c4097987a16c215d9429daec1

Copia el archivo del certificado CA /etc/elasticsearch/certs/http_ca.crt en el directorio /etc/kibana.

$ sudo cp /etc/elasticsearch/certs/http_ca.crt /etc/kibana/

Configurar el host de Kibana

Es necesario configurar Kibana para que sea accesible en la dirección IP privada del servidor. Busca la línea #server.host: "localhost" en el archivo y añade la siguiente línea justo debajo, como se muestra.

# Kibana is served by a back end server. This setting specifies the port to use.
#server.port: 5601

# Specifies the address to which the Kibana server will bind. IP addresses and host names are both valid values.
# The default is 'localhost', which usually means remote machines will not be able to connect.
# To allow connections from remote users, set this parameter to a non-loopback address.
#server.host: "localhost"
server.host: "your_private_IP"

Desactiva la Telemetría

Kibana envía datos a sus servidores por defecto. Esto puede afectar al rendimiento y también es un riesgo para la privacidad. Por lo tanto, debes desactivar la Telemetría. Añade el siguiente código al final del archivo para desactivar la Telemetría. La primera configuración desactiva la Telemetría y la segunda deshabilita la sobrescritura de la primera configuración desde la sección Configuración Avanzada en Kibana.

telemetry.optIn: false
telemetry.allowChangingOptInStatus: false

Cuando hayas terminado, guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite.

Configurar SSL

Busca la variable elasticsearch.ssl.certificateAuthorities, descoméntala y cambia su valor como se muestra a continuación.

elasticsearch.ssl.certificateAuthorities: [ "/etc/kibana/http_ca.crt" ]

Configurar el acceso a Kibana

El siguiente paso es generar un token de acceso que utilizaremos más adelante para iniciar sesión en la interfaz web de Kibana.

$ sudo /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibana
eyJ2ZXIiOiI4LjEwLjIiLCJhZHIiOlsiMTU5LjIyMy4yMjAuMjI4OjkyMDAiXSwiZmdyIjoiOGMyYTcyYmUwMDg5NTJlOGMxMWUwNDgzYjE2OTcwOTMxZWZlNzYyMDAwNzhhOGMwNTNmNWU0NGJiY2U4NzcwMSIsImtleSI6IlQ5eE0tNG9CUWZDaGdaakUwbFAzOk9QTU5uWVRnUWppU3lvU0huOUoyMHcifQ==

Iniciar Kibana

Ahora que has configurado el acceso seguro y la red para Kibana, inicia y habilita el proceso.

$ sudo systemctl enable kibana --now

Comprueba el estado para ver si se está ejecutando.

$ sudo systemctl status kibana
? kibana.service - Kibana
     Loaded: loaded (/lib/systemd/system/kibana.service; enabled; preset: enabled)
     Active: active (running) since Wed 2023-10-04 15:27:28 UTC; 9s ago
       Docs: https://www.elastic.co
   Main PID: 2686 (node)
      Tasks: 11 (limit: 4652)
     Memory: 241.5M
        CPU: 9.902s
     CGroup: /system.slice/kibana.service
             ??2686 /usr/share/kibana/bin/../node/bin/node /usr/share/kibana/bin/../src/cli/dist

Oct 04 15:27:28 kibana systemd[1]: Started kibana.service - Kibana.

Paso 10 – Instalar y configurar Filebeat

Es importante tener en cuenta que instalaremos Filebeat en el servidor Suricata. Así que vuelve a él y añade la clave GPG elástica para empezar.

$ wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg

Crea el repositorio elástico.

$ echo "deb [signed-by=/usr/share/keyrings/elasticsearch-keyring.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-8.x.list

Actualiza la lista de repositorios del sistema.

$ sudo apt update

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida.

Instala Filebeat.

$ sudo apt install filebeat

Antes de configurar Filebeat, tenemos que copiar el archivo http_ca.crt del servidor Elasticsearch al servidor Filebeat. Ejecuta el siguiente comando en el servidor Filebeat.

$ scp username@your_public_ip:/etc/elasticsearch/certs/http_ca.crt /etc/filebeat

Filebeat almacena su configuración en el archivo /etc/filebeat/filebeat.yml. Ábrelo para editarlo.

$ sudo nano /etc/filebeat/filebeat.yml

Lo primero que tienes que hacer es conectarlo al panel de control de Kibana. Busca la línea #host: "localhost:5601" en la sección Kibana y añade las siguientes líneas justo debajo, como se muestra.

. . .
# Starting with Beats version 6.0.0, the dashboards are loaded via the Kibana API.
# This requires a Kibana endpoint configuration.
setup.kibana:

  # Kibana Host
  # Scheme and port can be left out and will be set to the default (http and 5601)
  # In case you specify and additional path, the scheme is required: http://localhost:5601/path
  # IPv6 addresses should always be defined as: https://[2001:db8::1]:5601
  #host: "localhost:5601"
  host: "your_private_IP:5601"
  protocol: "http"
  ssl.enabled: true
  ssl.certificate_authorities: ["/etc/filebeat/http_ca.crt"]

. . .

A continuación, busca la sección Elasticsearch Output del archivo y edita los valores de hosts, protocol, username, y password como se muestra a continuación. Para el nombre de usuario, elige elastic como valor, y para la contraseña, utiliza el valor generado en el paso 8 de este tutorial.

output.elasticsearch:
  # Array of hosts to connect to.
  hosts: ["your_private_IP:9200"]

  # Protocol - either `http` (default) or `https`.
  protocol: "https"

  # Authentication credentials - either API key or username/password.
  #api_key: "id:api_key"
  username: "elastic"
  password: "bd1YJfhSa8RC8SMvTIwg"
  ssl.certificate_authorities: ["/etc/filebeat/http_ca.crt"]
  ssl.verification_mode: full

. . .

Añade la siguiente línea al final del archivo.

setup.ilm.overwrite: true

Cuando hayas terminado, guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida. Hay un paso más para asegurarnos de que Filebeat se conecta a Elasticsearch. Tenemos que pasar la información SSL de Elasticsearch a Filebeat para que pueda conectarse.

Prueba la conexión desde Filebeat al servidor Elasticsearch. Se te pedirá la contraseña de Elasticsearch.

$ curl -v --cacert /etc/filebeat/http_ca.crt https://your_private_ip:9200 -u elastic

Obtendrás la siguiente salida.

Enter host password for user 'elastic':
*   Trying 10.133.0.2:9200...
* Connected to 10.133.0.2 (10.133.0.2) port 9200 (#0)
* ALPN: offers h2,http/1.1
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
*  CAfile: /etc/filebeat/http_ca.crt
*  CApath: /etc/ssl/certs
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
* TLSv1.3 (IN), TLS handshake, Finished (20):
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.3 (OUT), TLS handshake, Finished (20):
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
* ALPN: server did not agree on a protocol. Uses default.
* Server certificate:
*  subject: CN=kibana
*  start date: Oct  4 14:28:33 2023 GMT
*  expire date: Oct  3 14:28:33 2025 GMT
*  subjectAltName: host "10.133.0.2" matched cert's IP address!
*  issuer: CN=Elasticsearch security auto-configuration HTTP CA
*  SSL certificate verify ok.
* using HTTP/1.x
* Server auth using Basic with user 'elastic'
> GET / HTTP/1.1
> Host: 10.133.0.2:9200
> Authorization: Basic ZWxhc3RpYzpsaWZlc3Vja3M2NjIwMDI=
> User-Agent: curl/7.88.1
> Accept: */*
>
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
< HTTP/1.1 200 OK
< X-elastic-product: Elasticsearch
< content-type: application/json
< content-length: 530
<
{
  "name" : "kibana",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "KGYx4poLSxKhPyOlYrMq1g",
  "version" : {
    "number" : "8.10.2",
    "build_flavor" : "default",
    "build_type" : "deb",
    "build_hash" : "6d20dd8ce62365be9b1aca96427de4622e970e9e",
    "build_date" : "2023-09-19T08:16:24.564900370Z",
    "build_snapshot" : false,
    "lucene_version" : "9.7.0",
    "minimum_wire_compatibility_version" : "7.17.0",
    "minimum_index_compatibility_version" : "7.0.0"
  },
  "tagline" : "You Know, for Search"
}
* Connection #0 to host 10.133.0.2 left intact

A continuación, activa el módulo Suricata integrado en Filebeat.

$ sudo filebeat modules enable suricata

Abre el archivo /etc/filebeat/modules.d/suricata.yml para editarlo.

$ sudo nano /etc/filebeat/modules.d/suricata.yml

Edita el archivo como se muestra a continuación. Debes cambiar el valor de la variable enabled por true. Además, descomenta la variable var.paths y establece su valor como se muestra.

# Module: suricata
# Docs: https://www.elastic.co/guide/en/beats/filebeat/8.10/filebeat-module-suricata.html

- module: suricata
  # All logs
  eve:
    enabled: true

    # Set custom paths for the log files. If left empty,
    # Filebeat will choose the paths depending on your OS.
    var.paths: ["/var/log/suricata/eve.json"]

Cuando hayas terminado, guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida.

El último paso para configurar Filebeat es cargar los cuadros de mando y las canalizaciones SIEM en Elasticsearch mediante el comando filebeat setup.

$ sudo filebeat setup

El comando puede tardar unos minutos en finalizar. Una vez finalizado, deberías recibir la siguiente salida.

Overwriting ILM policy is disabled. Set `setup.ilm.overwrite: true` for enabling.

Index setup finished.
Loading dashboards (Kibana must be running and reachable)
Loaded dashboards
Loaded Ingest pipelines

Inicia el servicio Filebeat.

$ sudo systemctl start filebeat

Comprueba el estado del servicio.

$ sudo systemctl status filebeat

Paso 11 – Acceder al panel de control de Kibana

Dado que KIbana está configurado para acceder únicamente a Elasticsearch a través de su dirección IP privada, tienes dos opciones para acceder a él. El primer método es utilizar un túnel SSH al servidor de Elastic search desde tu PC. Esto reenviará el puerto 5601 desde tu PC a la dirección IP privada del servidor, y podrás acceder a Kibana desde tu PC en http://localhost:5601. Pero este método significa que no podrás acceder a él desde ningún otro lugar.

La otra opción es instalar Nginx en tu servidor Suricata y utilizarlo como proxy inverso para acceder al servidor de Elasticsearch a través de su dirección IP privada. Hablaremos de ambas formas. Puedes elegir cualquiera de ellas en función de tus necesidades.

Usando el Túnel Local SSH

Si utilizas Windows 10 o Windows 11, puedes ejecutar el SSH LocalTunnel desde tu Windows Powershell. En Linux o macOS, puedes utilizar el terminal. Probablemente necesitarás configurar el acceso SSH si aún no lo has hecho.

Ejecuta el siguiente comando en el terminal de tu ordenador para crear el Túnel SSH.

$ ssh -L 5601:your_private_IP:5601 navjot@your_public_IP -N
  • La bandera -L se refiere al Túnel SSH local, que reenvía el tráfico desde el puerto de tu PC al servidor.
  • El private_IP:5601 es la dirección IP a la que se reenvía tu tráfico en el servidor. En este caso, sustitúyela por la dirección IP privada de tu servidor Elasticsearch.
  • El your_public_IP es la dirección IP pública del servidor Elasticsearch, que se utiliza para abrir una conexión SSH.
  • La bandera -N indica a OpenSSH que no ejecute ningún comando, sino que mantenga viva la conexión mientras se ejecute el túnel.

Ahora que el túnel está abierto, puedes acceder a Kibana abriendo la URL http://localhost:5601 en el navegador de tu PC. Obtendrás la siguiente pantalla.

Inicio de sesión en el panel de control de Kibana

Tendrás que mantener el comando en ejecución mientras necesites acceder a Kibana. Pulsa Ctrl + C en tu terminal para cerrar el túnel.

Utilizar el proxy inverso Nginx

Este método es el más adecuado si quieres acceder al panel de control desde cualquier parte del mundo.

Configurar el cortafuegos

Antes de continuar, necesitas abrir los puertos HTTP y HTTPS en el cortafuegos.

$ sudo ufw allow http
$ sudo ufw allow https

Instalar Nginx

Debian 12 incluye una versión antigua de Nginx. Para instalar la última versión, tienes que descargar el repositorio oficial de Nginx.

Importa la clave de firma de Nginx.

$ curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

Añade el repositorio de la versión estable de Nginx.

$ echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/debian `lsb_release -cs` nginx" \
    | sudo tee /etc/apt/sources.list.d/nginx.list

Actualiza los repositorios del sistema.

$ sudo apt update

Instala Nginx.

$ sudo apt install nginx

Verifica la instalación. Como estamos en Debian, el sudo en el comando es esencial.

$ sudo nginx -v
nginx version: nginx/1.24.0

Inicia el servidor Nginx.

$ sudo systemctl start nginx

Instalar y configurar SSL

El primer paso es instalar el certificado SSL Let’s Encrypt. Necesitamos instalar Certbot para generar el certificado SSL. Puedes instalar Certbot utilizando el repositorio de Debian u obtener la última versión utilizando la herramienta Snapd. Nosotros utilizaremos la versión Snapd.

Debian 12 no viene con Snapd instalado. Instala el paquete Snapd.

$ sudo apt install snapd

Ejecuta los siguientes comandos para asegurarte de que tu versión de Snapd está actualizada.

$ sudo snap install core && sudo snap refresh core

Instala Certbot.

$ sudo snap install --classic certbot

Utiliza el siguiente comando para asegurarte de que se puede ejecutar el comando Certbot creando un enlace simbólico al directorio /usr/bin.

$ sudo ln -s /snap/bin/certbot /usr/bin/certbot

Confirma la instalación de Certbot.

$ certbot --version
certbot 2.7.0

Genera el certificado SSL para el dominio kibana.example.com.

$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d kibana.example.com

El comando anterior descargará un certificado en el directorio /etc/letsencrypt/live/kibana.example.com de tu servidor.

Genera un certificado de grupo Diffie-Hellman.

$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096

Para comprobar si la renovación SSL funciona correctamente, realiza una ejecución en seco del proceso.

$ sudo certbot renew --dry-run

Si no ves ningún error, ya está todo listo. Tu certificado se renovará automáticamente.

Configurar Nginx

Crea y abre el archivo de configuración de Nginx para Kibana.

$ sudo nano /etc/nginx/conf.d/kibana.conf

Pega en él el siguiente código. Sustituye la dirección IP por la dirección IP privada de tu servidor Elasticsearch.

server {
        listen 80; listen [::]:80;
        server_name kibana.example.com;
        return 301 https://$host$request_uri;
}

server {
        server_name kibana.example.com;
        charset utf-8;

        listen 443 ssl http2;
        listen [::]:443 ssl http2;

        access_log /var/log/nginx/kibana.access.log;
        error_log /var/log/nginx/kibana.error.log;

        ssl_certificate /etc/letsencrypt/live/kibana.example.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/kibana.example.com/privkey.pem;
        ssl_trusted_certificate /etc/letsencrypt/live/kibana.example.com/chain.pem;
        ssl_session_timeout 1d;
        ssl_session_cache shared:MozSSL:10m;
        ssl_session_tickets off;

        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
		
		resolver 8.8.8.8;

        ssl_stapling on;
        ssl_stapling_verify on;
        ssl_dhparam /etc/ssl/certs/dhparam.pem;
 
        location / {
                proxy_pass http://your_private_IP:5601;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
        }
}

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite.

Abre el archivo /etc/nginx/nginx.conf para editarlo.

$ sudo nano /etc/nginx/nginx.conf

Añade la siguiente línea antes de la línea include /etc/nginx/conf.d/*.conf;.

server_names_hash_bucket_size  64;

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite.

Verifica la configuración.

$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Reinicia el servicio Nginx.

$ sudo systemctl restart nginx

Tu panel de control de Kibana debería ser accesible a través de la URL https://kibana.example.com desde cualquier lugar que desees.

Paso 12 – Gestión de los paneles de control de Kibana

Antes de continuar con la gestión de los cuadros de mando, tienes que añadir el campo URL base en la configuración de Kibana.

Abre el archivo de configuración de Kibana.

$ sudo nano /etc/kibana/kibana.yml

Busca la línea comentada #server.publicBaseUrl: "" y cámbiala como se indica a continuación, eliminando la almohadilla que aparece delante de ella.

server.publicBaseUrl: "https://kibana.example.com"

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite.

Reinicia el servicio Kibana.

$ sudo systemctl restart kibana

Espera unos minutos y carga la URL https://kibana.example.com en tu navegador. Aparecerá el campo del código de registro. Introduce el código de inscripción que generaste en el paso 9.

Campo Token de inscripción en Kibana

Haz clic en el botón Configurar Elastic para continuar. A continuación, se te pedirá el código de verificación.

Código de verificación de Kibana

Vuelve al terminal de Elasticsearch y ejecuta el siguiente comando para generar el código. Introduce este código en la página y haz clic en el botón Verificar para continuar.

$ sudo /usr/local/share/kibana/bin/kibana-verification-code

A continuación, espera a que se complete la configuración de Elastic. Tardará varios minutos.

Configuración web de Elasticsearch

A continuación, se te redirigirá a la pantalla de inicio de sesión.

Pantalla de inicio de sesión de Elasticsearch

Inicia sesión con el nombre de usuario elastic y la contraseña que generaste anteriormente y obtendrás la siguiente pantalla.

Panel Kibana

Escribe type:data suricata en el cuadro de búsqueda de la parte superior para localizar la información de Suricata.

Búsqueda Suricata en Kibana

Haz clic en el primer resultado ([Filebeat Suricata] Resumen de alertas), y obtendrás una pantalla similar a la siguiente. Por defecto, sólo muestra las entradas de los últimos 15 minutos, pero nosotros la mostramos en un intervalo de tiempo mayor para mostrar más datos para el tutorial.

Alertas de Filebeat Suricata

Haz clic en el botón Eventos para ver todos los eventos registrados.

Eventos de Filebeat Suricata

Al desplazarte hacia abajo en las páginas de eventos y alertas, puedes identificar cada evento y alerta por el tipo de protocolo, los puertos de origen y destino, y la dirección IP de origen. También puedes ver los países desde los que se originó el tráfico.

Puedes utilizar Kibana y Filebeat para acceder y generar otros tipos de cuadros de mando. Uno de los útiles cuadros de mando incorporados que puedes utilizar de inmediato es el de Seguridad. Haz clic en el menú Seguridad >> Explorar del menú hamburguesa de la izquierda.

Seguridad &gt;&gt; Explorar el menú Kibana

En la página siguiente, selecciona la opción Red para abrir el panel asociado.

Página Explorar la Seguridad Elástica

Al hacer clic en la opción Red, aparecerá la siguiente pantalla.

Panel de seguridad de Kibana

Puedes añadir más paneles como Nginx habilitando y configurando los módulos Filebeat incorporados.

Conclusión

Con esto concluye el tutorial para instalar y configurar Suricata IDS con Elastic Stack en un servidor Debian 12. También has configurado Nginx como proxy inverso para acceder externamente a los paneles de control de Kibana. Si tienes alguna pregunta, publícala en los comentarios a continuación.

Scroll al inicio