Sammeln der Ubiquiti UniFi LOGs in Elasticsearch und Anzeigen in Grafana

Und wir fahren mit weiteren seltsamen Dingen fort… heute der erste, der Protokolle in der Ubiquiti Unifi-Umgebung sammelt, unserer APs, Schalter… zweitens analysieren wir, wir behandeln die Logs mit Logstash und zum Nachtisch speichern wir sie in Elasticsearch, und das i-Tüpfelchen wird sein, es mit Grafana zu visualisieren. All dies, um in Echtzeit zu kontrollieren, was in unserer Kommunikationsinfrastruktur passiert, wer versucht, auf die Wisfis zuzugreifen…

Nun, was wurde gesagt, wenn wir Ubiquiti da draußen haben, die einen Service anbieten, und wir wissen wollen, was dort passiert?, wer kommuniziert mit wem… Ich war neugieriger auf den WiFi-Teil, Verbindungsversuche anzeigen, Kundengesundheit… jeder wird visualisieren, was ihn am meisten interessiert. Wir beginnen also damit, die UniFi-Konsole anzuweisen, die Protokolle in einem Syslog zu speichern, Es sendet die Protokolle an unseren Logstash und ich hinterlasse Ihnen eine Beispieldatei zum Filtern und um die gesammelten Daten in interessante Felder zu unterteilen, dieselbe Konfigurationsdatei zeigt an, dass die bereits in verschiedenen Feldern getrennten Informationen in einem Elasticsearch-Index gespeichert sind. Und wir werden damit enden, dass Kibana oder Grafana in einem Dashboard die Informationen anzeigen, die uns interessieren, und in dem Format, das uns interessiert.

Zuerst müssen wir natürlich das Elastic Stack-Teil installieren, was war Logstash, Elasticsearch und Kibana; Dann aktivieren wir Remote-Syslog von der UniFi Controller-Konsole > „die Einstellungen“ > „Systemeinstellungen“ > „Controller-Konfiguration“ > „Fernprotokollierung“, und mit der Aktivierung nur des Syslog-Teils sind wir es wert, sin Netconsole. Wir geben die IP-Adresse unseres Logstash und einen zufälligen Port an, der nicht verwendet wird, an den die Logs gesendet werden.

Eingang {
        udp {
                Typ => "UniFi"
                port => "1601"
                Tags => ["UniFi"]
        }
}

Filter {

        ob [Art] == "UniFi" {
                        grok {
                            Übereinstimmung => { "Botschaft" => [
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{WORT:UniFi_MAC},%{GREEDYDATA:UniFi_Firmware}: %{PROG:Vorgangsname}: \[%{NUMMER:Prozess_pid}\] \[%{DATEN:Prozess_Aufgabe}\] Zeitüberschreitung bei DNS-Anfrage; \[IST: %{COMMONMAC:Client_MAC}\]\[ANFRAGE: %{GREEDYDATA:customer_query}\] \[DNS SERVER :%{IPV4}\] \[TXN_ID %{DATEN:Txn_id}\] \[SRCPORT %{NUMMER:Client_port_origen}\]",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{WORT:UniFi_MAC},%{GREEDYDATA:UniFi_Firmware}: %{PROG:Vorgangsname}: \[%{NUMMER:Prozess_pid}\] \[%{DATEN:Prozess_Aufgabe}\] %{GREEDYDATA:Nachricht}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{WORT:UniFi_MAC},%{GREEDYDATA:UniFi_Firmware}: : %{PROG:Vorgangsname}\[%{NUMMER:Prozess_pid}\]: wireless_agg_stats.log_sta_anomalies\(\): bssid = %{COMMONMAC:BSSID_MAC} Funk=%{WORT:BSSID_radio} Dampf=%{WORT:Dampf} Mitarbeiter = %{COMMONMAC:Client_MAC} Zufriedenheit_jetzt=%{NUMMER:Kundenzufriedenheit} Anomalien=%{GREEDYDATA:Kundenanomalie}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{WORT:UniFi_MAC},%{GREEDYDATA:UniFi_Firmware}: : %{PROG:Vorgangsname}\[%{NUMMER:Prozess_pid}\]: \[%{DATEN:Prozess_Aufgabe}\].stahtd_dump_event\(\): \{\"Anfrage_%{NUMMER:Consulta_id}\":\"%{Hostname:Abfrage_FQDN}\",\"mac\":\"%{COMMONMAC:Client_MAC}\",\"message_type\":\"%{DATEN:Nachrichtentyp}\",\"query_server_%{NUMMER:Consulta_id}\":\"%{IPV4:server_ip}\",\"assoc_status":\"%{NUMMER:Verbandsstaat}\",\"vap\":\"%{WORT:Dampf}\",\"event_type\":\"%{DATEN:Ereignistyp}\"\}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{WORT:UniFi_MAC},%{GREEDYDATA:UniFi_Firmware}: : %{PROG:Vorgangsname}\[%{NUMMER:Prozess_pid}\]: \[%{DATEN:Prozess_Aufgabe}\].stahtd_dump_event\(\): \{\"dns_resp_seen\":\"%{WORT:DNS_resp_seen}\",\"message_type\":\"%{DATEN:Nachrichtentyp}\",\"mac\":\"%{COMMONMAC:Client_MAC}\",\"vap\":\"%{WORT:Dampf}\",\"assoc_status":\"%{NUMMER:Verbandsstaat}\",\"event_type\":\"%{DATEN:Ereignistyp}\",\"event_id\":\"%{NUMMER:Evento_id}\",\"arp_reply_gw_seen\":\"%{WORT:ARP_resp_seen}\",\"auth_ts\":\"%{NUMMER:Auth_ts}\"\}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{WORT:UniFi_MAC},%{GREEDYDATA:UniFi_Firmware}: : %{PROG:Vorgangsname}\[%{NUMMER:Prozess_pid}\]: \[%{DATEN:Prozess_Aufgabe}\].stahtd_dump_event\(\): \{\"query_server_%{NUMMER:Consulta_id}\":\"%{IPV4}\",\"Anfrage_%{NUMMER:Consulta_id}\":\"%{Hostname:Abfrage_FQDN}\",\"mac\":\"%{COMMONMAC:Client_MAC}\",\"message_type\":\"%{DATEN:Nachrichtentyp}\",\"assoc_status":\"%{NUMMER:Verbandsstaat}\",\"vap\":\"%{WORT:Dampf}\",\"event_type\":\"%{DATEN:Ereignistyp}\"\}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{WORT:UniFi_MAC},%{GREEDYDATA:UniFi_Firmware}: : %{PROG:Vorgangsname}\[%{NUMMER:Prozess_pid}\]: \[%{DATEN:Prozess_Aufgabe}\].stahtd_dump_event\(\): \{\"query_server_%{NUMMER:Consulta_id}\":\"%{IPV4}\",\"mac\":\"%{COMMONMAC:Client_MAC}\",\"message_type\":\"%{DATEN:Nachrichtentyp}\",\"vap\":\"%{WORT:Dampf}\",\"%{DATEN:Ereignistyp}\",\"Anfrage_%{NUMMER:Consulta_id}\":\"%{Hostname:Abfrage_FQDN}\",\"assoc_status":\"%{NUMMER:Verbandsstaat}\"\}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{WORT:UniFi_MAC},%{GREEDYDATA:UniFi_Firmware}: : %{PROG:Vorgangsname}\[%{NUMMER:Prozess_pid}\]: \[%{DATEN:Prozess_Aufgabe}\].stahtd_dump_event\(\): \{\"mac\":\"%{COMMONMAC:Client_MAC}\",\"message_type\":\"%{DATEN:Nachrichtentyp}\",\"assoc_status":\"%{NUMMER:Verbandsstaat}\",\"vap\":\"%{WORT:Dampf}\",\"event_type\":\"%{DATEN:Ereignistyp}\":\"%{NUMMER:Evento_id}\"\}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{WORT:UniFi_MAC},%{GREEDYDATA:UniFi_Firmware}: : %{PROG:Vorgangsname}\[%{NUMMER:Prozess_pid}\]: \[%{DATEN:Prozess_Aufgabe}\].stahtd_dump_event\(\): \{\"mac\":\"%{COMMONMAC:Client_MAC}\",\"message_type\":\"%{DATEN:Nachrichtentyp}\",\"vap\":\"%{WORT:Dampf}\",\"query_server_%{NUMMER:Consulta_id}\":\"%{IPV4}\",\"event_type\":\"%{DATEN:Ereignistyp}\",\"assoc_status":\"%{NUMMER:Verbandsstaat}\",\"Anfrage_%{NUMMER:Consulta_id}\":\"%{Hostname:Abfrage_FQDN}\"\}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{WORT:UniFi_MAC},%{GREEDYDATA:UniFi_Firmware}: : %{PROG:Vorgangsname}\[%{NUMMER:Prozess_pid}\]: \[%{DATEN:Prozess_Aufgabe}\].stahtd_dump_event\(\): \{\"dns_resp_seen\":\"%{WORT:DNS_resp_seen}\",\"mac\":\"%{COMMONMAC:Client_MAC}\",\"message_type\":\"%{DATEN:Nachrichtentyp}\",\"assoc_status":\"%{NUMMER:Verbandsstaat}\",\"vap\":\"%{WORT:Dampf}\",\"event_type\":\"%{DATEN:Ereignistyp}\",\"event_id\":\"%{NUMMER:Evento_id}\",\"auth_ts\":\"%{NUMMER:Auth_ts}\"\}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{WORT:UniFi_MAC},%{GREEDYDATA:UniFi_Firmware}: : %{PROG:Vorgangsname}\[%{NUMMER:Prozess_pid}\]: \[%{DATEN:Prozess_Aufgabe}\].stahtd_dump_event\(\): \{\"dns_resp_seen\":\"%{WORT:DNS_resp_seen}\",\"message_type\":\"%{DATEN:Nachrichtentyp}\",\"mac\":\"%{COMMONMAC:Client_MAC}\",\"ip_assign_type\":\"%{DATEN:Type_assignment_ip}\",\"vap\":\"%{WORT:Dampf}\",\"assoc_status":\"%{NUMMER:Verbandsstaat}\",\"event_type\":\"%{DATEN:Ereignistyp}\",\"auth_ts\":\"%{NUMMER:Auth_ts}\",\"wpa_auth_delta\":\"%{NUMMER:WPA_auth_delta}\",\"assoc_delta\":\"%{NUMMER:Assoc_delta}\",\"auth_delta\":\"%{NUMMER:Auth_delta}\",\"event_id\":\"%{NUMMER:Evento_id}\"\}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{WORT:UniFi_MAC},%{GREEDYDATA:UniFi_Firmware}: %{PROG:Vorgangsname}: %{WORT:Dampf}: IST %{COMMONMAC:Client_MAC} %{DATEN:Prozess_Aufgabe}: %{GREEDYDATA:Nachricht}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{WORT:UniFi_MAC},%{GREEDYDATA:UniFi_Firmware}: : %{PROG:Vorgangsname}\[%{NUMMER:Prozess_pid}\]: wevent.ubnt_custom_event\(\): %{DATEN:Ereignistyp} %{WORT:Dampf}: %{COMMONMAC:Client_MAC} / %{IPV4:customer_ip}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{WORT:UniFi_MAC},%{GREEDYDATA:UniFi_Firmware}: : %{PROG:Vorgangsname}\[%{NUMMER:Prozess_pid}\]: wevent.ubnt_custom_event\(\): %{DATEN:Ereignistyp} %{WORT:Dampf}: %{COMMONMAC:Client_MAC} / %{NUMMER:Evento_id}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{WORT:UniFi_MAC},%{GREEDYDATA:UniFi_Firmware}: : %{PROG:Vorgangsname}\[%{NUMMER:Prozess_pid}\]: %{GREEDYDATA:Nachricht}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{WORT:UniFi_MAC},%{GREEDYDATA:UniFi_Firmware}: %{PROG:Vorgangsname}: %{DATEN:Prozess_Aufgabe}\[%{NUMMER:Prozess_pid}\]: %{GREEDYDATA:Aufgabe}: %{GREEDYDATA:Nachricht}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{WORT:UniFi_MAC},%{GREEDYDATA:UniFi_Firmware}: %{PROG:Vorgangsname}: %{DATEN:Prozess_Aufgabe} %{COMMONMAC:Client_MAC} %{WORT:Dampf} \(%{GREEDYDATA:Nachricht}\)",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{WORT:UniFi_MAC},%{GREEDYDATA:UniFi_Firmware}: %{UNIXPATH:Vorgangsname}\[%{NUMMER:Prozess_pid}\]: %{GREEDYDATA:Nachricht}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{WORT:UniFi_MAC},%{GREEDYDATA:UniFi_Firmware}: %{PROG:Vorgangsname}: \[%{NUMMER:Prozess_pid}\] %{GREEDYDATA:Nachricht}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{WORT:UniFi_MAC},%{GREEDYDATA:UniFi_Firmware}: %{PROG:Vorgangsname}: %{DATEN:Prozess_Aufgabe}: %{GREEDYDATA:Nachricht}"
                                       ]
                            }
                        }

                        mutieren {
                          konvertieren => {
                            "Kundenzufriedenheit" => "ganze Zahl"
                          }
                        }
        }
}

Ausgabe {

        ob ([Art]=="UniFi"){

                Elasticsearch {
                   Index => "Unifi-%{+JJJJ.MM.tt}"
                   Gastgeber => "DIRECTION_IP_ELASTICSEARCH:9200"
                }

        }
}

fortsetzen, Wir müssen eine Datei in Logstash erstellen, um sie aufzunehmen, transformieren und senden Sie die Daten. Zuerst hören wir auf dem in UniFi angegebenen TCP-Port, den wir im vorherigen Schritt gesehen haben; zweite, Behandeln Sie die erhaltenen Protokolle und trennen Sie sie in verschiedene Felder, um sie schließlich in unserer Elasticsearch zu speichern. So erstellen wir zum Beispiel die Konfigurationsdatei '/etc/logstash/conf.d/unifi.conf', Wir machen weiter mit den Filtern, Ich habe meinen Grok gemacht, wie ich konnte, Ich entschuldige mich bei den Weisen des Themas, aber absolut gültig, um die Logs des Ubiquiti UniFi mit Version 6.2.x zu sammeln. Schlussendlich, in der Ausgabe werden wir unsere Elasticsearch ausgeben, Denken Sie daran, den Benutzernamen anzugeben & Passwort, dass meins ein LAB ist und ich die schlimmsten Praktiken liebe… Und verzeiht wirklich den wahren Gurus meine Groks, Ich bin immer noch im 1. Filter.

Sobald die Konfigurationsdatei erstellt wurde, Denken Sie daran, den Logstash-Dienst neu zu starten, um die neue Konfiguration neu zu laden. Nach wie immer, Wir werden nach Kibana gehen und sobald die Daten eingegeben sind, können wir zu "Management" gehen. > „Stapelverwaltung“ > „Kibana“ > „Indexmuster“ > "Indexmuster erstellen", um das Indexmuster zu erstellen, ich sagte:, wie gewöhnlich (in diesem Fall und ohne die Anführungszeichen) ‘Unifi-*’ und wir haben die Daten bereits in Elasticsearch korrekt gespeichert. Jetzt können wir uns von „Discover“ mit unserem Ubiquiti UniFi-Index verbinden, um zu visualisieren, dass er Daten sammelt.

Und wir landen wie immer in Grafana! Tras erstellt den Index in Kibana, Jetzt sollten wir in unserem geliebten Grafana eine "Datenquelle" erstellen, die auf unsere Elasticsearch und den UniFi-Index verweist. Dann lässt es schon die Fantasie fliegen, ein Dashboard mit verschiedenen Panels erstellen, mit verschiedenen Daten zur Anzeige, Grafiken mit Zufriedenheit / Qualität der Kundenanbindung, ein Weltkarte mit eingehenden / ausgehenden Verbindungen, einer von stil Sankey um Client-IPs / APs zu sehen, im Spaltenformat, in zeichnen um spezifische Daten von beispielsweise den richtigen Zugriffen zu sehen, falsch, die Verbindungen…

wie immer, versuchen zu inspirieren oder zu helfen, wenn du es verbesserst, kannst du es an mich weitergeben 😉 Damit können wir sehen, was in unserem passiert(s) Ubiquiti-Geräte, an den Access Points, an den Schaltern, in Echtzeit, eine automatische Erfrischung jeden 10 Sekunden ist sehr beeindruckend, Es wird uns auch helfen, die Zusammenfassung der letzten 24 Stunden zu analysieren, oder wissen, wenn etwas Seltsames passiert ... wie der Nachbar, der versucht, eine Verbindung herzustellen.. wie immer, Danke an alle und noch viel mehr an diejenigen, die diese Art von Inhalten in sozialen Netzwerken verschieben 😉 hehe umarmt!

Hector Herrero
Letzte Artikel von Hector Herrero (Alle anzeigen)