Enviando los logs de mod_security a Elasticsearch con Filebeat

por | abril 11, 2019

En mi caso no utilizo una capa de Logstash para preprocesado de datos antes de indexarlos en Elastic por lo que el envío de logs es más sencillo. Si el output de Filebeat es Logstash probablemente sea necesario implementar algún filtro con grok para estructurar la información.

El principal problema de Filebeat para parsear los logs de mod_security es que éstos tienen formato multilínea. Para complicar algo más las cosas los logs se estructuran en diversas secciones (A-Audit Log Header, B-Request Headers, etc…) que nos dan diversa información sobre una transacción registrada. Esto no significa nada para Filebeat así que tendremos que formatear los logs de otra manera significativa.

Por suerte mod_security permite darle formato JSON a sus logs con la siguiente directiva:

SecAuditLogFormat JSON

En /etc/filebeat/filebeat.yml especificamos un nuevo input:

- type: log
  paths:
    - "/var/log/apache2/modsec_audit.log"
  json.keys_under_root: true
  json.add_error_key: true
  json.message_key: log

Reiniciamos Filebeat y Apache:

systemctl restart apache2.serivce
systemctl restart filebeat.service

Ahora en /var/log/apache2/modsec_audit.log debemos ver la salida de log ya en formato JSON. Por su parte si Filebeat está procesando el fichero veremos en el log /var/log/filebeat/filebeat:

2019-04-11T19:52:53.361+0200    INFO    log/harvester.go:255    Harvester started for file: /var/log/apache2/modsec_audit.log

En Kibana vamos a Discover y aplicamos el pattern filebeat-*. Si echamos un vistazo a los campos disponibles, si mod_security está escribiendo en log veremos que tenemos disponibles una serie de campos nuevos (audit_data.engine, transaction.time, etc…) que se corresponden con la estructura del JSON.

Podemos ver los detalles de una entrada en formato tabla:

O en formato JSON:

Una vez tengamos esto queda pendiente visualizar métricas en un Dashboard del propio Kibana o bien Grafana mediante un datasource de Elasticsearch.

Comparte en: