Collecter les LOG Ubiquiti UniFi dans Elasticsearch et les visualiser dans Grafana

Et nous continuons avec des choses plus étranges… aujourd’hui le premier de collecte de Logs dans l’environnement Ubiquiti Unifi, de nos points d’accès, Commutateurs… Pour la deuxième fois, nous analysons., nous traitons les Logs avec Logstash et pour le dessert nous les stockons dans Elasticsearch, et la cerise sur le gâteau sera de le visualiser avec Grafana. Tout cela pour contrôler en temps réel ce qui se passe dans notre infrastructure de communication, qui tente d’accéder au Wisfis…

Eh bien, ce que j’ai dit, si nous avons des Ubiquiti qui offrent un service et que nous voulons savoir ce qui se passe là-bas, Qui communique avec qui… J’étais plus curieux de connaître la partie WiFi, Afficher les tentatives de connexion, Santé du client… chacun visualisera ce qui l’intéresse le plus. Nous allons donc commencer par demander à la console UniFi de stocker les journaux dans un syslog, notre Logstash enverra les journaux et je vous laisserai un exemple de fichier pour filtrer et pouvoir séparer les données collectées en champs intéressants, ce même fichier de configuration indiquera que les informations déjà séparées en différents champs sont stockées dans un index Elasticsearch. Et nous terminerons par Kibana ou Grafana en visualisant dans un Dashboard les informations qui nous intéressent et dans le format qui nous intéresse.

Tout d’abord, nous devons évidemment faire installer la partie Elastic Stack, Ce qui a été Logstash, Recherche élastique et Kibana; Ensuite, nous activons le syslog à distance à partir de la console UniFi Controller > “Paramètres” > “Paramètres système” > “Configuration du contrôleur” > “Journalisation à distance”, et il ne nous suffit que d’activer la partie Syslog, sans Netconsole. Indicamos la dirección IP de nuestro Logstash y un puerto aleatorio no usado donde mandará los Logs.

Entrée {
        UDP {
                type => "UniFi"
                port => "1601"
                Mots-clés => ["UniFi"]
        }
}

filtre {

        si [type] == "UniFi" {
                        Grok {
                            match => { "Message" => [
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{MOT:UniFi_MAC},%{GREEDYDATA:UniFi_Firmware}: %{PROG:Proceso_nombre}: \[%{NOMBRE:Proceso_pid}\] \[%{DATE:Proceso_tarea}\] Expiration de la requête DNS; \[STA: %{COMMONMAC:Cliente_MAC}\]\[REQUÊTE: %{GREEDYDATA:Cliente_consulta}\] \[DNS_SERVER :%{IPV4}\] \[TXN_ID %{DATE:Txn_id}\] \[SRCPORT %{NOMBRE:Cliente_puerto_origen}\]",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{MOT:UniFi_MAC},%{GREEDYDATA:UniFi_Firmware}: %{PROG:Proceso_nombre}: \[%{NOMBRE:Proceso_pid}\] \[%{DATE:Proceso_tarea}\] %{GREEDYDATA:Message}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{MOT:UniFi_MAC},%{GREEDYDATA:UniFi_Firmware}: : %{PROG:Proceso_nombre}\[%{NOMBRE:Proceso_pid}\]: wireless_agg_stats.log_sta_anomalies(\): bssid=%{COMMONMAC:BSSID_MAC} radio=%{MOT:BSSID_radio} vap=%{MOT:vap} sta=%{COMMONMAC:Cliente_MAC} satisfaction_now=%{NOMBRE:Cliente_satisfaccion} anomalies=%{GREEDYDATA:Cliente_anomalia}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{MOT:UniFi_MAC},%{GREEDYDATA:UniFi_Firmware}: : %{PROG:Proceso_nombre}\[%{NOMBRE:Proceso_pid}\]: \[%{DATE:Proceso_tarea}\].stahtd_dump_event\(\): \{\"query_%{NOMBRE:Consulta_id}\":\"%{NOM D’HÔTE:Consulta_FQDN}\",\"mac\":\"%{COMMONMAC:Cliente_MAC}\",\"message_type\":\"%{DATE:Mensaje_tipo}\",\"query_server_%{NOMBRE:Consulta_id}\":\"%{IPV4:IP_servidor}\",\"assoc_status\":\"%{NOMBRE:Asociacion_estado}\",\"vap\":\"%{MOT:vap}\",\"event_type\":\"%{DATE:Evento_tipo}\"\}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{MOT:UniFi_MAC},%{GREEDYDATA:UniFi_Firmware}: : %{PROG:Proceso_nombre}\[%{NOMBRE:Proceso_pid}\]: \[%{DATE:Proceso_tarea}\].stahtd_dump_event\(\): \{\"dns_resp_seen\":\"%{MOT:DNS_resp_seen}\",\"message_type\":\"%{DATE:Mensaje_tipo}\",\"mac\":\"%{COMMONMAC:Cliente_MAC}\",\"vap\":\"%{MOT:vap}\",\"assoc_status\":\"%{NOMBRE:Asociacion_estado}\",\"event_type\":\"%{DATE:Evento_tipo}\",\"event_id\":\"%{NOMBRE:Evento_id}\",\"arp_reply_gw_seen\":\"%{MOT:ARP_resp_seen}\",\"auth_ts\":\"%{NOMBRE:Auth_ts}\"\}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{MOT:UniFi_MAC},%{GREEDYDATA:UniFi_Firmware}: : %{PROG:Proceso_nombre}\[%{NOMBRE:Proceso_pid}\]: \[%{DATE:Proceso_tarea}\].stahtd_dump_event\(\): \{\"query_server_%{NOMBRE:Consulta_id}\":\"%{IPV4}\",\"query_%{NOMBRE:Consulta_id}\":\"%{NOM D’HÔTE:Consulta_FQDN}\",\"mac\":\"%{COMMONMAC:Cliente_MAC}\",\"message_type\":\"%{DATE:Mensaje_tipo}\",\"assoc_status\":\"%{NOMBRE:Asociacion_estado}\",\"vap\":\"%{MOT:vap}\",\"event_type\":\"%{DATE:Evento_tipo}\"\}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{MOT:UniFi_MAC},%{GREEDYDATA:UniFi_Firmware}: : %{PROG:Proceso_nombre}\[%{NOMBRE:Proceso_pid}\]: \[%{DATE:Proceso_tarea}\].stahtd_dump_event\(\): \{\"query_server_%{NOMBRE:Consulta_id}\":\"%{IPV4}\",\"mac\":\"%{COMMONMAC:Cliente_MAC}\",\"message_type\":\"%{DATE:Mensaje_tipo}\",\"vap\":\"%{MOT:vap}\",\"%{DATE:Evento_tipo}\",\"query_%{NOMBRE:Consulta_id}\":\"%{NOM D’HÔTE:Consulta_FQDN}\",\"assoc_status\":\"%{NOMBRE:Asociacion_estado}\"\}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{MOT:UniFi_MAC},%{GREEDYDATA:UniFi_Firmware}: : %{PROG:Proceso_nombre}\[%{NOMBRE:Proceso_pid}\]: \[%{DATE:Proceso_tarea}\].stahtd_dump_event\(\): \{\"mac\":\"%{COMMONMAC:Cliente_MAC}\",\"message_type\":\"%{DATE:Mensaje_tipo}\",\"assoc_status\":\"%{NOMBRE:Asociacion_estado}\",\"vap\":\"%{MOT:vap}\",\"event_type\":\"%{DATE:Evento_tipo}\":\"%{NOMBRE:Evento_id}\"\}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{MOT:UniFi_MAC},%{GREEDYDATA:UniFi_Firmware}: : %{PROG:Proceso_nombre}\[%{NOMBRE:Proceso_pid}\]: \[%{DATE:Proceso_tarea}\].stahtd_dump_event\(\): \{\"mac\":\"%{COMMONMAC:Cliente_MAC}\",\"message_type\":\"%{DATE:Mensaje_tipo}\",\"vap\":\"%{MOT:vap}\",\"query_server_%{NOMBRE:Consulta_id}\":\"%{IPV4}\",\"event_type\":\"%{DATE:Evento_tipo}\",\"assoc_status\":\"%{NOMBRE:Asociacion_estado}\",\"query_%{NOMBRE:Consulta_id}\":\"%{NOM D’HÔTE:Consulta_FQDN}\"\}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{MOT:UniFi_MAC},%{GREEDYDATA:UniFi_Firmware}: : %{PROG:Proceso_nombre}\[%{NOMBRE:Proceso_pid}\]: \[%{DATE:Proceso_tarea}\].stahtd_dump_event\(\): \{\"dns_resp_seen\":\"%{MOT:DNS_resp_seen}\",\"mac\":\"%{COMMONMAC:Cliente_MAC}\",\"message_type\":\"%{DATE:Mensaje_tipo}\",\"assoc_status\":\"%{NOMBRE:Asociacion_estado}\",\"vap\":\"%{MOT:vap}\",\"event_type\":\"%{DATE:Evento_tipo}\",\"event_id\":\"%{NOMBRE:Evento_id}\",\"auth_ts\":\"%{NOMBRE:Auth_ts}\"\}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{MOT:UniFi_MAC},%{GREEDYDATA:UniFi_Firmware}: : %{PROG:Proceso_nombre}\[%{NOMBRE:Proceso_pid}\]: \[%{DATE:Proceso_tarea}\].stahtd_dump_event\(\): \{\"dns_resp_seen\":\"%{MOT:DNS_resp_seen}\",\"message_type\":\"%{DATE:Mensaje_tipo}\",\"mac\":\"%{COMMONMAC:Cliente_MAC}\",\"ip_assign_type\":\"%{DATE:Tipo_asignacion_ip}\",\"vap\":\"%{MOT:vap}\",\"assoc_status\":\"%{NOMBRE:Asociacion_estado}\",\"event_type\":\"%{DATE:Evento_tipo}\",\"auth_ts\":\"%{NOMBRE:Auth_ts}\",\"wpa_auth_delta\":\"%{NOMBRE:WPA_auth_delta}\",\"assoc_delta\":\"%{NOMBRE:Assoc_delta}\",\"auth_delta\":\"%{NOMBRE:Auth_delta}\",\"event_id\":\"%{NOMBRE:Evento_id}\"\}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{MOT:UniFi_MAC},%{GREEDYDATA:UniFi_Firmware}: %{PROG:Proceso_nombre}: %{MOT:vap}: STA %{COMMONMAC:Cliente_MAC} %{DATE:Proceso_tarea}: %{GREEDYDATA:Message}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{MOT:UniFi_MAC},%{GREEDYDATA:UniFi_Firmware}: : %{PROG:Proceso_nombre}\[%{NOMBRE:Proceso_pid}\]: wevent.ubnt_custom_event\(\): %{DATE:Evento_tipo} %{MOT:vap}: %{COMMONMAC:Cliente_MAC} / %{IPV4:Cliente_ip}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{MOT:UniFi_MAC},%{GREEDYDATA:UniFi_Firmware}: : %{PROG:Proceso_nombre}\[%{NOMBRE:Proceso_pid}\]: wevent.ubnt_custom_event\(\): %{DATE:Evento_tipo} %{MOT:vap}: %{COMMONMAC:Cliente_MAC} / %{NOMBRE:Evento_id}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{MOT:UniFi_MAC},%{GREEDYDATA:UniFi_Firmware}: : %{PROG:Proceso_nombre}\[%{NOMBRE:Proceso_pid}\]: %{GREEDYDATA:Message}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{MOT:UniFi_MAC},%{GREEDYDATA:UniFi_Firmware}: %{PROG:Proceso_nombre}: %{DATE:Proceso_tarea}\[%{NOMBRE:Proceso_pid}\]: %{GREEDYDATA:Tâche}: %{GREEDYDATA:Message}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{MOT:UniFi_MAC},%{GREEDYDATA:UniFi_Firmware}: %{PROG:Proceso_nombre}: %{DATE:Proceso_tarea} %{COMMONMAC:Cliente_MAC} %{MOT:vap} \(%{GREEDYDATA:Message}\)",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{MOT:UniFi_MAC},%{GREEDYDATA:UniFi_Firmware}: %{UNIXPATH:Proceso_nombre}\[%{NOMBRE:Proceso_pid}\]: %{GREEDYDATA:Message}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{MOT:UniFi_MAC},%{GREEDYDATA:UniFi_Firmware}: %{PROG:Proceso_nombre}: \[%{NOMBRE:Proceso_pid}\] %{GREEDYDATA:Message}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{MOT:UniFi_MAC},%{GREEDYDATA:UniFi_Firmware}: %{PROG:Proceso_nombre}: %{DATE:Proceso_tarea}: %{GREEDYDATA:Message}"
                                       ]
                            }
                        }

                        Muet {
                          convertir => {
                            "Cliente_satisfaccion" => "Entier"
                          }
                        }
        }
}

sortie {

        si ([type]=="UniFi"){

                Recherche élastique {
                   indice => "unifi-%{+AAAA. MM.jj}"
                   hôtes=> "DIRECCION_IP_ELASTICSEARCH:9200"
                }

        }
}

Continuer, necesitamos crear un fichero en Logstash para ingestar, Transformer et envoyer des données. Tout d’abord, nous allons écouter sur le port TCP indiqué dans UniFi que nous avons vu à l’étape précédente; deuxième, tratar los logs que recibe y separarlos en distintos campos para ser por último almacenados en nuestro Elasticsearch. Créons donc par exemple le fichier de configuration '/etc/logstash/conf.d/unifi.conf', Nous allons continuer avec les filtres, J’ai fait mon travail du mieux que j’ai pu, Je m’excuse auprès des sages à ce sujet, mais totalement valable pour collecter les Logs de l’Ubiquiti UniFi avec la version 6.2.x. En fin de compte, dans la sortie, nous afficherons notre Elasticsearch, N’oubliez pas d’entrer le nom d’utilisateur & que le mien est un LAB et j’adore les pires pratiques… Et pardonnez vraiment aux vrais gourous mes groks, Je suis toujours en 1er des filtres.

Une fois le fichier de configuration créé, n’oubliez pas de redémarrer le service Logstash pour recharger la nouvelle configuration. Après comme toujours, nous irons sur Kibana et une fois que les données arriveront, nous pourrons aller dans « Gestion » > « Gestion de la pile » > « Kibana » > « Modèles d’indice » > « Create index pattern » pour créer le modèle d’index, Comme je l’ai dit, comme d'habitude (dans ce cas et sans les guillemets) 'unifi-*' et nous aurons les données déjà stockées correctement dans Elasticsearch. Nous pouvons maintenant nous connecter de « Discover » à notre indice Ubiquiti UniFi pour visualiser qu’il collecte des données.

Et nous nous retrouvons comme toujours à Grafana! TCréation de l’index dans Kibana, maintenant, dans notre bien-aimé Grafana, nous devrions créer une « Source de données » qui cible notre Elasticsearch et l’indice UniFi. Ensuite, il s’agit de laisser libre cours à votre imagination, créer un tableau de bord avec différents tableaux de bord, avec différentes données à visualiser, Graphiques avec satisfaction du client/qualité de connexion, Un Carte du monde avec liaisons entrantes/sortantes, Une question de style Sankey pour afficher les adresses IP/points d’accès des clients, au format colonne, dans pat pour afficher des données spécifiques sur, par exemple, les accès réussis, Incorrect, les connexions...

Comme d'habitude, essayer d’inspirer ou d’aider, si vous l’améliorez, vous 😉 me le transmettez.(s) Appareils Ubiquiti, aux points d’accès, sur les commutateurs, en temps réel, Mettre un rafraîchissement automatique tous les 10 secondes est très impressionnant, Cela nous aidera également à analyser le résumé des dernières 24 heures, ou savoir quand quelque chose d’étrange se produit... comme le voisin qui essaie de se connecter.. Comme d'habitude, Merci à tous et bien plus encore à ceux qui déplacent ce type de contenu sur les réseaux sociaux 😉 Héhé, câlins!

Articles recommandés

Auteur

nheobug@bujarra.com
Autor del blog Bujarra.com Cualquier necesidad que tengas, N’hésitez pas à me contacter, J’essaierai de vous aider chaque fois que je le pourrai, Partager, c’est vivre ;) . Profiter des documents!!!