Collegando ELK e Exchange. Parte 1

Collegando ELK e Exchange. Parte 1

Inizio una serie di articoli in cui voglio condividere la mia esperienza con la configurazione di Exchange e ELK. Questo stack aiuterà a gestire grandi volumi di log, senza doversi preoccupare di quale sia la dimensione oltre la quale gli strumenti di logging abituali smetteranno di aiutare. Scopriamo insieme questo nuovo alleato nella gestione dei log.

Exchange dispone di un sistema di logging piuttosto articolato. I log più richiesti sono i log di tracking, che monitorano il percorso dettagliato di una specifica email all'interno dell'organizzazione, i log del server web, che tracciano ogni nuova sessione utente nel sistema, e i log di applicazioni web specifiche con diversi livelli di dettaglio delle sessioni. Inoltre, Exchange può conservare i log grezzi dei protocolli smtp, imap e pop3.

Quali strumenti possiamo utilizzare per lavorare con i log:

  • Il cmdlet integrato Get-MessageTrackingLog: comodo per elaborare i log di tracking;
  • L'utilità logparser: utilizza un linguaggio pseudo-SQL per la ricerca dei log e funziona piuttosto rapidamente;
  • Un server SQL esterno: per casi particolarmente specifici (ad esempio, analisi dei dati su ampi intervalli temporali).

Tutto ciò funziona bene quando abbiamo un paio di server e il volume dei log da elaborare è misurato in decine o centinaia di gigabyte. Ma cosa succede se il numero dei server arriva a decine e la dimensione dei log supera il terabyte? Questo schema, molto probabilmente, inizia a presentare problemi.

Ecco cosa succede: Get-MessageTrackingLog comincia a fallire per timeout, logparser si scontra con il limite dell'architettura a 32 bit, e l'esportazione nel server SQL si blocca nel momento meno opportuno, non riuscendo a gestire una multiriga di eccezione dal servizio.

Qui entra in scena un nuovo attore: lo stack ELK, progettato per gestire enormi volumi di log in tempi ragionevoli con un consumo di risorse tollerabile.

Nella prima parte parlerò in dettaglio di come connettere filebeat, che fa parte dello stack ELK — È responsabile della lettura e dell'invio di file di testo semplici, in cui diverse applicazioni scrivono i loro log. Negli articoli successivi ci soffermeremo sui componenti Logstash e Kibana.

Installazione

Quindi, il file-archivio dell'agente filebeat può essere scaricato da questo sito.

Procederemo con l'installazione semplicemente estraendo il contenuto del file zip. Ad esempio, in c:Program Filesfilebeat. Poi è necessario eseguire lo script PowerShell. install-service-filebeat.ps1, incluso nella confezione, per installare il servizio filebeat.

Ora siamo pronti per iniziare a configurare il file di configurazione.

Affidabilità

Filebeat garantisce la consegna dei log al sistema di raccolta log. Questo avviene mantenendo un registro delle voci nei file di log. Nel registro si conserva l'informazione sulle voci lette dai file di log, segnando quelle che sono state consegnate con successo alla destinazione.

Se una voce non può essere consegnata, filebeat cercherà di inviarla nuovamente fino a quando non riceverà conferma di avvenuta consegna dal sistema ricevente o fino a quando il file di log originale non sarà eliminato durante il processo di rotazione.

Durante il riavvio del servizio, filebeat leggerà dal registro le informazioni sulle ultime voci lette e consegnate e continuerà a leggere le voci nei file di log in base alle informazioni contenute nel registro.

Questo permette di minimizzare il rischio di perdita di informazione sui log che devono essere inviati ai server elasticlogstash durante imprevisti e operazioni di manutenzione dei server.

Per maggiori dettagli, puoi leggere la documentazione nei paragrafi: Come mantiene Filebeat lo stato dei file e come garantisce la consegna almeno una volta?

Impostazione

Tutte le impostazioni vengono eseguite nel file di configurazione in formato yml, che è suddiviso in diverse sezioni. Esaminiamo alcune di esse che partecipano al processo di raccolta dei log dai server Exchange.

Blocco di elaborazione dei log

Il blocco di elaborazione dei log inizia con il campo:

filebeat.inputs:

Utilizzeremo uno strumento comune per la raccolta dei log:

- type: log

Successivamente, specifichiamo lo stato (attivato) e i percorsi della cartella contenente i log. Ad esempio, nel caso dei log IIS, le impostazioni potrebbero essere le seguenti:

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

Un'altra impostazione importante: come Filebeat deve leggere le voci multilinea. Per impostazione predefinita, Filebeat considera una riga del file di log come una singola voce. Questo funziona bene, finché i log non iniziano a ricevere eccezioni legate al malfunzionamento del servizio. In questo caso, le eccezioni possono consistere in più righe. Pertanto, Filebeat deve considerare una voce multilinea come una sola, se la riga successiva inizia con una data. Il formato delle voci di log in Exchange è tale che ogni nuova voce nel file di log inizia con una data. Nella configurazione, questa condizione appare nel seguente modo:

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

Ha senso aggiungere tag nel record inviato, per esempio:

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

E non dimenticare di escludere le righe che iniziano con il simbolo hash:

  exclude_lines: ['^#']

Quindi, il blocco di lettura dei log apparirà come segue:

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: ['^#']

Blocco di invio dei log

Filebeat invia le singole voci nel file di log come oggetto json, in cui una specifica voce del log è contenuta in un unico campo message. Se vogliamo lavorare con queste informazioni, dobbiamo prima analizzare questo campo in campi separati. Possiamo farlo, per esempio, in logstash. Questo sarà il destinatario dei record da filebeat. Ecco come potrebbe apparire nel file di configurazione di filebeat:

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

Se ci sono più server, si può abilitare il bilanciamento: in questo modo filebeat non invierà i log al primo server disponibile nell'elenco, ma distribuisce i log inviati tra diversi server:

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

Filebeat, durante l'elaborazione dei log, aggiunge al JSON inviato, oltre alla registrazione del log presente nel campo message, una certa quantità di metadati che influiscono sulla dimensione del documento inoltrato a Elastic. Questi metadati possono essere rimossi selettivamente dall'invio. Questo si fa nel blocco processor usando il processore drop_fields. È possibile escludere, ad esempio, i seguenti campi:

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"]

È importante selezionare con attenzione i campi da escludere, poiché alcuni di essi potrebbero essere utilizzati da Elastic per la creazione degli indici.

Quindi, il blocco di invio dei log apparirà come segue:

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"]

Impostazioni di logging di Filebeat

È utile impostare le seguenti configurazioni di logging:

  • Livello di logging info;
  • Registriamo i log in file, situati per impostazione predefinita (directory logs, nella directory di installazione di Filebeat);
  • Il nome del file di log è filebeat;
  • Conservare gli ultimi 10 file di log;
  • Avviare la rotazione al raggiungimento di una dimensione di 1MB.

Il blocco finale della configurazione del logging apparirà così:

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

Configurazione finale

Abbiamo raccolto la configurazione e ora appare come segue:

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 capire che il formato del file di configurazione è yml. Pertanto, è cruciale prestare attenzione agli spazi e ai segni meno.

Filebeat è in grado di verificare il file di configurazione e, se ci sono errori di sintassi, indicherà in quale riga e in quale punto della riga la sintassi è errata. Il controllo viene eseguito nel seguente modo:

.filebeat.exe test config

Inoltre, filebeat è in grado di verificare la disponibilità di rete del ricevitore dei log. Il controllo si avvia in questo modo:

.filebeat.exe test output

Nelle prossime parti parlerò della connessione e dell'integrazione di Exchange con i componenti Logstash e Kibana.

Link utili

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster