ELK Stack y Suricata IDS

Bienvenid@s a otro artículo de Hardsoft Security, en esta ocasión os traemos la integración del Elastic Stack con el famoso IDS Suricata. Para saber cómo lo hacemos, no dejes de leer.

Como en todos los artículos, vamos hacer una introducción respecto a las tecnologías que vamos a utilizar para entrar en materia, pero antes de comenzar, uno de los requisitos obvios es tener instalado Suricata IDS en nuestro servidor, para esto os dejo el siguiente enlace, donde en el punto 4 podréis ver la guía de instalación de Suricata IDS: Instalación de Suricata IDS.

¿Qué es ELK Stack?

ELK Stack es un conjunto de 3 herramientas de código abierto, estas son: Elasticsearch, Logstash y Kibana. Estas herramientas son administradas por la empresa Elastic.

El poder de estas 3 herramientas reside en su combinación, ya que gracias a esta combinación nos proporcionará una gestión de logs, registros centralizados y finalmente una presentación en dashboard.

Lo que nos permitirá extraer información en tiempo real y muy importante para nosotros, ya que esto nos permitirá identificar y resolver problemas de nuestro sistemas y aplicaciones.

¿Cómo funciona cada herramienta?

Principalmente se diferencia cada herramienta debido a la función que tiene cada una, a continuación describimos brevemente cada función:

  • Elastisearch: Almacena, busca indexa los datos transformados de Logstash.
  • Logstash: Recopila los registros, los analiza y los transforma en datos.
  • Kibana: Usa Elasticsearch para explorar, visualizar y compartir la información.

Ya hemos entrado relativamente algo en materia y sabemos que función tiene cada herramienta dentro de la infraestructura que estamos montando junto a nuestro IDS.

Instalación de ELK Stack

Como podemos imaginar, el resultado final es integrar nuestro Suricata IDS con este Stack de herramientas, esto hará que visualizar la cantidad de información que arroja Suricata, no solo sea información que se almacena en un fichero de los, si no, que pasará a ser información valiosa para interpretar lo que sucede dentro de nuestra infraestructura y poder llegar a tiempo frente ataques o anomalías de nuestra red.

Instalación de Java

Para instalar Java en nuestro servidor, primero vamos a actualizar los repositorios:

apt -y update

Tras actualizar los repositorios, aplicaremos las actualizaciones encontradas:

apt -y upgrade

Una vez actualizado nuestro sistema y nuestros repositorios, procedemos a la instalación del jdk de Java en su versión 11:

apt -y install openjdk-11-jdk

Comprobamos que se ha instalado correctamente Java. Esto lo vamos hacer comprobando la versión que ha instalado:

java –version

Instalación de ELK Stack

Instalamos la llave de firma PGP de ELK Stack:

wget -qO – https://artifacts.elastic.co/GPG-KEY-elasticsearch | apt-key add –

Procedemos a la instalación de los repositorios de ELK Stack:

apt install apt-transport-https

Finalmente, añadimos el repositorio al fichero source.list. Este fichero es donde tenemos declarados los repositorios a los cuales vamos a acceder a la hora de actualizar e instalar paquetes:

echo «deb https://artifacts.elastic.co/packages/7.x/apt stable main» | sudo tee /etc/apt/sources.list.d/elastic-7.x.list

De nuevo actualizamos para que tenga en cuenta los últimos cambios realizados:

apt -y update

Comenzamos la instalación de este Stack con la herramienta Elasticsearch:

apt -y install elasticsearch

A continuación, procedemos a la configuración de Elasticsearch, esto lo vamos hacer accediendo al siguiente fichero de configuración:

nano /etc/elasticsearch/elasticsearch.yml

Localizamos la variable de configuración «cluster.name» y establecemos un nombre:

Posteriormente, buscaremos las variables de configuración «network.host» la cual nos permite especificar desde que IP o IP’s podremos acceder a Elasticsearch y «http.port» donde especificamos el puerto de escucha de nuestra herramienta:

Posteriormente, vamos a configurar la variable de configuración «discovery.type» y a modificar «discovery.seed_host»:

Tras realizar la configuración, procederemos a habilitar la herramienta dentro de nuestro servidor, esto lo haremos de la siguiente manera:

systemctl enable –now elasticsearch

Comprobamos que funcione correctamente con el siguiente comando (systemctl):

systemctl status elasticsearch

El siguiente paso será instalar la segunda herramienta que será el panel web Kibana:

apt -y install kibana

Procedemos a la configuración de Kibana, accediendo al siguiente fichero de configuración:

nano /etc/kibana/kibana.yml

Tras acceder al fichero de configuración, vamos a configurar cual será el puerto de escucha de Kibana y desde que IP’s se podrá acceder al panel:

Configuramos la variable de configuración «elasticsearch.hosts» para que apunte al servidor donde lo tengamos instalado, en nuestro caso será la IP de nuestro propio servidor, ya que todas las herramientas están instaladas en el mismo:

Procedemos a habilitar Kibana en nuestro sistema:

systemctl enable –now kibana

Comprobamos el estado del servicio:

systemctl status kibana

Finalmente, la última herramienta que vamos a instalar es logstash:

apt -y install logstash

Tras la instalación del paquete de logstash, procedemos a la configuración de entrada de información, indicando que está información la vamos a coger del fichero los de Suricata «eve.json». Primero creamos el fichero de configuración:

nano /etc/logstash/conf.d/logstash.conf

Añadimos la siguiente configuración de entrada de información:

input {
file {
    path => ["/var/log/suricata/eve.json"]
    codec =>  "json"
    type => "SuricataIDPS"
}

}

filter {
if [type] == "SuricataIDPS" {
    date {
    match => [ "timestamp", "ISO8601" ]
    }
    ruby {
    code => "
        if event.get('[event_type]') == 'fileinfo'
        event.set('[fileinfo][type]', event.get('[fileinfo][magic]').to_s.split(',')[0])
        end
    "
    }

    ruby{
    code => "
        if event.get('[event_type]') == 'alert'
        sp = event.get('[alert][signature]').to_s.split(' group ')
        if (sp.length == 2) and /\A\d+\z/.match(sp[1])
            event.set('[alert][signature]', sp[0])
        end
        end
        "
    }
}

if [src_ip]  {
    geoip {
    source => "src_ip"
    target => "geoip"
    #database => "/opt/logstash/vendor/geoip/GeoLiteCity.dat"
    add_field => [ "[geoip][coordinates]", "%{[geoip][longitude]}" ]
    add_field => [ "[geoip][coordinates]", "%{[geoip][latitude]}"  ]
    }
    mutate {
    convert => [ "[geoip][coordinates]", "float" ]
    }
    if ![geoip.ip] {
    if [dest_ip]  {
        geoip {
        source => "dest_ip"
        target => "geoip"
        #database => "/opt/logstash/vendor/geoip/GeoLiteCity.dat"
        add_field => [ "[geoip][coordinates]", "%{[geoip][longitude]}" ]
        add_field => [ "[geoip][coordinates]", "%{[geoip][latitude]}"  ]
        }
        mutate {
        convert => [ "[geoip][coordinates]", "float" ]
        }
    }
    }
}
}

Y la siguiente configuración de salida. de información:

output {
elasticsearch {
    hosts => "localhost"
}
}

Tras añadir la configuración, nos aseguramos de que el log de Suricata «eve.json» tenga permisos suficientes para que acceda desde logstash, esto lo haremos con el siguiente comando:

chmod 775 /var/log/suricata/eve.json

Iniciamos el servicio, habilitamos y comprobamos su estado:

Tras comprobar que logstash funciona correctamente, podemos acceder al panel web de Kibana, esto lo haremos accediendo a la dirección IP de nuestro servidor en el puerto 5601:

IP:5601

Tras seleccionar le menú de opciones, nos vamos a dirigir la la opción Management -> Stack Management:

Tras entrar, nos dirigimos a la opción Kibana -> Index Patterns:

Creamos un nuevo índice pulsando en el botón «Créate index patean»:

Escribimos el nombre del índice que ha creado por defecto, que este será donde se aloje toda la información de Suricata y pulsamos en «Create index pattern»:

A continuación, se presentará todos los campos de información que podemos seleccionar:

Una vez configurado el index, vamos al menú de nuevo y nos dirigimos a Analytics -> Discover:

Y finalmente, podremos ver toda la información:

Ahora solo queda crear diferentes dashboard y nuevos paneles de discover para analizar mucho mejor toda la información de Suricata.

Tengo que destacar la importancia de implementación de este tipo de herramientas a la hora de centralización de información, ya que nos permite analizar mucho mejor todos los datos que probablemente si se analizase a mano, pasarían desapercibidos.

Con esto finaliza el artículo de hoy, espero ver vuestro comentario de como implementáis este tipo de herramientas.

Un saludo, David.

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.