Introducción
Con el objetivo de recibir notificaciones dependiendo de que eventos sucedieran y se registraran en ElasticSearch, he hecho una prueba de con la herramienta ElastAlert, que puede ser muy potente gracias a la facilidad de configuración de las reglas. El repositorio es el siguiente:
https://github.com/Yelp/elastalert
Esta se conecta con ElasticSearch a través de la API y consulta los indices que le indiquemos en las reglas, para comprobar determinados comportamientos, como frecuencia de repetición, logs concretos, etc.
Para hacer la prueba, se puede lanzar ElastAlert dockerizado en cualquier equipo que tenga acceso a la API de tu Elasticsearch.
Configuración
Lo primero que necesitamos, es descargar el repositorio del proyecto (no es el mismo que el anterior, este está listo para dockerizar):
git clone https://github.com/bitsensor/elastalert.git
Una vez lo tengamos descargado, podemos configurar las opciones principales en el fichero config/elastalert.yml:
es_host: ELASTICSEARCH_URL
es_port: ELASTICSEARCH_PORT
rules_folder: rules
run_every:
seconds: 5
buffer_time:
minutes: 1
use_ssl: True
verify_certs: True
ca_certs: /opt/elastalert/cacert.pem
es_send_get_body_as: GET
es_username: admin
es_password: N******3
writeback_index: elastalert_status
alert_time_limit:
days: 2
Es importante que desde el host pueda llegar al cluster de ELK por el puerto indicado, y si es necesaria la conexión por HTTPS, tener el certificado. La ruta del certificado es la de dentro del contenedor, que montaremos como volumen en el siguiente paso.
Configurar reglas
Las reglas se definen en ficheros yaml dentro del directorio rules. Por defecto las cargará todas.
Nosotros vamos a configurar una regla simple para que compruebe en un indice concreto (ejemplo-*) si dentro del campo mensaje (msg.message) si hace match con un string en concreto: “Error”.
En el apartado de include, indicaremos todos los campos que necesitamos para mostrarlos como titulo en la alerta, o como parte del propio mensaje.
También definiremos el método para enviar la notificación de alerta (alert), en este caso, un Webhook de MSTeams, pero puede ser cualquier otro, como email, Jira, slack, etc. Puedes ver las diferentes alertas aquí: https://elastalert.readthedocs.io/en/latest/ruletypes.html#alerts
Quedaría así:
name: Alert on any error index: ejemplo-* timestamp_field: "@timestamp" type: any filter: - query: query_string: query: "ERROR" include: - msg.message - agent.hostname - fields.Component match_enhancements: - "elastalert_modules.bitsensor_enhancement.AlertTextEnhancement" run_enhancements_first: true alert_subject: "Found error on {}" alert_subject_args: - fields.Component alert_text_type: alert_text_only alert_text: "Found error in: {}" alert_text_args: - msg.message alert: - ms_teams ms_teams_webhook_url: "https://xxx.webhook.office.com/webhookb2/*********" ms_teams_alert_summary: "Error message" alert_text_type: alert_text_only
Puedes encontrar como configurar reglas aquí. https://elastalert.readthedocs.io/en/latest/ruletypes.html#
Ejecutar contenedor Docker
Ahora ejecutaremos el contenedor de Docker, montando como volumen los directorios con las reglas y la configuración, sin olvidar del certificado. Es importante que lo lancemos desde dentro del directorio (o modifiquemos el comando).
Para la prueba que hemos hecho, debido a la versión de ElasticSearch, solo podemos utilizar la versión 3.0.0-beta0 como máximo, ya que la ultima no es compatible, pero en cada caso puede ser distinto. Puedes ver en los tags las versiones compatibles.
Así crearíamos el contenedor:
docker run -d -p 3030:3030 -v `pwd`/config/elastalert.yaml:/opt/elastalert/config.yaml -v `pwd`/config/config.json:/opt/elastalert-server/config/config.json -v `pwd`/rules:/opt/elastalert/rules -v `pwd`/rule_templates:/opt/elastalert/rule_templates -v `pwd`/cacert.pem:/opt/elastalert/cacert.pem --net="host" --name elastalert bitsensor/elastalert:3.0.0-beta.0
En los logs, podemos ver como arranca el servidor, y utiliza las reglas:
13:10:49.616Z INFO elastalert-server: ProcessController: Starting ElastAlert
13:10:49.616Z INFO elastalert-server: ProcessController: Creating index
13:10:50.579Z INFO elastalert-server:
ProcessController: Elastic Version: 7.10.0
Reading Elastic 6 index mappings:
Reading index mapping 'es_mappings/6/silence.json'
Reading index mapping 'es_mappings/6/elastalert_status.json'
Reading index mapping 'es_mappings/6/elastalert.json'
Reading index mapping 'es_mappings/6/past_elastalert.json'
Reading index mapping 'es_mappings/6/elastalert_error.json'
Index elastalert_status already exists. Skipping index creation.
13:10:50.579Z INFO elastalert-server: ProcessController: Index create exited with code 0
13:10:50.580Z INFO elastalert-server: ProcessController: Starting elastalert with arguments [none]
13:10:50.593Z INFO elastalert-server: ProcessController: Started Elastalert (PID: 38)
13:10:50.594Z INFO elastalert-server: Server: Server listening on port 3030
13:10:50.595Z INFO elastalert-server: Server: Websocket listening on port 3333
13:10:50.596Z INFO elastalert-server: Server: Server started
13:10:51.880Z INFO elastalert-server:
ProcessController: 1 rules loaded
También crea indices del estado (para saber que alertas ha enviado ya y cuales quedan pendientes, por ejemplo) llamados elastalert-*.
Si todo funciona correctamente, ya recibiremos las alertas.
Si te ha gustado, compartelo en tu red social favorita, ¡gracias!
0 comentarios