
Coletando LOGs do VMware ESXi no Elasticsearch e visualizando-os no Grafana
Bem, hoje é hora de mais um post sobre coleta de logs, como tratá-los e, acima de tudo, como visualizá-los; neste documento veremos como realizar todo o processo com os logs do hipervisor VMware ESXi, trate-os com o Elastic Stack e, finalmente, visualize no Grafana o que nos interessa, como logs de erros, Entradas incorretas…
Todos nós que trabalhamos com infraestruturas VMware sabemos que toda a base é suportada por um hipervisor fabuloso, nossos amados anfitriões ESXi. Um hipervisor baseado em segurança e estabilidade, que eles geralmente dão poucos problemas, mas que não faz mal coletar seus registros em um local centralizado para acompanhar sua saúde. Como sabemos, Podemos armazenar seus logs em um syslog, Então, aproveitando isso, enviaremos os Logs para o Logstash. O Logstash será responsável por receber e solicitar os logs, Separando cadeias de texto tediosas em campos diferentes com dados válidos, para finalmente enviar esses dados para o Elasticsearch e armazená-los em um índice. Então, através do Kibana ou Grafana, poderemos visualizar esse conteúdo de forma gráfica, e visualize as tentativas de login para o host (por SSH, GUI…), Basta visualizar os acessos, Entender os eventos com falha, Comparar diferentes hipervisores entre si, Conheça erros repetitivos… E tudo isso como sempre em tempo real ou para fazer dados históricos das últimas 24 horas, semana, mês, ano…
Primeiro, obviamente temos que ter a parte do Elastic Stack instalada, O que foi Armazenamento, Elasticsearch e Kibana; então seria dizer a cada hipervisor para enviar os Logs para o Logstash, para o porto de nossa escolha. Pare com isso, Temos muitas maneiras de fazer isso, Anfitrião para anfitrião, da GUI, CLI, do vCenter…
O mais parecido se você tiver poucos anfitriões, do vCenter, vamos para cada host, em “Configurar” > Configurações avançadas do sistema” > e buscamos “syslog.global”, editamos 'Syslog.global.logHost” Indicação no formato TCP/UDP://DIRECCION_IP:PORT o destino de nossos Logs. Ou melhor ainda, com o 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:PORT Get-VMHostSysLogServer -VMHost NOMBRE_HOST_ESXi Get-VMhostFireWallException -VMhost NOMBRE_HOST_ESXi -Name syslog Get-VMHostFireWallException -VMHost NOMBRE_HOST_ESXi -Name Syslog | Set-VMHostFirewallException -Habilitado:$Verdadeiro.
Entrada { TCP { tipo => "ESXi" porta => "1514" tags => ["VMware","ESXi"] } } filtro { se [tipo] == "ESXi" { Grok { correspondência => { "Mensagem" => [ "<%{DERRUBE:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{NOME DO HOST:Host_ESXi} Hospedado: %{PALAVRA:Log_nivel} %{PROG:Log_proceso}\[%{INT:Evento_id}\] \[Originator@6876 sub=%{DADOS GANANCIOSOS:Título} opID=%{DADOS GANANCIOSOS:Op_id} usuário=%{DADOS GANANCIOSOS:Utilizador}\] %{DADOS GANANCIOSOS:Evento_tipo} %{DADOS GANANCIOSOS:Evento_codigo} : %{DADOS GANANCIOSOS:Mensagem}", "<%{DERRUBE:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{NOME DO HOST:Host_ESXi} Hospedado: %{PALAVRA:Log_nivel} %{PROG:Log_proceso}\[%{INT:Evento_id}\] \[Originator@6876 sub=%{DADOS GANANCIOSOS:Título} opID=%{DADOS GANANCIOSOS:Op_id} usuário=%{DADOS GANANCIOSOS:Utilizador}\] %{DADOS GANANCIOSOS:Evento_codigo}: %{DADOS GANANCIOSOS:Mensagem}", "<%{DERRUBE:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{NOME DO HOST:Host_ESXi} Hospedado: %{PALAVRA:Log_nivel} %{PROG:Log_proceso}\[%{INT:Evento_id}\] \[Originator@6876 sub=%{DADOS GANANCIOSOS:Título} opID=%{DADOS GANANCIOSOS:Op_id} usuário=%{DADOS GANANCIOSOS:Utilizador}\] \(%{DADOS GANANCIOSOS:Evento_codigo}\)", "<%{DERRUBE:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{NOME DO HOST:Host_ESXi} Hospedado: %{PALAVRA:Log_nivel} %{PROG:Log_proceso}\[%{INT:Evento_id}\] \[Originator@6876 sub=%{DADOS GANANCIOSOS:Título} opID=%{DADOS GANANCIOSOS:Op_id}\] \[%{DADOS GANANCIOSOS:Evento_codigo}\]: %{DADOS GANANCIOSOS:Mensagem}", "<%{DERRUBE:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{NOME DO HOST:Host_ESXi} Hospedado: %{PALAVRA:Log_nivel} %{PROG:Log_proceso}\[%{INT:Evento_id}\] \[Originator@6876 sub=%{DADOS GANANCIOSOS:Título} opID=%{DADOS GANANCIOSOS:Op_id}\] %{DADOS GANANCIOSOS:Mensagem}", "<%{DERRUBE:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{NOME DO HOST:Host_ESXi} Hospedado: %{PALAVRA:Log_nivel} %{PROG:Log_proceso}\[%{INT:Evento_id}\] \[Originator@6876 sub=%{DADOS GANANCIOSOS:Título}\] %{DADOS GANANCIOSOS:Mensagem}", "<%{DERRUBE:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{NOME DO HOST:Host_ESXi} Hospedado: %{DADOS GANANCIOSOS:Mensagem}", "<%{DERRUBE:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{NOME DO HOST:Host_ESXi} Vpxa: %{PALAVRA:Log_nivel} %{PROG:Log_proceso}\[%{INT:Evento_id}\] \[Originator@6876 sub=%{DADOS GANANCIOSOS:Título} opID=%{DADOS GANANCIOSOS:Op_id}\] %{DADOS GANANCIOSOS:Mensagem}", "<%{DERRUBE:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{NOME DO HOST:Host_ESXi} Vpxa: %{PALAVRA:Log_nivel} %{PROG:Log_proceso}\[%{INT:Evento_id}\] \[Originator@6876 sub=%{DADOS GANANCIOSOS:Título}\] %{DADOS GANANCIOSOS:Mensagem}", "<%{DERRUBE:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{NOME DO HOST:Host_ESXi} Vpxa: %{DADOS GANANCIOSOS:Mensagem}", "<%{DERRUBE:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{NOME DO HOST:Host_ESXi} Rhttpproxy: %{PALAVRA:Log_nivel} %{PROG:Log_proceso}\[%{INT:Evento_id}\] \[Originator@6876 sub=%{DADOS GANANCIOSOS:Título}\] %{DADOS GANANCIOSOS:Mensagem}", "<%{DERRUBE:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{NOME DO HOST:Host_ESXi} Rhttpproxy: %{DADOS GANANCIOSOS:Mensagem}", "<%{DERRUBE:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{NOME DO HOST:Host_ESXi} apiForwarder: %{PALAVRA:Log_nivel} %{PROG:Log_proceso}\[%{INT:Evento_id}\] \[Originator@6876 sub=%{DADOS GANANCIOSOS:Título}\] %{DADOS GANANCIOSOS:Mensagem}", "<%{DERRUBE:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{NOME DO HOST:Host_ESXi} VSANMGMTSVC: %{PALAVRA:Log_nivel} %{PROG:Log_proceso}\[%{INT:Evento_id}\] \[opID=%{DADOS GANANCIOSOS:Título}\] %{DADOS GANANCIOSOS:Mensagem}", "<%{DERRUBE:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{NOME DO HOST:Host_ESXi} Sistema VSANSYSTEM: %{PALAVRA:Log_nivel} %{PROG:Log_proceso}\[%{INT:Evento_id}\] \[%{DADOS GANANCIOSOS:Título}\] %{DADOS GANANCIOSOS:Mensagem}", "<%{DERRUBE:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{NOME DO HOST:Host_ESXi} Sistema VSANSYSTEM: %{DADOS GANANCIOSOS:Mensagem}", "<%{DERRUBE:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{NOME DO HOST:Host_ESXi} vmkernel: %{PALAVRA:CPU_core}:%{INT:Evento_id}\)%{DADOS GANANCIOSOS:Título}: %{DADOS GANANCIOSOS:Mensagem}", "<%{DERRUBE:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{NOME DO HOST:Host_ESXi} vmkernel: %{PALAVRA:CPU_core}:%{INT:Evento_id} opID=%{PROG:Op_id}\)%{DADOS GANANCIOSOS:Título}: %{DADOS GANANCIOSOS:Mensagem}", "<%{DERRUBE:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{NOME DO HOST:Host_ESXi} vmkernel: %{PALAVRA:CPU_core}:%{INT:Evento_id}\)%{DADOS GANANCIOSOS:Mensagem}", "<%{DERRUBE:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{NOME DO HOST:Host_ESXi} vmkwarning: %{PALAVRA:CPU_core}:%{INT:Evento_id}\)%{DADOS GANANCIOSOS:Título}: %{DADOS GANANCIOSOS:Mensagem}", "<%{DERRUBE:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{NOME DO HOST:Host_ESXi} Fdm: %{PALAVRA:Log_nivel} %{PROG:Log_proceso}\[%{INT:Evento_id}\] \[Originator@6876 sub=%{DADOS GANANCIOSOS:Título} opID=%{PROG:Op_id}\] %{DADOS GANANCIOSOS:Mensagem}", "<%{DERRUBE:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{NOME DO HOST:Host_ESXi} Fdm: %{PALAVRA:Log_nivel} %{PROG:Log_proceso}\[%{INT:Evento_id}\] \[Originator@6876 sub=%{DADOS GANANCIOSOS:Título}\] %{DADOS GANANCIOSOS:Mensagem}", "<%{DERRUBE:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{NOME DO HOST:Host_ESXi} sonda hospedada: %{PALAVRA:Log_nivel} %{PROG:Log_proceso}\[%{INT:Evento_id}\] \[Originator@6876 sub=%{DADOS GANANCIOSOS:Título}\] %{DADOS GANANCIOSOS:Mensagem}", "<%{DERRUBE:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{NOME DO HOST:Host_ESXi} %{PROG:Log_proceso}\[%{INT:Evento_id}\]: UTILIZADOR %{PALAVRA:Utilizador} Pid %{INT:Pid} %{PALAVRA:Tipo_proceso} %{DADOS GANANCIOSOS:Mensagem}", "<%{DERRUBE:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{NOME DO HOST:Host_ESXi} %{PROG:Log_proceso}\[%{INT:Evento_id}\]: %{DADOS GANANCIOSOS:Mensagem}", "<%{DERRUBE:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{NOME DO HOST:Host_ESXi} esxtokend: %{PALAVRA:Log_nivel} %{PROG:Log_proceso}\[%{INT:Evento_id}\] \[Originator@6876 sub=%{DADOS GANANCIOSOS:Título} opID=%{DATA:Op_id}\] %{DADOS GANANCIOSOS:Mensagem}", "<%{DERRUBE:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{NOME DO HOST:Host_ESXi} Kmxa: %{PALAVRA:Log_nivel} %{PROG:Log_proceso}\[%{INT:Evento_id}\] \[Originator@6876 sub=%{DADOS GANANCIOSOS:Título} opID=%{DATA:Op_id}\] %{DADOS GANANCIOSOS:Mensagem}", "<%{DERRUBE:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{NOME DO HOST:Host_ESXi} Kmxa: %{PALAVRA:Log_nivel} %{PROG:Log_proceso}\[%{INT:Evento_id}\] \[Originator@6876 sub=%{DADOS GANANCIOSOS:Título}\] %{DADOS GANANCIOSOS:Mensagem}", "<%{DERRUBE:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{NOME DO HOST:Host_ESXi} vobd: \[%{PALAVRA:Log_nivel}\] %{PALAVRA:Log_id}: \[%{DADOS GANANCIOSOS:Título}\] %{DADOS GANANCIOSOS:Mensagem}", "<%{DERRUBE:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{NOME DO HOST:Host_ESXi} configStoreBackup: %{DADOS GANANCIOSOS:Mensagem}", "<%{DERRUBE:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{NOME DO HOST:Host_ESXi} ConfigStore[%{INT:Evento_id}\]: %{DADOS GANANCIOSOS:Mensagem}", "<%{DERRUBE:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{NOME DO HOST:Host_ESXi} batimento cardíaco: %{PALAVRA:Uptime_estado} %{PALAVRA:Uptime_tiempo}, %{DADOS GANANCIOSOS:MVs_encendidas}; %{DADOS GANANCIOSOS:Mensagem}", "<%{DERRUBE:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{NOME DO HOST:Host_ESXi} ISCSID: %{DADOS GANANCIOSOS:Mensagem}", "<%{DERRUBE:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{NOME DO HOST:Host_ESXi} inteligente: \[%{PALAVRA:Log_nivel}\] %{DADOS GANANCIOSOS:Título}: %{DADOS GANANCIOSOS:Mensagem}", "<%{DERRUBE:syslog_pri}>%{TIMESTAMP_ISO8601:Data} %{NOME DO HOST:Host_ESXi} %{PROG:Log_proceso}\[%{INT:Evento_id}\]: %{DADOS GANANCIOSOS:Mensagem}" ] } } } } saída { se ([tipo]=="ESXi"){ ElasticSearch { índice => "vmware_esxi-%{+AAAAA. MM.dd}" hosts=> "DIRECCION_IP_ELASTICSEARCH:9200" } } }
Agora toque em Logstash, então, uma vez conectado a ele, Criamos por um arquivo de configuração , Por exemplo: '/etc/logstash/conf.d/vmware-esxi.conf'. E é aí que indicaremos a porta de escuta, Se escolhermos TCP ou UDP e também vier os filtros. Assim como sempre peço que os gurus não joguem pedras em mim, mas esses groks são válidos para analisar VMware ESXi Logs 7.0, É claro, Improvável e muito 😉 bom, depois de separar os logs em pedaços, informaremos que vamos armazená-los no Elasticsearch, e colocamos um índice. Lembre-se de não ser como eu e também adicione credenciais, Isso é: nome de usuário & senha.
Depois que o arquivo de configuração for criado, lembre-se de reiniciar o serviço Logstash para recarregar a nova configuração. Depois, iremos para o Kibana e, assim que os dados chegarem, podemos ir para "Gerenciamento" > "Gerenciamento de pilha" > "Kibana" > "Padrões de índice" > "Criar padrão de índice" para criar o padrão de índice, Como eu disse, como de costume (neste caso e sem as aspas) 'vmware_esxi-*' e teremos os dados já armazenados no Elasticsearch corretamente. Agora podemos nos conectar de "Discover" ao nosso índice VMware ESXi e visualizar que ele está coletando dados, que todos os hosts enviam…
E para terminar, depois de criar o índice no Kibana, agora no Grafana, devemos criar uma "Fonte de dados" que aponte para o nosso Elasticsearch e o recém-criado índice VMware ESXi. Então é deixar sua imaginação correr solta, faça um Dashboard com diferentes Dashboards, com dados diferentes para visualizar, Um painel de estilo Sankey para visualizar IPs de origem/destino e o tráfego que está sendo enviado, em formato de coluna, em impasse para visualizar dados específicos, por exemplo, tentativas de login, Correto, Incorreto, Recarregue os logs de erros e tente corrigi-los, comparar entre diferentes hospedeiros o 'normal'’ da frequência de certos registros de informações, aviso, erro….
Como de costume, tudo isso para tentar inspirá-lo se precisar, para pegar ideias e melhorá-las, então com isso você poderá ver o que está acontecendo em seus ESXi em tempo real, Colocando uma atualização automática a cada 10 segundos é muito impressionante, Também nos ajudará a analisar o resumo do último dia, ou saber quando algo estranho acontece... Como de costume, Obrigado a todos e ao máximo com que você move esse tipo de conteúdo nas redes sociais!!!