Gracias al plugin tail de Collectd podemos crear un sencillo dashboard de seguridad en Grafana en el que poder ver el número total de sesiones, intentos fallidos de login SSH, bloqueos de fail2ban y número de requests bloqueadas por mod_security.
Este plugin nos permite parsear un log para alimentar métricas -en este caso contadores- que después podemos visualizar en nuestros dashboards. En mi caso también estoy utilizando InfluxDB para almacenar dichas métricas.
En el fichero de configuración de Collectd /etc/collectd/collectd.conf tendremos que descomentar en primer lugar la carga del plugin:
LoadPlugin tail
En la sección de configuración del plugin añadimos:
# Número total de sesiones de usuarios <File "/var/log/auth.log"> Instance "auth" <Match> Regex ".*pam_unix.*: session\ opened\ for.*" DSType "CounterInc" Type "counter" Instance "auth_user_session" </Match> </File> # Intentos de login fallidos por SSH <File "/var/log/auth.log"> Instance "auth" <Match> Regex "\\<sshd[^:]*: Invalid user [^ ]+ from\\>" DSType "CounterInc" Type "counter" Instance "sshd_invalid_user" </Match> </File> # Logins por SSH <File "/var/log/auth.log"> Instance "auth" <Match> Regex ".*sshd.*: Starting session:.*" DSType "CounterInc" Type "counter" Instance "sshd_login" </Match> </File> # Bloqueos de autenticación de fail2ban <File "/var/log/fail2ban.log"> Instance "fail2ban" <Match> Regex ".*fail2ban.actions.*Ban.*" DSType "CounterInc" Type "counter" Instance "fail2ban_block" </Match> </File> # Requests bloqueadas por mod_security <File "/var/log/apache2/error.log"> Instance "modsecurity" <Match> Regex "ModSecurity:.*>" DSType "CounterInc" Type "counter" Instance "modsecurity_block" </Match> </File>
En Grafana el tipo de gráficas que utilizo son de tipo barra agrupando valores en intervalos de 10 minutos.
Las queries son:
# Número total de sesiones de usuarios SELECT non_negative_derivative(last("value"), 10m) FROM "tail_value" WHERE ("host" =~ /^$host$/ AND "type_instance" = 'auth_user_session') AND $timeFilter GROUP BY time(10m) fill(null) # Intentos de login fallidos por SSH SELECT non_negative_derivative(last("value"), 10m) FROM "tail_value" WHERE ("host" =~ /^$host$/ AND "type_instance" = 'sshd_invalid_user') AND $timeFilter GROUP BY time(10m) fill(null) # Bloqueos de autenticación de fail2ban SELECT non_negative_derivative(last("value"), 10m) FROM "tail_value" WHERE ("host" =~ /^$host$/ AND "type_instance" = 'fail2ban_block') AND $timeFilter GROUP BY time(10m) fill(null) # Requests bloqueadas por mod_security SELECT non_negative_derivative(last("value"), 10m) FROM "tail_value" WHERE ("host" =~ /^$host$/ AND "type_instance" = 'modsecurity_block') AND $timeFilter GROUP BY time(10m) fill(null) # Logins por SSH SELECT non_negative_derivative(last("value"), 10m) FROM "tail_value" WHERE ("host" =~ /^$host$/ AND "type_instance" = 'sshd_login') AND $timeFilter GROUP BY time(10m) fill(null)
En mi caso obtengo gráficas con el número de logins, bloqueos, etc…
Esto es sólo un ejemplo, realmente podemos parsear los patrones que necesitemos y construir dashboards más complejos (por ejemplo, jails en los que hay bloqueo de fail2ban, separar bloqueos de mod_security por tipo de regla, etc…)
Como cada query utiliza variables de entorno y puede hacerse un poco infumable generar el dashboard sin más información, he dejado un Gist en mi cuenta con el fichero JSON que puede importarse fácilmente en cualquier instalación de Grafana.