App Cloud

Costruisci lo stack ELK con Elasticsearch

Abbiamo lanciato il nostro nuovissimo servizio Elasticsearch su Swisscom Application Cloud (in versione beta chiusa al momento in cui scriviamo, ma la disponibilità generale è imminente). Questo servizio sostituisce la nostra vecchia offerta ELK con opzioni più stabili e flessibili. In questo post ti mostreremo come utilizzare Elasticsearch insieme ai buildpack Logstash e Kibana per ottenere lo stack ELK che già conosci. Ti daremo anche alcuni spunti su come utilizzare la maggiore flessibilità dell'offerta per personalizzare lo stack in base alle tue esigenze.

Creare l'istanza del servizio

Inizieremo creando un'istanza del nuovo servizio Elasticsearch. Se dai un'occhiata al nostro marketplace, vedrai che ci sono sei piani diversi tra cui scegliere, che vanno da xxsmall* a xlarge*. Queste dimensioni indicano il quantitativo di RAM che la tua istanza Elasticsearch riceverà e, a seconda di questo, l'importo dello spazio su disco. Per gli scopi del nostro tutorial, xxsmall* è sufficiente. Per il tuo stack ELK produttivo, avrai ovviamente bisogno di un piano più grande. Creiamo quindi l'istanza:

Questo fornirà un cluster Elasticsearch a tre nodi che coprirà tre siti. Successivamente, aggiungeremo Logstash e Kibana. La nostra vecchia offerta ELK includeva Logstash e Kibana con configurazioni cablate come parte dell'istanza del servizio. Con il nuovo approccio, questo non è più il caso. Al contrario, installiamo noi stessi questi due componenti utilizzando i buildpack di Logstash(apre una nuova finestra) e Kibana(apre una nuova finestra). Questi buildpack vengono utilizzati per spingere entrambi i componenti come applicazioni in Cloud Foundry, adottando la rispettiva configurazione specificata dall'utente in vari file di configurazione. Sebbene la configurazione sia un po' più complessa, ha il vantaggio di poter creare configurazioni personalizzate in modo del tutto naturale.

Installare Logstash

Nota bene: questa sezione è in fase di modifica per descrivere il nuovo modo di distribuire Logstash(apre una nuova finestra).

Quindi impostiamo la configurazione minima necessaria per eseguire il push di Logstash con il Logstash buildpack(apre una nuova finestra). Iniziamo con una nuova cartella

e creiamo i seguenti due file

Come di consueto in Cloud Foundry, scriviamo un manifest.yml per indicare alla piattaforma come configurare Logstash come app. Chiamiamo l'app my-logstash e ovviamente sarà legata alla nostra istanza Elasticsearch. Indichiamo inoltre a Cloud Foundry di utilizzare il buildpack di Logstash(apre una nuova finestra) con l'opzione buildpack.

Il file Logstash che abbiamo creato contiene anche le impostazioni di configurazione per Logstash. Se lasci questo file vuoto, Logstash verrà eseguito con le impostazioni predefinite. Nel nostro caso, vogliamo aggiungere l'autenticazione per proteggere la nostra istanza Logstash da accessi non autorizzati. Pertanto, aggiungiamo le seguenti righe a Logstash

Con questo passaggio, la nostra istanza di Logstash è pronta per essere distribuita, quindi la spingiamo.

Una volta completato il push, abbiamo un'istanza Logstash funzionante collegata alla nostra istanza Elasticsearch. Ora facciamo lo stesso per Kibana.

Installazione di Kibana

Nota bene: questa sezione è in fase di modifica per descrivere il nuovo modo di distribuire Kibana(apre una nuova finestra).

Ricominciamo quindi da una nuova directory per preparare il nostro deployment di Kibana.

Aggiungiamo i seguenti due file a questa cartella per fornire la configurazione minima

Includiamo il plugin X-Pack nel file di configurazione di Kibana. Questo plugin fornisce il supporto per l'accesso autenticato di cui abbiamo bisogno per proteggere l'interfaccia utente di Kibana. Il plugin offre anche una serie di altre funzioni aggiuntive per Kibana e Logstash, che esulano dallo scopo di questo articolo.

In manifest.yml, specifichiamo che la nostra istanza di Kibana si chiama my-kibana, si connette alla nostra istanza di Elasticearch e riceve 3 GB di memoria per l'installazione del plugin X-Pack. In linea di principio, puoi ridurre l'istanza di Kibana a 2 GB dopo il primo utilizzo, poiché la memoria aggiuntiva non è più necessaria dopo l'installazione. Anche in questo caso, utilizziamo l'opzione buildpack per indicare a Cloud Foundry di utilizzare il buildpack di Kibana.

Ora possiamo continuare a far progredire Kibana.

Quando il push è completato, abbiamo finito di configurare tutti i componenti necessari. Possiamo verificare la configurazione inserendo i seguenti dati

e verifichiamo se possiamo vedere l'istanza Elasticsearch e i binding dell'app a my-logstash e my-kibana.

Collegare lo stack alla tua applicazione

Successivamente, vogliamo inoltrare i log dell'applicazione al nostro stack ELK appena creato. A tal fine, creiamo un servizio personalizzato con l'opzione -l. Con questa opzione, le applicazioni che si legano al servizio possono inoltrare i loro log a un componente compatibile con syslog, nel nostro caso Logstash.

Nell'ultimo passaggio, leghiamo questo servizio fornito dall'utente all'app da cui vogliamo raccogliere i log e ripristiniamo l'app.

Abbiamo terminato la configurazione di base dei nostri componenti ELK. Prima di continuare con il resto della configurazione, facciamo un primo rapido test accedendo a Kibana. In questo esempio, l'URL dell'istanza di Kibana è my-kibana.scapp.io. Otteniamo i dati di login dalla variabile d'ambiente VCAP_SERVICES della nostra applicazione Kibana

e cerca i campi full_access_username e full_access_password

Dopo aver effettuato il login, ci viene chiesto di creare un modello di indice iniziale. Al momento abbiamo solo un indice logstash tra cui scegliere (assicurati di aver attivato un po' di traffico di log dalla tua applicazione per vederlo).

Possiamo specificare uno schema per indicare a Kibana quale indice o quali indici utilizzare per la visualizzazione dei dati. Se inserisci *, verranno utilizzati tutti gli indici. Se inserisci logstash-*, verranno utilizzati gli indici il cui nome inizia con logstash-. Se specifichiamo un modello di indice, possiamo anche dire a Kibana quale campo dei dati deve essere utilizzato per ordinare i record nel tempo. Possiamo sempre scegliere @timestamp, un campo che viene aggiunto automaticamente da Elasticsearch. In alternativa, possiamo scegliere un campo più appropriato da aggiungere ai nostri dati come parte della nostra configurazione di Logstash. Per questo esempio, scegliamo @timestamp.

Ora possiamo navigare nella schermata Discover di Kibana e verificare se sono presenti voci di registro dall'app che abbiamo vincolato.

Tuttavia, quando guardiamo le voci di registro, ci rendiamo conto che non sono ancora strutturate come nel vecchio servizio ELK. Il campo del messaggio contiene fondamentalmente l'intero messaggio non analizzato. A seguire, vedremo quali parti della configurazione dobbiamo modificare per ottenere la stessa elaborazione dei messaggi di log del vecchio ELK.

Opzioni di configurazione

Il vecchio servizio ELK aveva un filtro che analizzava i messaggi di log e

C'era anche una configurazione di Curator(apre una nuova finestra) che assicurava la pulizia di Elasticsearch a intervalli regolari. Descriveremo i dettagli della configurazione di Curator in un prossimo post.

Prima di iniziare con la configurazione del filtro, devi sapere che puoi trovare i modelli dei file di configurazione elencati di seguito su Github(apre una nuova finestra). Si tratta di modelli perché devi sostituire alcuni parametri, come l'hostname Elasticsearch della tua istanza e le credenziali, con i valori corrispondenti del tuo ambiente.

Per configurare il nostro nuovo stack ELK in modo che elabori i log nello stesso modo del vecchio ELK, dobbiamo selezionare la modalità di configurazione mista descritta nella documentazione del buildpack Logstash(apre una nuova finestra). Prima di tutto, dobbiamo definire la nostra configurazione di filtri e output. A questo scopo, aggiungiamo due nuove sottodirectory conf.d e grok-patterns alla directory in cui abbiamo impostato la nostra configurazione di Logstash. Aggiungiamo anche i file filter.conf, output.conf e grok-patterns a queste directory come segue:

In filter.conf, definiamo un filtro personalizzato che esegue il parsing di syslog e JSON. Questo file deve quindi contenere le seguenti righe:

Questa definizione di filtro si riferisce a un modello di grok che deve essere presente nel file grokpatterns:

Lo schema grok sopra riportato separa il prefisso standard di una riga di log di Cloud Foundry nei campi corrispondenti della specifica syslog.

Come nel vecchio ELK, vogliamo dividere l'indicizzazione in due indici separati, uno per i messaggi analizzati e uno per i messaggi che non sono stati analizzati dal filtro precedente. A tal fine, il file output.conf contiene le seguenti righe:

I valori HOST, USER e PASSWORD devono corrispondere a host, full_access_username e full_access_password della voce elasticsearch in VCAP_SERVICES di my-logstash.

Poiché siamo in modalità di configurazione mista del buildpack di Logstash e specifichiamo le nostre definizioni di filtro e di output, dobbiamo fare riferimento esplicito alla definizione di input standard nel file di Logstash:

Dobbiamo spingere nuovamente Logstash affinché queste modifiche abbiano effetto.

Se attiviamo un po' di traffico di log e poi torniamo a Kibana, possiamo vedere che ci sono due nuovi indici in Elasticsearch se andiamo in Amministrazione > Modelli di indice > Crea modelli di indice. Il nome del primo inizia con parsed-. Questo è l'indice che conterrà tutti i messaggi analizzati dal filtro che abbiamo appena scritto. Il nome del secondo indice inizia con unparsed-. Contiene tutti i messaggi che non sono stati analizzati dal filtro. Con pochi passaggi di configurazione abbiamo ottenuto il comportamento del vecchio servizio ELK. E se volessi migrare alcuni indici da una vecchia istanza ELK al nuovo Elasticsearch? Vediamo come fare.

Migrazione dal vecchio servizio ELK

Utilizzeremo l'utility elasticdump(apre una nuova finestra) per migrare gli indici da un vecchio ELK a una nuova istanza Elasticsearch. Per installare elasticdump, eseguiamo

Successivamente, dobbiamo impostare i tunnel ssh per il nostro vecchio ELK e per il nostro nuovo Elasticsearch. Dobbiamo assicurarci che entrambi i servizi siano collegati ad almeno un'app nello spazio in cui stiamo lavorando, in modo che vengano creati i gruppi di sicurezza appropriati in Cloud Foundry e che sia possibile accedere a entrambi i servizi da quello spazio. Se la connessione viene rifiutata la prima volta, prova a riavviare la tua applicazione in modo che vengano applicate le ultime impostazioni dei gruppi di sicurezza. Ora dobbiamo raccogliere una serie di parametri per impostare i tunnel. Iniziamo con la vecchia istanza ELK. Esamineremo l'ambiente di un'applicazione a cui questa istanza è legata:

In VCAP_SERVICES troviamo l'host, la porta e i dati di login per ELK

Continuiamo con la nuova istanza Elasticsearch. Esaminiamo nuovamente l'ambiente di un'applicazione a cui questa istanza è legata

e prendiamo nota dell'host e dei dati di accesso da VCAP_SERVICES.

Ora possiamo configurare il tunnel con una delle app presenti in quest'area (non importa quale).

Poiché Elasticsearch controlla il nome dell'host per le richieste HTTP in arrivo e lo confronta con i nomi dei cluster, dobbiamo impostare la risoluzione locale dei nomi in /etc/hosts in modo che sia l'host di ELK che quello di Elasticsearch siano risolti in localhost. Aggiungiamo quindi le due righe seguenti a /etc/hosts

Non appena il tunnel e la risoluzione dei nomi sono stati configurati, possiamo utilizzare una semplice richiesta HTTP per verificare quali indici sono disponibili nell'istanza ELK.

Otteniamo un output nella forma seguente, che elenca tutti gli indici

Con elasticdump, ora possiamo migrare gli indici singolarmente al nostro nuovo Elasticsearch o scrivere uno script che li migri tutti. Per gli indici creati in passato, la migrazione può essere effettuata durante il normale funzionamento. Quindi puoi importare gradualmente i vecchi indici da ELK mentre il tuo nuovo Elasticsearch è già in funzione e riceve nuovi dati di log. Supponiamo che tu voglia importare l'indice parsed-2018.04.09 da ELK a Elasticearch. Per farlo, devi eseguire i due comandi seguenti

Se ora accedi all'istanza di Kibana a cui è legato il nuovo Elasticsearch, vedrai parsed-2018.04.09 come uno degli indici.

Conclusione

Ecco fatto! In questo post ti abbiamo mostrato come configurare lo stack ELK basato sulla nuova offerta Elasticsearch, compresi i buildpack Logstash e Kibana. Ti abbiamo anche mostrato come personalizzare la configurazione del nuovo buildpack Logstash per simulare le impostazioni del vecchio servizio ELK. Infine, ti abbiamo mostrato come migrare gli indici da un vecchio ELK a una nuova istanza Elasticsearch. Questo nuovo modo di impostare lo stack ELK ti permette anche di condividere un'istanza ELK con più organizzazioni e spazi. Questo ti permette di combinare i log di diversi progetti e fasi di sviluppo (e di risparmiare denaro). Speriamo che la nostra nuova offerta Elasticsearch ti piaccia. Facci sapere cosa ne pensi!

Mathis Kretz

Mathis Kretz

Senior Data and Analytics Consultant

Altri articoli getIT

Pronti per Swisscom

Trova il posto di lavoro o il percorso di carriera che fa per te. Dove dare il tuo contributo e crescere professionalmente.

Ciò che tu fai, è ciò che siamo.

Vai ai percorsi di carriera

Vai alle posizioni vacanti cibersicurezza