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.