VMware ESXi LOGS biltzea Elasticsearchen eta Grafanan irudikatzea

Bueno pues hoy toca otro post sobre recopilación de logs, cómo tratarlos y sobre todo cómo visualizarlos; en este documento veremos cómo realizar todo el proceso con los Logs del hipervisor VMware ESXi, Elastic Stack-ekin tratatzea eta azkenean Grafanan guk interesatzen zaiguna bistaratzea, akatsen log-ak izan daitezkeenak, saio hasiera okerretakoak…

VMware-ren azpiegiturekin lan egiten duten guztiak ezagutzen ditugu eta base osoa eusten diote hipervisor fabuloso, gure maireak ostalariak ESXi. Hipervisor oinarrituta segurtasun eta estabilidade, arazo gutxi batzuk batengan dar, baina ez viene ezer gaizki jasotzen sus logs en leku zentralizatu baterako kontrolatuta egon dadin osasuna. Dakigunez bezala, logak gorde ditzakegu sisteman kontrolatzeko, así que aprovechándonos de eso, mandaremos los Logs a Logstash. Logstash se encargará de recibir y ordenar los logs, separando tediosas cadenas de texto en distintos campos con datos válidos, para finalmente enviar a Elasticsearch estos datos y sean almacenados en un índice. Luego ya mediante Kibana o Grafana podremos visualizar de una manera gráfica ese content, y ver los intentos de login al host (por SSH, GUI…), ver simplemente accesos, conocer los eventos con errores, comparar distintos hipervisores entre sí, conocer errores repetitivos… y todo esto como siempre en tiempo real o para realizar históricos con datos de las últimas 24h, aste, mes, año…

Lehenik eta behin, jakina, Elastic Stack-en partea instalatuta eduki behar dugu, hau da Logstash, Elasticsearch eta Kibana; luego ya sería indicarle a cada hipervisor que envíe los Logs a Logstash, gure nahi dugun atakara. Para eso, tenemos muchas maneras de hacerlo, host a host, desde GUI, CLI, desde vCenter…

Lo más cómo si tienes pocos hosts, desde vCenter vamos a cada host, en “Configurar” > Configuración avanzada del sistema” > y buscamos “syslog.global”, editamos 'Syslog.global.logHost” indicando en formato tcp/udp://DIRECCION_IP:PUERTO el destino de nuestros Logs. O mejor aún con PowerShell:

Get-VMHostSysLogServer -VMHost NOMBRE_HOST_ESXi
Set-VMHostSysLogServer -VMHost NOMBRE_HOST_ESXi -SysLogServer 'udp://DIRECCION_IP:PUERTO
Set-VMHostSysLogServer -VMHost NOMBRE_HOST_ESXi -SysLogServer 'tcp://DIRECCION_IP:PUERTO
Get-VMHostSysLogServer -VMHost NOMBRE_HOST_ESXi

Get-VMhostFireWallException -VMhost NOMBRE_HOST_ESXi -Name syslog
Get-VMHostFireWallException -VMHost NOMBRE_HOST_ESXi -Name Syslog | Set-VMHostFirewallException -Enabled:$Egiazko.

input {
        tcp {
                type => "ESXi"
                port => "1514"
                tags => ["VMware","ESXi"]
        }
}

iragazi {

        if [type] == "ESXi" {
                        grok {
                            match => { "message" => [
                               "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Host_ESXi} Hostd: %{WORD:Log_nivel} %{PROG:Log_proceso}\[%{INT:Evento_id}\] \[Originator@6876 sub=%{GREEDYDATA:Titulo} opID=%{GREEDYDATA:Op_id} user=%{GREEDYDATA:Erabiltzailea}\] %{GREEDYDATA:Evento_tipo} %{GREEDYDATA:Evento_codigo} : %{GREEDYDATA:Mensaje}",
                               "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Host_ESXi} Hostd: %{WORD:Log_nivel} %{PROG:Log_proceso}\[%{INT:Evento_id}\] \[Originator@6876 sub=%{GREEDYDATA:Titulo} opID=%{GREEDYDATA:Op_id} user=%{GREEDYDATA:Erabiltzailea}\] %{GREEDYDATA:Evento_codigo}: %{GREEDYDATA:Mensaje}",
                               "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Host_ESXi} Hostd: %{WORD:Log_nivel} %{PROG:Log_proceso}\[%{INT:Evento_id}\] \[Originator@6876 sub=%{GREEDYDATA:Titulo} opID=%{GREEDYDATA:Op_id} user=%{GREEDYDATA:Erabiltzailea}\] \(%{GREEDYDATA:Evento_codigo}\)",
                               "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Host_ESXi} Hostd: %{WORD:Log_nivel} %{PROG:Log_proceso}\[%{INT:Evento_id}\] \[Originator@6876 sub=%{GREEDYDATA:Titulo} opID=%{GREEDYDATA:Op_id}\] \[%{GREEDYDATA:Evento_codigo}\]: %{GREEDYDATA:Mensaje}",
                               "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Host_ESXi} Hostd: %{WORD:Log_nivel} %{PROG:Log_proceso}\[%{INT:Evento_id}\] \[Originator@6876 sub=%{GREEDYDATA:Titulo} opID=%{GREEDYDATA:Op_id}\] %{GREEDYDATA:Mensaje}",
                               "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Host_ESXi} Hostd: %{WORD:Log_nivel} %{PROG:Log_proceso}\[%{INT:Evento_id}\] \[Originator@6876 sub=%{GREEDYDATA:Titulo}\] %{GREEDYDATA:Mensaje}",
                               "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Host_ESXi} Hostd: %{GREEDYDATA:Mensaje}",
                               "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Host_ESXi} Vpxa: %{WORD:Log_nivel} %{PROG:Log_proceso}\[%{INT:Evento_id}\] \[Originator@6876 sub=%{GREEDYDATA:Titulo} opID=%{GREEDYDATA:Op_id}\] %{GREEDYDATA:Mensaje}",
                               "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Host_ESXi} Vpxa: %{WORD:Log_nivel} %{PROG:Log_proceso}\[%{INT:Evento_id}\] \[Originator@6876 sub=%{GREEDYDATA:Titulo}\] %{GREEDYDATA:Mensaje}",
                               "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Host_ESXi} Vpxa: %{GREEDYDATA:Mensaje}",
                               "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Host_ESXi} Rhttpproxy: %{WORD:Log_nivel} %{PROG:Log_proceso}\[%{INT:Evento_id}\] \[Originator@6876 sub=%{GREEDYDATA:Titulo}\] %{GREEDYDATA:Mensaje}",
                               "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Host_ESXi} Rhttpproxy: %{GREEDYDATA:Mensaje}",
                               "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Host_ESXi} apiForwarder: %{WORD:Log_nivel} %{PROG:Log_proceso}\[%{INT:Evento_id}\] \[Originator@6876 sub=%{GREEDYDATA:Titulo}\] %{GREEDYDATA:Mensaje}",
                               "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Host_ESXi} VSANMGMTSVC: %{WORD:Log_nivel} %{PROG:Log_proceso}\[%{INT:Evento_id}\] \[opID=%{GREEDYDATA:Titulo}\] %{GREEDYDATA:Mensaje}",
                               "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Host_ESXi} vsansystem: %{WORD:Log_nivel} %{PROG:Log_proceso}\[%{INT:Evento_id}\] \[%{GREEDYDATA:Titulo}\] %{GREEDYDATA:Mensaje}",
                               "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Host_ESXi} vsansystem: %{GREEDYDATA:Mensaje}",
                               "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Host_ESXi} vmkernel: %{WORD:CPU_core}:%{INT:Evento_id}\)%{GREEDYDATA:Titulo}: %{GREEDYDATA:Mensaje}",
                               "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Host_ESXi} vmkernel: %{WORD:CPU_core}:%{INT:Evento_id} opID=%{PROG:Op_id}\)%{GREEDYDATA:Titulo}: %{GREEDYDATA:Mensaje}",
                               "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Host_ESXi} vmkernel: %{WORD:CPU_core}:%{INT:Evento_id}\)%{GREEDYDATA:Mensaje}",
                               "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Host_ESXi} vmkwarning: %{WORD:CPU_core}:%{INT:Evento_id}\)%{GREEDYDATA:Titulo}: %{GREEDYDATA:Mensaje}",
                               "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Host_ESXi} Fdm: %{WORD:Log_nivel} %{PROG:Log_proceso}\[%{INT:Evento_id}\] \[Originator@6876 sub=%{GREEDYDATA:Titulo} opID=%{PROG:Op_id}\] %{GREEDYDATA:Mensaje}",
                               "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Host_ESXi} Fdm: %{WORD:Log_nivel} %{PROG:Log_proceso}\[%{INT:Evento_id}\] \[Originator@6876 sub=%{GREEDYDATA:Titulo}\] %{GREEDYDATA:Mensaje}",
                               "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Host_ESXi} hostd-probe: %{WORD:Log_nivel} %{PROG:Log_proceso}\[%{INT:Evento_id}\] \[Originator@6876 sub=%{GREEDYDATA:Titulo}\] %{GREEDYDATA:Mensaje}",
                               "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Host_ESXi} %{PROG:Log_proceso}\[%{INT:Evento_id}\]: USER %{WORD:Erabiltzailea} pid %{INT:pid} %{WORD:Tipo_proceso} %{GREEDYDATA:Mensaje}",
                               "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Host_ESXi} %{PROG:Log_proceso}\[%{INT:Evento_id}\]: %{GREEDYDATA:Mensaje}",
                               "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Host_ESXi} esxtokend: %{WORD:Log_nivel} %{PROG:Log_proceso}\[%{INT:Evento_id}\] \[Originator@6876 sub=%{GREEDYDATA:Titulo} opID=%{DATA:Op_id}\] %{GREEDYDATA:Mensaje}",
                               "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Host_ESXi} kmxa: %{WORD:Log_nivel} %{PROG:Log_proceso}\[%{INT:Evento_id}\] \[Originator@6876 sub=%{GREEDYDATA:Titulo} opID=%{DATA:Op_id}\] %{GREEDYDATA:Mensaje}",
                               "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Host_ESXi} kmxa: %{WORD:Log_nivel} %{PROG:Log_proceso}\[%{INT:Evento_id}\] \[Originator@6876 sub=%{GREEDYDATA:Titulo}\] %{GREEDYDATA:Mensaje}",
                               "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Host_ESXi} vobd:  \[%{WORD:Log_nivel}\] %{WORD:Log_id}: \[%{GREEDYDATA:Titulo}\] %{GREEDYDATA:Mensaje}",
                               "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Host_ESXi} configStoreBackup: %{GREEDYDATA:Mensaje}",
                               "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Host_ESXi} ConfigStore\[%{INT:Evento_id}\]: %{GREEDYDATA:Mensaje}",
                               "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Host_ESXi} heartbeat: %{WORD:Uptime_estado} %{WORD:Uptime_tiempo}, %{GREEDYDATA:MVs_encendidas}; %{GREEDYDATA:Mensaje}",
                               "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Host_ESXi} iscsid: %{GREEDYDATA:Mensaje}",
                               "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Host_ESXi} smartd: \[%{WORD:Log_nivel}\] %{GREEDYDATA:Titulo}: %{GREEDYDATA:Mensaje}",
                               "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Host_ESXi} %{PROG:Log_proceso}\[%{INT:Evento_id}\]: %{GREEDYDATA:Mensaje}"
                                       ]
                            }
                        }
        }
}


irteera {

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

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

        }
}

Ahora toca Logstash, así que una vez conectados a él, creamos por un fichero de configuración , adibidez: ‘/etc/logstash/conf.d/vmware-esxi.conf’. Y será ahí donde indiquemos el puerto de escucha, si escogimos tcp o udp y además vienen los filtros. Nire betiko eskatzen dudan bezala guruek ez didatela harririk bota, baina grok hauek baliagarriak dira VMware ESXi Log-ak parseatzeko 7.0, eso sí, hobetu daitezke eta asko 😉 Bueno, Log-ak zatitan banatu ondoren adieraziko diogu Elasticsearch-en gordeko ditugula, eta indize bat jartzen dugu. Gogoratu ez izatea ni bezalakoa eta, gainera, kredentzialak gehitzea, hau da: username & password.

konfigurazio fitxategia sortu ondoren, Gogoratu Logstash zerbitzua berrabiarazteko konfigurazio berria kargatzeko. Ondoren, 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) ‘vmware_esxi-*’ eta jada datuak Elasticsearch-en modu egokian gordeta izango ditugu. Orain “Discover”-etik gure VMware ESXi indizearekin konekta gaitezke eta datuak biltzen ari direla ikusi, host guztiek bidaltzen dituztena…

Eta bukaerarako, Indizea Kibana-n sortu ondoren, ahora en Grafana deberíamos crear un “Data Source” que apunte contra nuestro Elasticsearch y el índice recién creado de VMware ESXi. Gero, irudimena askatzea gelditzen da, Dashboard bat sortzea Panel desberdinekin, ikusi nahi ditugun datu desberdinekin, un panel de estilo Sankey jatorri/helmuga IPak eta bidaltzen duten trafikoa ikusteko, kolonetan formatuta, en taulak para ver datos concretos de por ejemplo los intentos de accesos, correctos, okerrak, hacer un top con los logs de errores e intentar solucionarlos, comparar entre distintos hosts la ‘normalidadde la frecuencia de ciertos logs de info, kontuz, errorea….

Betiko moduan, todo esto para intentar inspiraros si necesitáis, para coger ideas y mejorarlas, así que con esto podréis ver qué pasa en vuestros ESXi’s en tiempo real, automatikoki berritzen jarrita 10 segundo bakoitzeko, oso izugarria geratzen da, también nos servirá para analizar el resumen del último día, o conocer cuando algo extraño sucede… Como siempre, gracias a todos y a tope con los que movéis este tipo de contenidos en redes sociales!!! 😉

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!!!

NagVis-en Automap erabiliz

16 de September de 2021