Enviando los logs de mod_security a Elasticsearch con Filebeat

por | abril 11, 2019

Si queremos enviar los logs de mod_security con Filebeat, el principal problema es que tienen formato multilínea y para complicar algo más las cosas los logs se estructuran en diversas secciones (A-Audit Log Header, B-Request Headers, etc…) que, aunque nos dan diversa información sobre una transacción registrada, hacen que el parseo con grok sea bastante complejo. Afortunadamente mod_security permite generar los logs de auditoría en formato JSON, por lo que podemos enviar la información ya estructurada a nuestro stack ELK. Configuramos 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.