Ubiquiti UniFi LOGak Elasticsearch-ean bilduz eta Grafana-n bistaratuz

Eta gehiago gau arraroez jarraitzen dugu… Gaur lehenik Ubiquiti Unifi ingurunean Logak biltzen ditugu, Gure AP-en, Switchetan… Bigarrenik parseatzen dugu, Logak Logstash-ekin tratatzen ditugu eta postre moduan Elasticsearch-en gordetzen ditugu, Eta pastelaren gaila Grafana-rekin bistaratzea izango da. Hori guztia gure komunikazio azpiegituretan denbora errealean zer gertatzen den kontrolatzeko, Nor saiatzen da Wisfi-ra sartzen…

Ongi, esan dudana da, Bikarik Ubiquiti batzuk baditugu eta zer gertatzen den ezagutu nahi badugu, Nor komunikatzen den norekin… Niri WiFi atalengatik bitxiago iruditu zitzaidan, konexio-saioak ikustea, bezeroen egoera… norberak gehien interesatzen zaiona erakutsiko du. Beraz, UniFi kontsolari adieraziko diogu log-ak syslog batean gordetzeko, gure Logstash-ek log-ak bidaliko ditu eta iragazi eta bilduko ditugun datuak eremu interesgarrietan banatzeko adibide-fitxategi bat utziko dizuet, erabiltzen den konfigurazio-fitxategi bera adieraziko du informazioa banatutako eremu desberdinetan Elasticsearch indize batean gorde behar dela. Eta Kibana edo Grafana-rekin bukaiko dugu, Dashboard batean gure interesa duen informazioa eta nahi dugun formatuan bistaratuz.

Lehenik eta behin, jakina, Elastic Stack-en partea instalatuta eduki behar dugu, hau da Logstash, Elasticsearch eta Kibana; Gero, UniFi Controller-etik remote syslog gaituko dugu > “Ezarpenak” > “System Settings” > “Controller Konfigurazioa” > “Remote Logging”, eta Syslog zatia soilik gaitzeak nahikoa da, sin Netconsole. Indicamos la dirección IP de nuestro Logstash y un puerto aleatorio no usado donde mandará los Logs.

input {
        udp {
                type => "UniFi"
                port => "1601"
                tags => ["UniFi"]
        }
}

iragazi {

        if [type] == "UniFi" {
                        grok {
                            match => { "message" => [
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{WORD:UniFi_MAC},%{GREEDYDATA:UniFi_Firmware}: %{PROG:Proceso_nombre}: \[%{NUMBER:Proceso_pid}\] \[%{DATA:Proceso_tarea}\] DNS request timed out; \[STA: %{COMMONMAC:Cliente_MAC}\]\[QUERY: %{GREEDYDATA:Cliente_consulta}\] \[DNS_SERVER :%{IPV4}\] \[TXN_ID %{DATA:Txn_id}\] \[SRCPORT %{NUMBER:Cliente_puerto_origen}\]",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{WORD:UniFi_MAC},%{GREEDYDATA:UniFi_Firmware}: %{PROG:Proceso_nombre}: \[%{NUMBER:Proceso_pid}\] \[%{DATA:Proceso_tarea}\] %{GREEDYDATA:Mensaje}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{WORD:UniFi_MAC},%{GREEDYDATA:UniFi_Firmware}: : %{PROG:Proceso_nombre}\[%{NUMBER:Proceso_pid}\]: wireless_agg_stats.log_sta_anomalies\(\): bssid=%{COMMONMAC:BSSID_MAC} radio=%{WORD:BSSID_radio} vap=%{WORD:vap} sta=%{COMMONMAC:Cliente_MAC} satisfaction_now=%{NUMBER:Cliente_satisfaccion} anomalies=%{GREEDYDATA:Cliente_anomalia}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{WORD:UniFi_MAC},%{GREEDYDATA:UniFi_Firmware}: : %{PROG:Proceso_nombre}\[%{NUMBER:Proceso_pid}\]: \[%{DATA:Proceso_tarea}\].stahtd_dump_event\(\): \{\"query_%{NUMBER:Consulta_id}\":\"%{HOSTNAME:Consulta_FQDN}\",\"mac\":\"%{COMMONMAC:Cliente_MAC}\",\"message_type\":\"%{DATA:Mensaje_tipo}\",\"query_server_%{NUMBER:Consulta_id}\":\"%{IPV4:IP_servidor}\",\"assoc_status\":\"%{NUMBER:Asociacion_estado}\",\"vap\":\"%{WORD:vap}\",\"event_type\":\"%{DATA:Evento_tipo}\"\}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{WORD:UniFi_MAC},%{GREEDYDATA:UniFi_Firmware}: : %{PROG:Proceso_nombre}\[%{NUMBER:Proceso_pid}\]: \[%{DATA:Proceso_tarea}\].stahtd_dump_event\(\): \{\"dns_resp_seen\":\"%{WORD:DNS_resp_seen}\",\"message_type\":\"%{DATA:Mensaje_tipo}\",\"mac\":\"%{COMMONMAC:Cliente_MAC}\",\"vap\":\"%{WORD:vap}\",\"assoc_status\":\"%{NUMBER:Asociacion_estado}\",\"event_type\":\"%{DATA:Evento_tipo}\",\"event_id\":\"%{NUMBER:Evento_id}\",\"arp_reply_gw_seen\":\"%{WORD:ARP_resp_seen}\",\"auth_ts\":\"%{NUMBER:Auth_ts}\"\}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{WORD:UniFi_MAC},%{GREEDYDATA:UniFi_Firmware}: : %{PROG:Proceso_nombre}\[%{NUMBER:Proceso_pid}\]: \[%{DATA:Proceso_tarea}\].stahtd_dump_event\(\): \{\"query_server_%{NUMBER:Consulta_id}\":\"%{IPV4}\",\"query_%{NUMBER:Consulta_id}\":\"%{HOSTNAME:Consulta_FQDN}\",\"mac\":\"%{COMMONMAC:Cliente_MAC}\",\"message_type\":\"%{DATA:Mensaje_tipo}\",\"assoc_status\":\"%{NUMBER:Asociacion_estado}\",\"vap\":\"%{WORD:vap}\",\"event_type\":\"%{DATA:Evento_tipo}\"\}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{WORD:UniFi_MAC},%{GREEDYDATA:UniFi_Firmware}: : %{PROG:Proceso_nombre}\[%{NUMBER:Proceso_pid}\]: \[%{DATA:Proceso_tarea}\].stahtd_dump_event\(\): \{\"query_server_%{NUMBER:Consulta_id}\":\"%{IPV4}\",\"mac\":\"%{COMMONMAC:Cliente_MAC}\",\"message_type\":\"%{DATA:Mensaje_tipo}\",\"vap\":\"%{WORD:vap}\",\"%{DATA:Evento_tipo}\",\"query_%{NUMBER:Consulta_id}\":\"%{HOSTNAME:Consulta_FQDN}\",\"assoc_status\":\"%{NUMBER:Asociacion_estado}\"\}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{WORD:UniFi_MAC},%{GREEDYDATA:UniFi_Firmware}: : %{PROG:Proceso_nombre}\[%{NUMBER:Proceso_pid}\]: \[%{DATA:Proceso_tarea}\].stahtd_dump_event\(\): \{\"mac\":\"%{COMMONMAC:Cliente_MAC}\",\"message_type\":\"%{DATA:Mensaje_tipo}\",\"assoc_status\":\"%{NUMBER:Asociacion_estado}\",\"vap\":\"%{WORD:vap}\",\"event_type\":\"%{DATA:Evento_tipo}\":\"%{NUMBER:Evento_id}\"\}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{WORD:UniFi_MAC},%{GREEDYDATA:UniFi_Firmware}: : %{PROG:Proceso_nombre}\[%{NUMBER:Proceso_pid}\]: \[%{DATA:Proceso_tarea}\].stahtd_dump_event\(\): \{\"mac\":\"%{COMMONMAC:Cliente_MAC}\",\"message_type\":\"%{DATA:Mensaje_tipo}\",\"vap\":\"%{WORD:vap}\",\"query_server_%{NUMBER:Consulta_id}\":\"%{IPV4}\",\"event_type\":\"%{DATA:Evento_tipo}\",\"assoc_status\":\"%{NUMBER:Asociacion_estado}\",\"query_%{NUMBER:Consulta_id}\":\"%{HOSTNAME:Consulta_FQDN}\"\}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{WORD:UniFi_MAC},%{GREEDYDATA:UniFi_Firmware}: : %{PROG:Proceso_nombre}\[%{NUMBER:Proceso_pid}\]: \[%{DATA:Proceso_tarea}\].stahtd_dump_event\(\): \{\"dns_resp_seen\":\"%{WORD:DNS_resp_seen}\",\"mac\":\"%{COMMONMAC:Cliente_MAC}\",\"message_type\":\"%{DATA:Mensaje_tipo}\",\"assoc_status\":\"%{NUMBER:Asociacion_estado}\",\"vap\":\"%{WORD:vap}\",\"event_type\":\"%{DATA:Evento_tipo}\",\"event_id\":\"%{NUMBER:Evento_id}\",\"auth_ts\":\"%{NUMBER:Auth_ts}\"\}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{WORD:UniFi_MAC},%{GREEDYDATA:UniFi_Firmware}: : %{PROG:Proceso_nombre}\[%{NUMBER:Proceso_pid}\]: \[%{DATA:Proceso_tarea}\].stahtd_dump_event\(\): \{\"dns_resp_seen\":\"%{WORD:DNS_resp_seen}\",\"message_type\":\"%{DATA:Mensaje_tipo}\",\"mac\":\"%{COMMONMAC:Cliente_MAC}\",\"ip_assign_type\":\"%{DATA:Tipo_asignacion_ip}\",\"vap\":\"%{WORD:vap}\",\"assoc_status\":\"%{NUMBER:Asociacion_estado}\",\"event_type\":\"%{DATA:Evento_tipo}\",\"auth_ts\":\"%{NUMBER:Auth_ts}\",\"wpa_auth_delta\":\"%{NUMBER:WPA_auth_delta}\",\"assoc_delta\":\"%{NUMBER:Assoc_delta}\",\"auth_delta\":\"%{NUMBER:Auth_delta}\",\"event_id\":\"%{NUMBER:Evento_id}\"\}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{WORD:UniFi_MAC},%{GREEDYDATA:UniFi_Firmware}: %{PROG:Proceso_nombre}: %{WORD:vap}: STA %{COMMONMAC:Cliente_MAC} %{DATA:Proceso_tarea}: %{GREEDYDATA:Mensaje}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{WORD:UniFi_MAC},%{GREEDYDATA:UniFi_Firmware}: : %{PROG:Proceso_nombre}\[%{NUMBER:Proceso_pid}\]: wevent.ubnt_custom_event\(\): %{DATA:Evento_tipo} %{WORD:vap}: %{COMMONMAC:Cliente_MAC} / %{IPV4:Cliente_ip}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{WORD:UniFi_MAC},%{GREEDYDATA:UniFi_Firmware}: : %{PROG:Proceso_nombre}\[%{NUMBER:Proceso_pid}\]: wevent.ubnt_custom_event\(\): %{DATA:Evento_tipo} %{WORD:vap}: %{COMMONMAC:Cliente_MAC} / %{NUMBER:Evento_id}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{WORD:UniFi_MAC},%{GREEDYDATA:UniFi_Firmware}: : %{PROG:Proceso_nombre}\[%{NUMBER:Proceso_pid}\]: %{GREEDYDATA:Mensaje}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{WORD:UniFi_MAC},%{GREEDYDATA:UniFi_Firmware}: %{PROG:Proceso_nombre}: %{DATA:Proceso_tarea}\[%{NUMBER:Proceso_pid}\]: %{GREEDYDATA:Tarea}: %{GREEDYDATA:Mensaje}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{WORD:UniFi_MAC},%{GREEDYDATA:UniFi_Firmware}: %{PROG:Proceso_nombre}: %{DATA:Proceso_tarea} %{COMMONMAC:Cliente_MAC} %{WORD:vap} \(%{GREEDYDATA:Mensaje}\)",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{WORD:UniFi_MAC},%{GREEDYDATA:UniFi_Firmware}: %{UNIXPATH:Proceso_nombre}\[%{NUMBER:Proceso_pid}\]: %{GREEDYDATA:Mensaje}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{WORD:UniFi_MAC},%{GREEDYDATA:UniFi_Firmware}: %{PROG:Proceso_nombre}: \[%{NUMBER:Proceso_pid}\] %{GREEDYDATA:Mensaje}",
                              "^<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{WORD:UniFi_MAC},%{GREEDYDATA:UniFi_Firmware}: %{PROG:Proceso_nombre}: %{DATA:Proceso_tarea}: %{GREEDYDATA:Mensaje}"
                                       ]
                            }
                        }

                        mutate {
                          convert => {
                            "Cliente_satisfaccion" => "enter"
                          }
                        }
        }
}

irteera {

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

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

        }
}

Jarrai dezagun, necesitamos crear un fichero en Logstash para ingestar, transformar y enviar los datos. Primero escucharemos en el puerto TCP indicado en UniFi que vimos en el paso anterior; segundo, tratar los logs que recibe y separarlos en distintos campos para ser por último almacenados en nuestro Elasticsearch. Así que creamos por ejemplo el fichero de configuración ‘/etc/logstash/conf.d/unifi.conf’, Filtroekin jarraituko dugu, nik nola ahal nuen egin nituen nire grok-ak, barkamena eskatzen diot gaian jakintzudunei, baina guztiz baliozkoa Ubiquiti UniFi-ren 6.2.x bertsioaren Logak bilduteko. Azken finean, irteeran gure Elasticsearch-era irteera emango diogu, irteteko erabiltzaile izena jarri & pasahitza, nirea LAB bat da eta txar praktika gustatzen zaizkit… Eta benetan barkatu benetako guruak, nire grok-ak, filtroen 1. mailan nago.

konfigurazio fitxategia sortu ondoren, gogoratu Logstash zerbitzua berrartu behar dela konfigurazio berriari kargatzeko. Ondoren, beti bezala, Kibanara goaz eta datuak sartzen hastean, 'Kudeaketa' ra joan gaitezke > 'Stack kudeaketa' > 'Kibana' > 'Indize Patroiak' > 'Create index pattern' indizearen eredu-a sortzeko, esandakoa, ohiko moduan (kasu honetan eta komatxorik gabe) ‘unifi-*’ y tendremos los datos ya en Elasticsearch almacenados de manera correcta. Ahora podríamos conectarnos desde “Discover” a nuestro índice de Ubiquiti UniFi visualizar que está recogiendo datos.

Y acabamos como siempre en Grafana! Tras crear el índice en Kibana, ahora en nuestro amado Grafana deberíamos crear un “Data Source” que apunte contra nuestro Elasticsearch y el índice de UniFi. Luego ya es dejar volar la imaginación, hacer un Dashboard con distintos Paneles, con distintos datos a visualizar, gráficas con satisfacción/calidad de la conexión de los clientes, bat mapamundi sarrera/irteera konekzioak, estilo bateko bat Sankey bezeroen/IPen ikuspegiak, kolonetan formatuta, en taulak adibidez, sarbide zuzenak, okerrak, konekzioak…

Betiko moduan, inspiratzeko edo laguntzeko saiatzen, hobetzen baduzu, bidali iezadazu 😉 Horrekin gure(s) Ubiquiti gailuetan, Sarbide Puntuan, Switch-etan, denbora errealean, automatikoki berritzen jarrita 10 segundo bakoitzeko, oso izugarria geratzen da, horrek azken 24 oruen laburpenari aztertzen lagunduko digu, edo zerbait arraroa gertatzen denean ezagutzea… bezala, auzoa konektatzen saiatzen denean.. Betiko moduan, eskerrik asko guztiontzat eta batez ere sare sozialetan eduki horrelakoak mugitzeko zaituztenentzat 😉 jeje ¡Besarkadak!!

Izenburuko mezuak

Egilea

nheobug@bujarra.com
Autor del blog Bujarra.com Cualquier necesidad que tengas, ez zalantzarik izan nirekin harremanetan jartzeko, ahal duzun guztietan laguntzen saiatuko naiz, partekatu ahal dudan guztietan ;) . Dokumentuez gozatu!!!