
Recopilant els LOGs de VMware vCSA a Elasticsearch i visualitzant-los a Grafana
Vingui! ¡una altra de logs per favor! En aquesta ocasió veurem com explotar els Logs del nostre volgut entorn de VMware vSphere, des del vCSA o vCenter Server Appliance redireccionarem els logs a Logstash per ser processats i emmagatzemats a Elasticsearch, finalment podrem visualitzar-los d'una manera més gràfica amb Grafana. Així comprenem en temps real què succeeix o podrem tenir informes amb les dades de les últimes 24h, setmana, mes… totalment personalitzable, gratis…
Bo, què dir de vCenter Server que no sepàveu ja, sabem que és el cor de les nostres infraestructures virtuals de VMware, que és el portal d' accés a la plataforma, que aquí passen coses, de vegades rares, hi ha tasques, tenim esdeveniments… hi ha molta salsa que es cou i què menys que treure-li joguet. Per què no manar tots els Logs de vCSA a Logstash, ací mitjançant filtres separarem aquests fitxers de textos com ells mateixos, després de separar en diferents camps que ens permetin consultar de manera més còmoda serà el temps que s'emmagatzemen a Elasticsearch per visualitzar-los amb Kibana o Grafana. Al gust, com sabeu sóc més partidari d'aquest últim, però no hauureu de fer-me cas sempre 😉 Bueno, al tema, des de Grafana podrem veure de manera visual el recopilat, per veure les alarmes que hagin succeït, els intents de logon a la plataforma, igual que a vCenter podràs filtrar i conèixer les Tasques o Esdeveniments, fer unes taules cuquis amb un camp per buscar algun text alguna vegada, com un usuari i saber què va fer…
Com és normal, primer òbviament hem de tenir l'Elastic Stack instal·lat, el que ve sent Logstash, Elasticsearch y Kibana; després ja podrem anar al nostre vCSA, al seu web de gestió, recordar https://DIRECCION_IP_VCSA:5480, ací podrem des de la secció de “Syslog” configurar perquè tregui els Logs a Logstash, així que indiquem l'adreça IP on manar els Logs i el port que ens interessi.
input { tcp { type => "VCSA" port => "1515" tags => ["VMware,VCSA"] } } filter { if [type] == "VCSA" { grok { match => { "message" => [ "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Servidor_VCSA} %{PROG:Nombre_log} - - -\s +%{TIMESTAMP_ISO8601:Log_fecha} \[%{GREEDYDATA:Tipo_tarea} %{WORD:Log_nivel} %{GREEDYDATA:Títol} opId =] %{GREEDYDATA:Mensaje}", "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Servidor_VCSA} %{PROG:Nombre_log} %{INT:Proceso_id} - - Event \[%{INT:Evento_id}\] \[1-1\] \[%{TIMESTAMP_ISO8601:Log_fecha}\] \[%{GREEDYDATA:Títol}\] \[%{WORD:Log_nivel}\] \[%{GREEDYDATA:Usuari}\] \[%{DATA:Sitio}\] \[%{INT:Evento_id}\] \[%{GREEDYDATA:Mensaje}\]", "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Servidor_VCSA} %{PROG:Nombre_log} - - - %{TIMESTAMP_ISO8601:Log_fecha} %{WORD:Log_nivel} %{PROG:Log_proceso}\[%{INT:Evento_id}\] \[%{GREEDYDATA:Originator} sub=%{GREEDYDATA:Títol}\] %{TIMESTAMP_ISO8601:HTTP_fecha} %{WORD:HTTP_log_accion} %{UNIXPATH:HTTP_ruta} %{PROG:HTTP_version} %{INT:HTTP_codigo} %{PROG:HTTP_codigo_respuesta} - %{INT:HTTP_bytes_recibidos} %{INT:HTTP_bytes_enviados} %{INT:HTTP_duracion} %{INT:HTTP_tiempo_respuesta} %{INT:HTTP_req_forwarder} %{IPV4:HTTP_ip_origen1}:%{INT:HTTP_puerto_origen1} %{IPV4:HTTP_ip_destino1}:%{INT:HTTP_puerto_destino1} %{IPV4:HTTP_ip_origen2}:%{INT:HTTP_puerto_origen2} %{IPV4:HTTP_ip_destino2}:%{INT:HTTP_puerto_destino2}", "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Servidor_VCSA} %{PROG:Nombre_log} - - - %{TIMESTAMP_ISO8601:Log_fecha} %{WORD:Log_nivel} %{PROG:Log_proceso}\[%{INT:Evento_id}\] \[%{GREEDYDATA:Originator} sub=%{GREEDYDATA:Títol}\] %{TIMESTAMP_ISO8601:HTTP_fecha} %{WORD:HTTP_log_accion} %{UNIXPATH:HTTP_ruta} %{PROG:HTTP_version} %{INT:HTTP_codigo} %{PROG:HTTP_codigo_respuesta} - %{INT:HTTP_bytes_recibidos} %{INT:HTTP_bytes_enviados} %{INT:HTTP_duracion} %{INT:HTTP_tiempo_respuesta} %{INT:HTTP_req_forwarder} %{IPV4:HTTP_ip_origen1}:%{INT:HTTP_puerto_origen1} %{IPV4:HTTP_ip_destino1}:%{INT:HTTP_puerto_destino1} %{GREEDYDATA:Mensaje}", "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Servidor_VCSA} %{PROG:Nombre_log} - - - %{TIMESTAMP_ISO8601:Log_fecha} %{WORD:Log_nivel} %{PROG:Log_proceso}\[%{INT:Evento_id}\] \[%{GREEDYDATA:Originator} sub=%{GREEDYDATA:Títol} opId =%{PROG:Op_id}\] %{GREEDYDATA:Mensaje}", "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Servidor_VCSA} %{PROG:Nombre_log} - - -\s +%{TIMESTAMP_ISO8601:Log_fecha} \[%{PROG:Log_proceso}\] %{WORD:Log_nivel}\s + opId =%{DATA:Op_id} - %{GREEDYDATA:Mensaje}", "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Servidor_VCSA} %{PROG:Nombre_log} - - - %{TIMESTAMP_ISO8601:Log_fecha} %{WORD:Log_nivel} %{PROG:Log_proceso}\[%{INT:Evento_id}\] \[%{GREEDYDATA:Originator} sub=%{GREEDYDATA:Títol}\] \[%{DATA:Tipo_unit}\] %{GREEDYDATA:Mensaje}", "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Servidor_VCSA} %{PROG:Nombre_log} - - - %{TIMESTAMP_ISO8601:Log_fecha} %{WORD:Log_nivel} %{PROG:Log_proceso}\[%{INT:Evento_id}\] \[%{GREEDYDATA:Originator} sub=%{GREEDYDATA:Títol}\] %{GREEDYDATA:Mensaje}", "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Servidor_VCSA} %{PROG:Nombre_log} - - - \[%{HTTPDATE:Log_fecha}\] %{PROG:Log_proceso} \[%{WORD:HTTP_peticion}\] %{IPV4:HTTP_ip_origen1}:%{INT:HTTP_puerto_origen1} to %{HOSTNAME:HTTP_equipo_destino} %{INT:HTTP_puerto_destino1} - %{PROG:HTTP_version} %{WORD:HTTP_log_accion} %{UNIXPATH:HTTP_ruta}\s +[%{WORD:HTTP_respuesta}\] %{INT:HTTP_codigo} - %{INT:HTTP_bytes} bytes\s+\[%{PROG:HTTP_log_proceso}\] process %{INT:Tiempo_total}ms / commit %{INT:Tiempo_conexion}ms / conn \[\+\]", "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Servidor_VCSA} %{PROG:Nombre_log} - - -\s +%{TIMESTAMP_ISO8601:Log_fecha} %{WORD:Log_nivel} %{PROG:Log_proceso} \[%{DATA:Log_proceso}\] \[opID=%{PROG:Op_id}\] %{GREEDYDATA:Mensaje}", "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Servidor_VCSA} %{PROG:Nombre_log} - - -\s +%{TIMESTAMP_ISO8601:Log_fecha} %{WORD:Log_nivel} %{PROG:Log_proceso}\[%{DATA:Log_proceso}\] \[OpId=%{PROG:Op_id}\] %{GREEDYDATA:Mensaje}", "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Servidor_VCSA} %{PROG:Nombre_log} - - -\s +%{TIMESTAMP_ISO8601:Log_fecha} \|\s +%{WORD:Log_nivel} \| %{PROG:Log_proceso} \| %{DATA:Log_tarea} \| %{INT:Pid} \| %{GREEDYDATA:Mensaje}", "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Servidor_VCSA} %{PROG:Nombre_log} - - -\s +%{TIMESTAMP_ISO8601:Log_fecha} \|\s +%{WORD:Log_nivel} \| %{PROG:Log_proceso} \| %{DATA:Log_tarea} \| %{GREEDYDATA:Mensaje}", "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Servidor_VCSA} %{PROG:Nombre_log} - - -\s +[%{TIMESTAMP_ISO8601:Log_fecha}\] \[%{WORD:Log_nivel} \] %{PROG:Log_proceso} %{PROG:Tarea} %{GREEDYDATA:Mensaje}", "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Servidor_VCSA} %{PROG:Nombre_log} - - -\s +%{TIMESTAMP_ISO8601:Log_fecha} \[%{PROG:Log_proceso}\s +%{WORD:Log_nivel} %{GREEDYDATA:Títol} opId =%{PROG:Op_id}\] %{GREEDYDATA:Mensaje}", "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Servidor_VCSA} %{PROG:Nombre_log} - - -\s +%{TIMESTAMP_ISO8601:Log_fecha} \[%{PROG:Log_proceso}\s +%{WORD:Log_nivel} %{GREEDYDATA:Títol} opId =%{PROG:Op_id} %{WORD:Nipu}\] %{GREEDYDATA:Mensaje}", "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Servidor_VCSA} %{PROG:Nombre_log} - - -\s +[%{TIMESTAMP_ISO8601:Log_fecha}\] %{WORD:Log_nivel}\[%{PROG:Log_proceso}\] - %{GREEDYDATA:Mensaje}", "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Servidor_VCSA} %{PROG:Nombre_log} - - -\s +%{TIMESTAMP_ISO8601:Log_fecha} %{INT:Log_bytes} %{INT:Pid} %{PROG:Log_proceso} %{INT:HTTP_codigo} \"%{GREEDYDATA:Títol}\" %{WORD:HTTP_log_accion} %{UNIXPATH:HTTP_ruta} %{PROG:HTTP_version}", "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Servidor_VCSA} procstate - - - %{DATA:Usuari}\s +%{PROG:Log_pid}\s +%{DATA:CPU}\s +%{DATA:Memòria}\s +%{DATA:MemoriaVirtual}\s +%{DATA:MemoriaProceso}\s +%{DATA:TTY}\s +%{DATA:Stat}\s +%{DATA:Hora_inicio}\s +%{DATA:Tiempo}\s +%{GREEDYDATA:Mensaje}", "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Servidor_VCSA} sca - - -\s +%{TIMESTAMP_ISO8601:Log_fecha} %{WORD:Log_nivel} %{PROG:Procés} \[%{PROG:Pool}\] %{GREEDYDATA:Mensaje}", "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Servidor_VCSA} applmgmt-audit - - - %{TIMESTAMP_ISO8601:Log_fecha}: %{GREEDYDATA:Mensaje}", "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Servidor_VCSA} applmgmt - - - %{TIMESTAMP_ISO8601:Log_fecha} \[%{INT:Evento_id}\]%{GREEDYDATA:Mensaje}", "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Servidor_VCSA} procstate - - - %{GREEDYDATA:Mensaje}", "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Servidor_VCSA} sca-vmon.std - - - %{GREEDYDATA:Mensaje}", "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Servidor_VCSA} vsan-health-main - - - %{GREEDYDATA:Mensaje}", "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Servidor_VCSA} vum-log4cpp - - - %{GREEDYDATA:Mensaje}", "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Servidor_VCSA} vmcad - - - %{GREEDYDATA:Mensaje}", "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Servidor_VCSA} eam-main - - - %{GREEDYDATA:Mensaje}", "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Servidor_VCSA} cis-license - - - %{GREEDYDATA:Mensaje}", "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Servidor_VCSA} vmdird - - - %{GREEDYDATA:Mensaje}", "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Servidor_VCSA} sps-gc - - - %{GREEDYDATA:Mensaje}", "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Servidor_VCSA} vstats - - - %{GREEDYDATA:Mensaje}", "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Servidor_VCSA} vapi-runtime - - - %{GREEDYDATA:Mensaje}", "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Servidor_VCSA} vpxd-profiler - - - %{GREEDYDATA:Mensaje}", "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Servidor_VCSA} rsyslogd - - - %{GREEDYDATA:Mensaje}", "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Servidor_VCSA} trustmanagement-svcs - - - %{GREEDYDATA:Mensaje}", "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Servidor_VCSA} %{PROG:Nombre_log} - - - %{SYSLOGTIMESTAMP:Data} %{PROG:Log_proceso}\[%{INT:Pid}\]: %{GREEDYDATA:Mensaje}", "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Servidor_VCSA} %{PROG:Nombre_log} - - - %{TIMESTAMP_ISO8601:Log_fecha} %{TZ:Zona_horaria} %{PROG:Procés} %{INT:Log_id}\s+LOG:\s +%{GREEDYDATA:Mensaje}", "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Servidor_VCSA} %{PROG:Nombre_log} - - - %{TIMESTAMP_ISO8601:Log_fecha}\| %{PROG:Procés}\| I005: %{GREEDYDATA:Mensaje}", "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Servidor_VCSA} %{PROG:Nombre_log} - - - %{TIMESTAMP_ISO8601:Log_fecha} %{PROG:Procés} %{WORD:Log_nivel} %{PROG:Tarea} %{GREEDYDATA:Mensaje}", "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Servidor_VCSA} ui-access - - - %{IPV4:HTTP_ip_destino1} %{IPV4:HTTP_ip_origen1} - - \[%{HTTPDATE:Data}\] \"%{WORD:HTTP_log_accion} %{UNIXPATH:HTTP_ruta} %{PROG:HTTP_version}\" %{INT:HTTP_codigo} %{PROG:HTTP_codigo_respuesta} - %{DATA:HTTP_bytes_recibidos} %{GREEDYDATA:Mensaje}", "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Servidor_VCSA} eam-access - - - %{IPV4:HTTP_ip_destino1} %{IPV4:HTTP_ip_origen1} - - \[%{HTTPDATE:Data}\] \[%{PROG:Log_proceso}\] \"%{WORD:HTTP_log_accion} %{UNIXPATH:HTTP_ruta} %{PROG:HTTP_version}\" %{INT:HTTP_codigo} %{PROG:HTTP_codigo_respuesta} \[Processing time %{INT:Tiempo} msec\] %{GREEDYDATA:Mensaje}", "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Servidor_VCSA} %{PROG:Nombre_log} - - - %{TIMESTAMP_ISO8601:Log_fecha} \[%{PROG:Procés}\]\[%{WORD:Log_nivel}\] %{PROG:Tarea}: %{GREEDYDATA:Mensaje}", "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Servidor_VCSA} %{PROG:Nombre_log} - - - %{TIMESTAMP_ISO8601:Log_fecha} %{PROG:Procés} %{WORD:Log_nivel} %{PROG:Tarea} %{GREEDYDATA:Mensaje}", "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Servidor_VCSA} %{PROG:Nombre_log} - - - \[%{TIMESTAMP_ISO8601:Log_fecha}\] \[%{WORD:Log_nivel}\s +] %{GREEDYDATA:Mensaje}", "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Servidor_VCSA} %{PROG:Nombre_log} - - - %{TIMESTAMP_ISO8601:Log_fecha} \| %{PROG:Log_proceso} \| %{GREEDYDATA:Mensaje}", "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Servidor_VCSA} CROND %{INT:Pid} - - \(%{USERNAME:Usuari}\) CMD \(%{GREEDYDATA:Mensaje}\)", "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Servidor_VCSA} %{PROG:Nombre_log} - - -\s +%{TIMESTAMP_ISO8601:Log_fecha} \|\s +%{WORD:Log_nivel} \| %{PROG:Evento_id}\ \| %{PROG:Procés} \| %{DATA:Tarea} \| %{GREEDYDATA:Mensaje}", "<%{POSINT:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{HOSTNAME:Servidor_VCSA} %{PROG:Nombre_log} - - -\s +%{TIMESTAMP_ISO8601:Log_fecha} %{PROG:Log_proceso} %{WORD:Log_nivel} %{PROG:Tarea} %{GREEDYDATA:Mensaje}" ] } } } } output { if ([type]=="VCSA"){ elasticsearch { index => "vmware_vcsa-%{+YYYY.MM.dd}" hosts => "DIRECCION_IP_ELASTICSEARCH:9200" } } }
Ahora ya será el momento de crear el fichero de configuración en Logstash para recibir, tratar y sacar los Logs a Elasticsearch, mateixament li podem anomenar '/etc/logstash/conf.d/vmware-vcsa.conf', on a l'input tindrem el port d'escolta on rebrà del vCSA els logs. Després ja venen els filtres que com sempre demano disculpes als savis, però són filtres vàlids i molt millorables, però ens permetran tractar els logs d'un vCSA amb versió 7.x. Al final li donarem sortida a Elasticsearch, indiquem la IP de destinació per emmagatzemar aquí les dades, i seguits d'uns 100.000, no seguiu com jo que no indico els paràmetres d'username’ i 'password'.
Un cop creat el fitxer de configuració, recordarem reiniciar el servei de Logstash per recarregar la nova configuració. Després, anirem a Kibana i un cop les dades estiguin entrant ja podrem anar a "Management" > "Stack management" > "Kibana" > "Index Patterns" > "Crea't index pattern" per crear el patró de l'índex, el que s' ha dit, com habitualment (en aquest cas i sense les cometes) 'vmware_vcsa-*' i tindrem les dades ja a Elasticsearch emmagatzemats de manera correcta. Ara podríem connectar-nos des de "Discover" al nostre índex de VMware vCSA i visualitzar que està recollint dades, que comencem a tenir registres del vCenter…
Després de crear l'índex a Kibana, ara a Grafana hauríem de crear un "Data Source" que apunti contra el nostre Elasticsearch i l'índex recent creat de VMware vCSA. Després ja és deixar volar la imaginació, fer un Dashboard amb diferents Panells, amb diferents dades a visualitzar, veure els tipus dels Logs, gràfiques amb recepció per tipus, en taules per veure dades concretes de per exemple els intents d'accessos, correctes, incorrectes, últimes Alarmes, registres del DRS, Esdeveniments, Tasques… un mapamundi amb les connexions entrants si és que ets un valent que el té públic a Internet… un panell d' estil Sankey per veure IPs/usuaris origen/destí… fer un top amb els logs d'errors i intentar solucionar-los…
Així que això, el rotllo de sempre, tot això per intentar ajudar, inspirar… si necessiteu, per agafar idees i millorar-les, així que amb això podreu veure què passa a la vostra plataforma virtual de VMware vSphere, tot el que succeeixi a vCenter, en temps real, posant un refresc automàtic cada 10 segons queda molt guai, també ens servirà per analitzar el resum de l'últim dia, o conèixer quan alguna cosa estranya succeeix... Gràcies a tots i a més als que moveu aquest tipus de continguts en xarxes socials!!!