Reglas y alertas con ElastAlert 2

Empieza la fiesta como decía el otroos voy a ir mostrando algunas cositas que creo os van a gustar para poder explotar vuestros logs e ir evolucionando nuestro SIEM en un SOC, temas muy interesantes. De primero tenemos ElastAlert2, que es una herramienta de código abierto que nos permitirá generar alertas basadas en reglas con datos almacenados en Elasticsearch.

Si guardas, por ejemplo logs en Elasticsearch, bien sean logs de tu Directorio Activo, de Entra, de tu firewall, de tus servidores, puestos u otros cacharrospodremos realizar consultas de manera automatizada mediante una serie de reglas, para luego alertarnos si nos interesase de alguna situación (o ejecutar acciones). Pues ElastAlert 2 ha venido para esto, para ayudarnos, podremos crear (o importar) tantas reglas como necesitemos que hagan las consultas que necesitemos.

En este documento veremos un ejemplo concreto, no se, hay tantas posibilidadesvamos a intentar detectar cuando nuestro sistema está comprometido, detectando actividades sospechosas (o maliciosas), al final se trata de prevenir males mayores, bien sea alertándonos o generando acciones que mitiguen el escenario. Pues eso, en el ejemplo que nos toca, intentaremos detectar cuando alguien (por ejemplo) se ha logueado en un firewall FortiGate de manera correcta. Como es un primer documento haremos esto, detectarlo, y generar una alerta por Telegram. En otros documentos veremos muchas más cosicas que se pueden hacer.

Txapas a parte, ¡empezamos! ¿Qué necesitamos? ¡Pues lo de siempre! paciencia y Docker!🤣 Así que en una máquina con un Linux que tengamos para estos menesteres, y tras instalar Docker y Docker Compose, pues vamos a desplegar con él un contenedor, así de fácil, este contenedor, ElastAlert2, será el encargado de leer los ficheros de reglas que dejemos en una carpeta y hacer, lo que tenga que hacer 😅.

git clone https://github.com/jertel/elastalert2.git
cd elastalert2
mkdir config
mkdir rules

Y creamos nuestro docker-compose.yml con algo como esto:

version: '3.9'
services:
    elastalert2:
        image: 'jertel/elastalert2:latest'
        volumes:
            - './rules:/opt/elastalert/rules'
            - './config/elastalert.yaml:/opt/elastalert/config.yaml'
        container_name: elastalert
        restart: unless-stopped
        networks:
           red_elastalert2:

networks:
  red_elastalert2:
    driver: bridge

Y antes de nada, tendremos que editar también el fichero de configuración de ElastAlert2 ‘./config/elastalert.yaml’, donde indicaremos el servidor de Elasticsearch, su puerto, los credenciales de accesoy ya que estamos, vamos a meterle ya los datos de nuestro Telegram, ya que hemos dicho que queremos recibir alertas de este tipo.

es_host: "SERVIDOR_ELASTICSEARCH"
es_port: PUERTO
es_username: USUARIO
es_password: CONTRASEÑA
rules_folder: rules
run_every:
  minutes: 1
buffer_time:
  minutes: 1
writeback_index: elastalert_status
alert_time_limit.days: 2

telegram_bot_token: "TOKEN_BOT_TELEGRAM"
telegram_room_id: "ID_GRUPO_TELEGRAM"
telegram_parse_mode: "html"
alert_text_type: alert_text_only

Lo tenemos listo, no queda más que desplegarlo, y os dejo debajo el comando para verle los logs por si tenéis algún incidente:

sudo docker compose up -d
sudo docker logs elastalert -f

Y ahora queda el trabajo duro 🤠la parte bonita 😍 que no es más que crear las reglas que necesitemos, tantas como, en este caso alertas queramos recibir, eso o importar reglas existentes 😉. Os dejo el ejemplo de una regla (./rules/OpenServicesIT-Fortinet-FortiGate-Inicio-sesion-correcto.yaml) donde veremos lo que esperamos, una regla que buscará logs en un FortiGate con Inicios de sesión correctos, esto es, cada vez que alguien inicia sesión en un FortiGate, por GUI o CLI, de manera satisfactoria. Esa alerta es la que recibiremos, en este caso por Telegram y nada más haremos (por ahora)….

name: Fortinet-FortiGate-Inicio-sesion-correcto
type: frequency
num_events: 1

index: filebeat-*
threshold: 10
use_count_query: false
timeframe:
  minutes: 3

filter:
- query:
    query_string:
      query: 'tags: fortigate AND fortinet.firewall.action: login AND rule.description: "login successful"'

alert:
  - telegram

alert_subject: <b>FortiGate - Inicio de sesión</b>

alert_text: |
  Ha iniciado sesión correctamente un administrador al FortiGate, más info:
  Usuario: {0}
  Método: {1}
  Dirección IP origen: {2}
  Nombre del FW: {3}
alert_text_args: ["source.user.name", "fortinet.firewall.method", "source.ip", "observer.name"]

Como veis, tiene un formato de la regla que deberemos cumplir de manera minuciosa, hay muchas posibilidades, en este caso en particular cada 1 minutos haremos una query de Elasticsearch y en cuanto tengamos 1 evento, pues generará una alerta así de bonita en Telegram. Tampoco volváis loco al Telegram con alertas ‘tontasque para eso tendremos otras herramientas de gestión de incidentes, pero resulta un ejemplo muy práctico de mostrar.

Una vez creada nuestra regla, o cuando las modifiquemos, ElastAlert2 las recargará de manera automática, no hace falta que reiniciemos nada. Y así de fácil, esto se pondrá a buscar lo que necesitemos en nuestro Elasticsearch! Seguramente os ponga algunos otros ejemplos de reglas curiosas que se pueden hacer con ElastAlert2, como sea comprobar contra listas negras, detección de viajes imposibles o el viajero del tiempo (o como se diga), integraciones con decisiones de Crowdsechay hay tela que cortar

Deseando que os vaya fenomenal, os cuidáis, y como siempre, paraguas para la lluvia y sombrilla para el sol 😅 qué frases de viejoun abrazo! 🫂

Posts recomendados

Autor

nheobug@bujarra.com
Autor del blog Bujarra.com Cualquier necesidad que tengas, no dudes en contactar conmigo, os intentare ayudar siempre que pueda, compartir es vivir ;) . Disfrutar de los documentos!!!