Unindo ELK e Exchange. Parte 1

Unindo ELK e Exchange. Parte 1

Estou começando uma série de artigos onde quero compartilhar minha experiência com a configuração do Exchange e ELK. Esta pilha ajudará a processar grandes volumes de logs, sem nos preocuparmos com o tamanho em que as ferramentas de logging habituais deixam de nos ajudar. Vamos conhecer este novo agente de logs.

O Exchange possui um sistema de logging bastante robusto. Os logs mais utilizados são os logs de rastreamento, que monitoram o passo a passo de um e-mail dentro da organização; logs do servidor web, que registram cada nova sessão de usuário no sistema, e logs de aplicativos web específicos com diferentes níveis de detalhamento das sessões. Além disso, o Exchange pode armazenar logs brutos dos protocolos smtp, imap e pop3.

Quais ferramentas podemos usar para trabalhar com logs:

  • O cmdlet Get-MessageTrackingLog: conveniente para processar logs de rastreamento;
  • A ferramenta logparser: utiliza uma linguagem pseudo-SQL para busca e funciona de forma bastante rápida;
  • Um servidor SQL externo: para casos muito específicos (por exemplo, análise de dados por grandes períodos de tempo).

Tudo isso funciona bem quando temos alguns servidores e o volume de logs processados é medido em dezenas ou centenas de gigabytes. Mas e se contarmos dezenas de servidores e o tamanho dos logs ultrapassou um terabyte? Este esquema, provavelmente, começa a falhar.

E é isso que acontece: o Get-MessageTrackingLog começa a falhar devido a timeout, o logparser atinge o teto da arquitetura de 32 bits, e a exportação para o servidor SQL quebra no momento mais inoportuno, não lidando com uma exceção de múltiplas linhas do serviço.

Aqui, entra um novo jogador – a pilha ELK, que é especialmente projetada para lidar com grandes volumes de logs em prazos razoáveis e com um consumo de recursos aceitável.

Na primeira parte, eu explicarei em detalhes como conectar o filebeat, que faz parte da pilha ELK — ele é responsável pela leitura e envio de arquivos de texto simples, onde diversos aplicativos registram seus logs. Em artigos futuros, focaremos mais nos componentes Logstash e Kibana.

Instalação

Então, o arquivo-compacto do agente filebeat pode ser baixado deste site.

Faremos a instalação simplesmente descompactando o conteúdo do arquivo zip. Por exemplo, em c:Program Filesfilebeat. Em seguida, é necessário executar o script PowerShell install-service-filebeat.ps1, que vem incluído, para instalar o serviço filebeat.

Agora estamos prontos para começar a configurar o arquivo de configuração.

Resiliência

O Filebeat garante a entrega de logs ao sistema de coleta de logs. Isso é realizado por meio da manutenção de um registro das entradas nos arquivos de log. O registro armazena informações sobre as entradas que foram lidas dos arquivos de log e marca as entradas específicas que foram entregues ao destino.

Se uma entrada não puder ser entregue, o Filebeat tentará reenviá-la até que receba confirmação de entrega do sistema receptor ou até que o arquivo de log original seja excluído durante o processo de rotação.

Ao reiniciar o serviço Filebeat, ele lerá do registro as informações sobre as últimas entradas lidas e entregues, e começará a ler as entradas nos arquivos de log com base nas informações do registro.

Isso ajuda a minimizar o risco de perda de informações sobre logs que precisam ser enviados para os servidores Elastic Logstash durante falhas inesperadas e operações de manutenção nos servidores.

Mais detalhes sobre isso podem ser encontrados na documentação nos parágrafos: Como o Filebeat mantém o estado dos arquivos e Como o Filebeat garante a entrega pelo menos uma vez?

Configuração

Toda a configuração é realizada em um arquivo de configuração no formato yml, que é dividido em várias seções. Vamos considerar algumas delas que participam do processo de coleta de logs dos servidores Exchange.

Bloco de processamento de logs

O bloco de processamento de logs começa com o campo:

filebeat.inputs:

Vamos usar uma ferramenta de coleta de logs comum:

- type: log

Em seguida, especificamos o status (habilitado) e os caminhos até a pasta com os logs. Por exemplo, no caso dos logs do IIS, as configurações podem ser as seguintes:

    enabled: true
    paths:
	- C:inetpublogsLogFilesW3SVC1*.log
	- C:inetpublogsLogFilesW3SVC2*.log

Outra configuração importante: como o Filebeat deve ler entradas de múltiplas linhas. Por padrão, o Filebeat considera uma linha de arquivo de log como uma entrada. Isso funciona bem até que comecem a surgir exceções relacionadas ao funcionamento incorreto do serviço. Neste caso, as exceções podem consistir de várias linhas. Portanto, o Filebeat deve considerar uma entrada de múltiplas linhas como uma, se a próxima linha começar com uma data. O formato da entrada de logs no Exchange é o seguinte: cada nova entrada no arquivo de log começa com uma data. Na configuração, essa condição é definida da seguinte forma:

multiline:
	pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}'
	negate: true
	match: after

Faz sentido adicionar tags na gravação enviada, por exemplo:

  tags: ['IIS', 'ex-srv1']

E não se esqueça de excluir as linhas que começam com o símbolo de hash:

  exclude_lines: ['^#']

Assim, o bloco de leitura dos logs ficará assim:

filebeat.inputs:
- type: log
  enabled: true
  paths:
	- C:inetpublogsLogFilesW3SVC1*.log
	- C:inetpublogsLogFilesW3SVC2*.log
  multiline:
	pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}'
	negate: true
	match: after
  tags: ['IIS', 'ex-srv1']
  exclude_lines: ['^#']

Bloco de envio de logs

Registros individuais no arquivo de log do filebeat são enviados como objetos json, nos quais uma gravação específica do log está contida em um único campo message. Se quisermos trabalhar com essas informações de alguma forma, precisamos primeiro analisar esse campo em campos separados. Isso pode ser feito, por exemplo, no logstash. Ele será o receptor das gravações do filebeat. Veja como isso pode parecer no arquivo de configuração do filebeat:

output.logstash:
  hosts: ["logstash1.domain.com:5044"]

Se houver vários servidores, você pode habilitar o balanceamento: assim, o filebeat não enviará logs apenas para o primeiro servidor disponível da lista, mas distribuirá os logs enviados entre vários servidores:

hosts: ["logstash1.domain.com:5044", "logstash2.domain.com:5044"]
  loadbalance: true 

O Filebeat, ao processar logs no json enviado, além do registro do log, que está no campo message, adiciona algumas metadatas que afetam o tamanho do documento que vai para o elastic. Essas metadatas podem ser opcionalmente removidas do envio. Isso é feito no bloco processor usando o processador drop_fields. É possível excluir, por exemplo, os seguintes campos:

processors:
- drop_fields:
	fields: ["agent.ephemeral_id", "agent.hostname", "agent.id", "agent.type", "agent.version", "agent", "ecs.version", "ecs", "input.type", "input", "log.offset", "version"]

É necessário ter cuidado ao selecionar os campos a serem excluídos, pois alguns deles podem ser utilizados no lado do elastic para a construção de índices.

Assim, o bloco de envio de logs ficará assim:

output.logstash:
  hosts: ["logstash1.domain.com:5044", "logstash2.domain.com:5044"]
  loadbalance: true
 
processors:
- drop_fields:
	fields: ["agent.ephemeral_id", "agent.hostname", "agent.id", "agent.type", "agent.version", "agent", "ecs.version", "ecs", "input.type", "input", "log.offset", "version"]

Configurações de log do filebeat

Faz sentido definir as seguintes configurações de log:

  • Nível de log info;
  • Gravar logs em arquivos localizados por padrão (diretório logs, na pasta de instalação do filebeat);
  • Nome do arquivo de log — filebeat;
  • Armazenar os últimos 10 arquivos de log;
  • Realizar rotação ao atingir o tamanho de 1MB.

A configuração final do registro ficará assim:

logging.level: info
logging.to_files: true
logging.files:
  name: filebeat
  keepfiles: 10
  rotateeverybytes: 1048576

Configuração final

Reunimos a configuração e agora ela se apresenta da seguinte forma:

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - C:inetpublogsLogFilesW3SVC1*.log
    - C:inetpublogsLogFilesW3SVC2*.log
  multiline:
    pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}'
    negate: true
    match: after
  tags: ['IIS', 'ex-srv1']
  exclude_lines: ['^#']
 
output.logstash:
  hosts: ["logstash1.domain.com:5044", "logstash2.domain.com:5044"]
  loadbalance: true
 
processors:
- drop_fields:
    fields: ["agent.ephemeral_id", "agent.hostname", "agent.id", "agent.type", "agent.version", "agent", "ecs.version", "ecs", "input.type", "input", "log.offset", "version"]
 
logging.level: info
logging.to_files: true
logging.files:
  name: filebeat
  keepfiles: 10
  rotateeverybytes: 1048576

É importante entender que o formato do arquivo de configuração é yml. Portanto, é crucial definir corretamente os espaços e os sinais de menos.

O Filebeat pode verificar o arquivo de configuração e, se a sintaxe contiver erros, indicará em qual linha e em que parte da linha a sintaxe está incorreta. A verificação é realizada da seguinte forma:

.filebeat.exe test config

Além disso, o filebeat consegue verificar a acessibilidade de rede do receptor de logs. A verificação é iniciada assim:

.filebeat.exe test output

Nas próximas partes, falarei sobre a conexão e a interação do Exchange com os componentes Logstash e Kibana.

Links Úteis

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster