Raccolta di Ubiquiti UniFi LOG in Elasticsearch e visualizzazione in Grafana

E continuiamo con cose più strane… oggi il primo di raccolta di Log verso l'ambiente Ubiquiti Unifi, dei nostri AP, Interruttori… per la seconda volta analizziamo., trattiamo i Tronchi con Logstash e per dessert li conserviamo in Elasticsearch, e la ciliegina sulla torta sarà visualizzarla con Grafana. Tutto questo per controllare in tempo reale ciò che accade nella nostra infrastruttura di comunicazione, che sta tentando di accedere al Wisfis…

Beh, quello che ho detto, se abbiamo qualche Ubiquiti là fuori che fornisce un servizio e vogliamo sapere cosa sta succedendo lì, chi comunica con chi… Ero più curioso della parte WiFi, Visualizzare i tentativi di connessione, Salute del cliente… Ognuno visualizzerà ciò che gli interessa di più. Quindi inizieremo istruendo la console UniFi a memorizzare i log in un syslog, il nostro Logstash invierà i log e ti lascerò un file di esempio per filtrare e poter separare i dati raccolti in campi interessanti, lo stesso file di configurazione indicherà che le informazioni già separate in campi diversi sono memorizzate in un indice Elasticsearch. E finiremo con Kibana o Grafana visualizzando in una Dashboard le informazioni che ci interessano e nel formato che ci interessa.

Per prima cosa dobbiamo ovviamente avere installato la parte Elastic Stack, Cosa è stato Registro, Ricerca elastica e Kibana; Quindi abilitiamo il syslog remoto dalla console di UniFi Controller > “Impostazioni” > “Impostazioni di sistema” > “Configurazione del controller” > “Registrazione remota”, e per noi ci basta solo abilitare la parte Syslog, senza Netconsole. Indicamos la dirección IP de nuestro Logstash y un puerto aleatorio no usado donde mandará los Logs.

Immissione {
        UDP {
                tipo => "UniFi"
                porta => "1601"
                tag => ["UniFi"]
        }
}

filtro {

        se [digitare] == "UniFi" {
                        Grok {
                            corrispondenza => { "Messaggio" => [
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{PAROLA:UniFi_MAC},%{DATI GREEDYDATA:UniFi_Firmware}: %{PROG:Proceso_nombre}: \[%{NUMERO:Proceso_pid}\] \[%{DATTERO:Proceso_tarea}\] Timeout della richiesta DNS; \[STA: %{COMMONMAC:Cliente_MAC}\]\[QUESITO: %{DATI GREEDYDATA:Cliente_consulta}\] \[DNS_SERVER :%{IPV4}\] \[TXN_ID %{DATTERO:Txn_id}\] \[SRCPORT %{NUMERO:Cliente_puerto_origen}\]",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{PAROLA:UniFi_MAC},%{DATI GREEDYDATA:UniFi_Firmware}: %{PROG:Proceso_nombre}: \[%{NUMERO:Proceso_pid}\] \[%{DATTERO:Proceso_tarea}\] %{DATI GREEDYDATA:Messaggio}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{PAROLA:UniFi_MAC},%{DATI GREEDYDATA:UniFi_Firmware}: : %{PROG:Proceso_nombre}\[%{NUMERO:Proceso_pid}\]: wireless_agg_stats.log_anomalie_sta(\): bssid=%{COMMONMAC:BSSID_MAC} radio=%{PAROLA:BSSID_radio} vap=%{PAROLA:vap} sta=%{COMMONMAC:Cliente_MAC} satisfaction_now=%{NUMERO:Cliente_satisfaccion} anomalies=%{DATI GREEDYDATA:Cliente_anomalia}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{PAROLA:UniFi_MAC},%{DATI GREEDYDATA:UniFi_Firmware}: : %{PROG:Proceso_nombre}\[%{NUMERO:Proceso_pid}\]: \[%{DATTERO:Proceso_tarea}\].stahtd_dump_event\(\): \{\"query_%{NUMERO:Consulta_id}\":\"%{NOME HOST:Consulta_FQDN}\",\"mac\":\"%{COMMONMAC:Cliente_MAC}\",\"message_type\":\"%{DATTERO:Mensaje_tipo}\",\"query_server_%{NUMERO:Consulta_id}\":\"%{IPV4:IP_servidor}\",\"assoc_status\":\"%{NUMERO:Asociacion_estado}\",\"vap\":\"%{PAROLA:vap}\",\"event_type\":\"%{DATTERO:Evento_tipo}\"\}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{PAROLA:UniFi_MAC},%{DATI GREEDYDATA:UniFi_Firmware}: : %{PROG:Proceso_nombre}\[%{NUMERO:Proceso_pid}\]: \[%{DATTERO:Proceso_tarea}\].stahtd_dump_event\(\): \{\"dns_resp_seen\":\"%{PAROLA:DNS_resp_seen}\",\"message_type\":\"%{DATTERO:Mensaje_tipo}\",\"mac\":\"%{COMMONMAC:Cliente_MAC}\",\"vap\":\"%{PAROLA:vap}\",\"assoc_status\":\"%{NUMERO:Asociacion_estado}\",\"event_type\":\"%{DATTERO:Evento_tipo}\",\"event_id\":\"%{NUMERO:Evento_id}\",\"arp_reply_gw_seen\":\"%{PAROLA:ARP_resp_seen}\",\"auth_ts\":\"%{NUMERO:Auth_ts}\"\}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{PAROLA:UniFi_MAC},%{DATI GREEDYDATA:UniFi_Firmware}: : %{PROG:Proceso_nombre}\[%{NUMERO:Proceso_pid}\]: \[%{DATTERO:Proceso_tarea}\].stahtd_dump_event\(\): \{\"query_server_%{NUMERO:Consulta_id}\":\"%{IPV4}\",\"query_%{NUMERO:Consulta_id}\":\"%{NOME HOST:Consulta_FQDN}\",\"mac\":\"%{COMMONMAC:Cliente_MAC}\",\"message_type\":\"%{DATTERO:Mensaje_tipo}\",\"assoc_status\":\"%{NUMERO:Asociacion_estado}\",\"vap\":\"%{PAROLA:vap}\",\"event_type\":\"%{DATTERO:Evento_tipo}\"\}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{PAROLA:UniFi_MAC},%{DATI GREEDYDATA:UniFi_Firmware}: : %{PROG:Proceso_nombre}\[%{NUMERO:Proceso_pid}\]: \[%{DATTERO:Proceso_tarea}\].stahtd_dump_event\(\): \{\"query_server_%{NUMERO:Consulta_id}\":\"%{IPV4}\",\"mac\":\"%{COMMONMAC:Cliente_MAC}\",\"message_type\":\"%{DATTERO:Mensaje_tipo}\",\"vap\":\"%{PAROLA:vap}\",\"%{DATTERO:Evento_tipo}\",\"query_%{NUMERO:Consulta_id}\":\"%{NOME HOST:Consulta_FQDN}\",\"assoc_status\":\"%{NUMERO:Asociacion_estado}\"\}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{PAROLA:UniFi_MAC},%{DATI GREEDYDATA:UniFi_Firmware}: : %{PROG:Proceso_nombre}\[%{NUMERO:Proceso_pid}\]: \[%{DATTERO:Proceso_tarea}\].stahtd_dump_event\(\): \{\"mac\":\"%{COMMONMAC:Cliente_MAC}\",\"message_type\":\"%{DATTERO:Mensaje_tipo}\",\"assoc_status\":\"%{NUMERO:Asociacion_estado}\",\"vap\":\"%{PAROLA:vap}\",\"event_type\":\"%{DATTERO:Evento_tipo}\":\"%{NUMERO:Evento_id}\"\}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{PAROLA:UniFi_MAC},%{DATI GREEDYDATA:UniFi_Firmware}: : %{PROG:Proceso_nombre}\[%{NUMERO:Proceso_pid}\]: \[%{DATTERO:Proceso_tarea}\].stahtd_dump_event\(\): \{\"mac\":\"%{COMMONMAC:Cliente_MAC}\",\"message_type\":\"%{DATTERO:Mensaje_tipo}\",\"vap\":\"%{PAROLA:vap}\",\"query_server_%{NUMERO:Consulta_id}\":\"%{IPV4}\",\"event_type\":\"%{DATTERO:Evento_tipo}\",\"assoc_status\":\"%{NUMERO:Asociacion_estado}\",\"query_%{NUMERO:Consulta_id}\":\"%{NOME HOST:Consulta_FQDN}\"\}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{PAROLA:UniFi_MAC},%{DATI GREEDYDATA:UniFi_Firmware}: : %{PROG:Proceso_nombre}\[%{NUMERO:Proceso_pid}\]: \[%{DATTERO:Proceso_tarea}\].stahtd_dump_event\(\): \{\"dns_resp_seen\":\"%{PAROLA:DNS_resp_seen}\",\"mac\":\"%{COMMONMAC:Cliente_MAC}\",\"message_type\":\"%{DATTERO:Mensaje_tipo}\",\"assoc_status\":\"%{NUMERO:Asociacion_estado}\",\"vap\":\"%{PAROLA:vap}\",\"event_type\":\"%{DATTERO:Evento_tipo}\",\"event_id\":\"%{NUMERO:Evento_id}\",\"auth_ts\":\"%{NUMERO:Auth_ts}\"\}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{PAROLA:UniFi_MAC},%{DATI GREEDYDATA:UniFi_Firmware}: : %{PROG:Proceso_nombre}\[%{NUMERO:Proceso_pid}\]: \[%{DATTERO:Proceso_tarea}\].stahtd_dump_event\(\): \{\"dns_resp_seen\":\"%{PAROLA:DNS_resp_seen}\",\"message_type\":\"%{DATTERO:Mensaje_tipo}\",\"mac\":\"%{COMMONMAC:Cliente_MAC}\",\"ip_assign_type\":\"%{DATTERO:Tipo_asignacion_ip}\",\"vap\":\"%{PAROLA:vap}\",\"assoc_status\":\"%{NUMERO:Asociacion_estado}\",\"event_type\":\"%{DATTERO:Evento_tipo}\",\"auth_ts\":\"%{NUMERO:Auth_ts}\",\"wpa_auth_delta\":\"%{NUMERO:WPA_auth_delta}\",\"assoc_delta\":\"%{NUMERO:Assoc_delta}\",\"auth_delta\":\"%{NUMERO:Auth_delta}\",\"event_id\":\"%{NUMERO:Evento_id}\"\}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{PAROLA:UniFi_MAC},%{DATI GREEDYDATA:UniFi_Firmware}: %{PROG:Proceso_nombre}: %{PAROLA:vap}: STA %{COMMONMAC:Cliente_MAC} %{DATTERO:Proceso_tarea}: %{DATI GREEDYDATA:Messaggio}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{PAROLA:UniFi_MAC},%{DATI GREEDYDATA:UniFi_Firmware}: : %{PROG:Proceso_nombre}\[%{NUMERO:Proceso_pid}\]: wevent.ubnt_custom_event\(\): %{DATTERO:Evento_tipo} %{PAROLA:vap}: %{COMMONMAC:Cliente_MAC} / %{IPV4:Cliente_ip}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{PAROLA:UniFi_MAC},%{DATI GREEDYDATA:UniFi_Firmware}: : %{PROG:Proceso_nombre}\[%{NUMERO:Proceso_pid}\]: wevent.ubnt_custom_event\(\): %{DATTERO:Evento_tipo} %{PAROLA:vap}: %{COMMONMAC:Cliente_MAC} / %{NUMERO:Evento_id}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{PAROLA:UniFi_MAC},%{DATI GREEDYDATA:UniFi_Firmware}: : %{PROG:Proceso_nombre}\[%{NUMERO:Proceso_pid}\]: %{DATI GREEDYDATA:Messaggio}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{PAROLA:UniFi_MAC},%{DATI GREEDYDATA:UniFi_Firmware}: %{PROG:Proceso_nombre}: %{DATTERO:Proceso_tarea}\[%{NUMERO:Proceso_pid}\]: %{DATI GREEDYDATA:Compito}: %{DATI GREEDYDATA:Messaggio}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{PAROLA:UniFi_MAC},%{DATI GREEDYDATA:UniFi_Firmware}: %{PROG:Proceso_nombre}: %{DATTERO:Proceso_tarea} %{COMMONMAC:Cliente_MAC} %{PAROLA:vap} \(%{DATI GREEDYDATA:Messaggio}\)",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{PAROLA:UniFi_MAC},%{DATI GREEDYDATA:UniFi_Firmware}: %{UNIXPATH:Proceso_nombre}\[%{NUMERO:Proceso_pid}\]: %{DATI GREEDYDATA:Messaggio}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{PAROLA:UniFi_MAC},%{DATI GREEDYDATA:UniFi_Firmware}: %{PROG:Proceso_nombre}: \[%{NUMERO:Proceso_pid}\] %{DATI GREEDYDATA:Messaggio}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{PAROLA:UniFi_MAC},%{DATI GREEDYDATA:UniFi_Firmware}: %{PROG:Proceso_nombre}: %{DATTERO:Proceso_tarea}: %{DATI GREEDYDATA:Messaggio}"
                                       ]
                            }
                        }

                        mutate {
                          convert => {
                            "Cliente_satisfaccion" => "Numero intero"
                          }
                        }
        }
}

prodotto {

        se ([digitare]=="UniFi"){

                Ricerca elastica {
                   indice => "unifi-%{+AAAA. MM.dd}"
                   hosts=> "DIRECCION_IP_ELASTICSEARCH:9200"
                }

        }
}

Continuare, dobbiamo creare un file in Logstash per ingerire, Trasforma e invia dati. Per prima cosa ascolteremo sulla porta TCP indicata in UniFi che abbiamo visto nel passaggio precedente; secondo, elaborare i log che riceve e separarli in diversi campi per essere infine memorizzati nel nostro Elasticsearch. Quindi creiamo ad esempio il file di configurazione '/etc/logstash/conf.d/unifi.conf', Continueremo con i filtri, Ho fatto il mio grok meglio che potevo, Mi scuso con i saggi sull'argomento, ma totalmente valido per raccogliere i Log dell'Ubiquiti UniFi con la versione 6.2.x. Alla fine, nell'output emetteremo il nostro Elasticsearch, Ricordati di inserire il nome utente & password che la mia è un LAB e mi piacciono le peggiori pratiche… E perdona davvero i veri guru, miei groks, Sono ancora nel 1° dei filtri.

Una volta creato il file di configurazione, ricordarsi di riavviare il servizio Logstash per ricaricare la nuova configurazione. Dopo come sempre, andremo a Kibana e una volta che i dati arriveranno potremo andare su "Gestione" > "Gestione dello stack" > "Kibana" > "Modelli di indice" > "Crea modello di indice" per creare il modello di indice, Come ho detto, come al solito (in questo caso e senza virgolette) 'unifi-*' e avremo i dati già memorizzati correttamente in Elasticsearch. Ora possiamo connetterci da "Discover" al nostro indice Ubiquiti UniFi per visualizzare che sta raccogliendo dati.

E finiamo come sempre a Grafana! TCreazione dell'indice in Kibana, ora nel nostro amato Grafana dovremmo creare una "Data Source" che si rivolge al nostro Elasticsearch e all'indice UniFi. Allora si tratta di dare libero sfogo alla tua immaginazione, creare una Dashboard con diverse Dashboard, con dati diversi da visualizzare, Grafica con soddisfazione del cliente/qualità della connessione, Uno Mappa del mondo con connessioni in entrata/uscita, Uno di stile Sankey per visualizzare gli IP/AP dei client, in formato colonna, in stallo per visualizzare dati specifici, ad esempio sugli accessi riusciti, Scorretto, le connessioni...

Come al solito, cercando di ispirare o aiutare, se lo migliori lo passi 😉 a me Con questo possiamo vedere cosa succede nel nostro(s) Dispositivi Ubiquiti, presso i punti di accesso, sugli interruttori, in tempo reale, Mettere un aggiornamento automatico ogni 10 secondi è molto impressionante, Ci aiuterà anche ad analizzare il riepilogo delle ultime 24 ore, o sapere quando succede qualcosa di strano... come il vicino che cerca di connettersi.. Come al solito, Grazie a tutti e molto di più a chi sposta questo tipo di contenuti sui social network 😉 Hehe, abbracci!

Post consigliati

Autore

nheobug@bujarra.com
Autor del blog Bujarra.com Cualquier necesidad que tengas, Non esitate a contattarmi, Cercherò di aiutarti ogni volta che potrò, Condividere è vivere ;) . Goditi i documenti!!!