Recopilando los LOGs de Synology en Elasticsearch y visualizándolos en Grafana

Bueno, va otro post de recopilar logs y visualizarlos para comprender qué pasa en nuestra infraestructura, hoy tenemos un documento donde veremos cómo enviar los Logs de una Synology a nuestro Logstash para luego almacenarlo en Elasticsearch y finalmente visualizarlo con Grafana.

Así que, ¡caña al mono que es de goma! (que viejo soy, agur yogur…) va! Si tenemos una NAS del fabricante Synology y queremos saber qué es lo que pasa en ella, lo mejor es siempre tirarnos a los logs, pero es un poco aburrido leer líneas y líneas de texto, que no siempre van en tiempo real, que nos cuesta comprender… Pues para eso (y otras cosas más) tenemos Elastic Stack, donde la Synology enviará los Logs a Logstash, ahí los recibiremos y los trataremos, separando en distintos campos la info que nos interesa y luego se almacene en Elasticsearch. Para visualizar los datos siempre podemos usar Kibana, pero es que yo soy más de Grafana, lo siento, así que sea la elección que sea, podrás visualizar esos datos recopilados en distintos formatos, en tablas, gráficas, quesitos, mapamundis… así interpretarás qué pasa en la Synology, quién accede o lo intenta, y qué hace… podrás verlo como siempre, en tiempo real o a modo histórico para hacer consultas. ¡Empezamos!

 

Primero obviamente tenemos que tener la parte de Elastic Stack instalada, lo que viene siendo LogstashElasticsearch y Kibana; luego ya sería indicarle a nuestra Synology que envíe los Logs a Logstash, al puerto que nos de la gana, nos inventaremos uno, desde el “Centro de Registros“ > “Envío de registros” > habilitamos “Enviar registros a un syslog server”, indicamos la IP de Logstash y el puerto y TCP o UDP a elección. Y aplicamos los cambios.

 

input {
        tcp {
                type => "Synology"
                port => "1516"
                tags => ["Synology"]
        }
}

filter {

        if [type] == "Synology" {
                        grok {
                            match => { "message" => [
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{HOSTNAME:host_title} WinFileService Event: %{WORD:action}, Path: %{GREEDYDATA:path}, File/Folder: %{WORD:path_type}, Size: %{BASE10NUM:file_size} %{WORD:file_size_unit}, User: %{USERNAME:username}, IP: %{IP:src_ip}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{HOSTNAME:host_title} Connection: User \[%{USERNAME:username}\] from \[%{HOSTNAME:Equipo}\(%{IP:src_ip}\)\] via \[%{DATA:Protocolo}\] %{GREEDYDATA:Mensaje} \[%{DATA:shared_folder}\]",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{HOSTNAME:host_title} Connection: User \[(%{USERNAME:username})?\] from \[%{IP:src_ip}\] %{GREEDYDATA:Mensaje}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{HOSTNAME:host_title} Connection\[%{INT:Id_proc}\]: SYSTEM: %{GREEDYDATA:Mensaje}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{HOSTNAME:host_title} System %{USERNAME:username}: %{GREEDYDATA:Mensaje}"
                                       ]
                            }
                        }
        }
}

output {

        if ([type]=="Synology"){

                elasticsearch {
                   index => "synology-%{+YYYY.MM.dd}"
                   hosts => "DIRECCION_IP_ELASTICSEARCH:9200"
                }

        }
}

Ahora nos vamos a nuestro Logstash, y ahí podremos crear filtros para separar los distintos campos de los distintos logs que recibamos. Como siempre mejorable, pero estos grok nos valdrán al menos para una Synology DSM con versión 7.0. Así que creamos un fichero de configuración, por ejemplo ‘/etc/logstash/conf.d/synology.conf’ y con este contenido algo haremos.

 

Una vez creado el fichero de configuración, recordar reiniciar el servicio de Logstash para recargar. Después como siempre, iremos a Kibana y una vez los datos estén entrando ya podremos ir a “Management” > “Stack management” > “Kibana” > “Index Patterns” > “Create index pattern” para crear el patrón del índice, lo dicho, como habitualmente (en este caso y sin las comillas) ‘synology-*’ y tendremos los datos ya en Elasticsearch almacenados de manera correcta. Ahora podríamos conectarnos desde “Analytics” > “Discover” a nuestro índice de Synology y visualizar que está recogiendo datos.

 

Y luego ya, tras crear el índice en Kibana, ahora en nuestro Grafana deberíamos crear un “Data Source” que apunte contra nuestro Elasticsearch y el índice de Synology. Luego ya es dejar volar la imaginación, hacer un Dashboard con distintos Paneles, con distintos datos a visualizar, uno de estilo Sankey para ver IPs origen/destino y el tráfico que se envían, en formato columnas, en tablas para ver datos concretos de por ejemplo los logins correctos, incorrectos, las conexiones, los ficheros que se crean, modifican, eliminan, los usuarios que realizan la acción…