Monitorare la propria rete di server con Splunk

Al crescere del numero di server che si gestiscono, cresce anche la necessità di utilizzare dei software di monitoraggio centralizzato, che permettano in ogni momento di avere sotto controllo lo stato della propria rete. I server Linux (ma il discorso può essere esteso in generale ai maggiori sistemi operativi) salvano una notevole quantità di informazioni vitali per monitorare la salute dei servizi e del server stesso nei file di log. In Ubuntu Linux la cartella /var/log e le sue sottocartelle contengono una quantità notevole di file di log generati dai principali processi di sistema. I file di log sono dei semplici file di testo strutturati, e se da una parte è vero che la quantità e la qualità delle informazioni che essi racchiudono è notevole, dall'altra è anche vero che tali informazioni non sono sempre di facile lettura o reperibilità. Questo sulla singola macchina, proviamo ora a pensare a cosa vorrebbe dire consultare manualmente i log su una decina di macchine differenti. Un'operazione di certo non agevole.

Diversi sono gli strumenti gratuiti e non disponibili in rete. Ci sono anche sistemi di monitoraggio online che permettono di tenere sotto controllo il proprio server; alcuni offrono un client da installare in locale, altri invece necessitano la configurazione di syslog-ng o rsyslog.
Di cosa avevamo bisogno. Anzitutto di un qualcosa di gratuito. Come seconda cosa ci serviva un sistema che fosse pronto in breve tempo e semplice da installare sulle macchine da monitorare. Non avevamo intenzione di passare un paio di giorni a configurare script e file di testo. Infine, qualcosa che fosse flessibile, ricco di funzionalità e ben documentato.

Di certo non poche pretese.

[filefield-description]

Splunk (di cui qui sopra vediamo la pagina iniziale dell'interfaccia web) era esattamente quello che ci serviva. Una versione gratuita comunque sufficiente per le nostre esigenze. Installazione facile e gestione completa con interfaccia web. Stessa installazione come client, ma possibilità di utilizzare come input rsyslog o syslog-ng od altre sorgenti che possano utilizzare protocollo TPC/UDP. Versioni per la maggior parte dei sistemi operativi presenti sul mercato. Una documentazione molto buona ed una comunità di utenti ben disposta a fornire supporto.

Ma la caratteristica più interessante è il funzionamento: Splunk è un'applicazione sviluppata in phyton, basata su di un motore di ricerca che permette di selezionare, aggregare e visualizzare i dati con report in tempo reale altamente personalizzabili. Se mi interessasse ad esempio trovare gli errori generati dall'applicazione miaapplicazione sul sever mioserver e generare un report automatico che mi tenga monitorato lo stato degli errori, con Splunk potrei farlo in pochi secondi, semplice come ricercare i termini "mioserver miaapplicazione error":

[filefield-description]

Esistono poi decine di estensioni, chiamate Apps (facendo un po' il verso ad Apple) che non sono altro che report e script di aggregazione dati preconfigurati che è possibile installare con un semplice click direttamente dall'interfaccia web. Le immagini che vediamo qui sopra e qui sotto sono la pagina di ricerca ed il report dell'utilizzo memoria dell'apps *nix specifica per sistemi Unix ed in generale linux.

[filefield-description]

Vi premetto che l'installazione e la configurazione della macchina di monitoraggio, con monitoraggio attivo ha richiesto in tutto non più di un paio d'ore, cosa non da poco se prendiamo in considerazione che era la prima volta che provavamo il sistema (ok, ci sono poi da prendere in considerazione le ore precedenti necessarie per leggere tutta la documentazione, ma vi assicuro che nell'arco di una mezza giornata potrete avere installato e funzionante il vostro server Splunk ed il sistema di monitoraggio deploiato su di una decina server).

Come accennavo, installare è un gioco da ragazzi. Come prima cosa è necessario registrarsi sul sito, dopo di chè sarà possibile scaricare la versione corretta per il proprio sistema operativo e hardware.

Abbiamo preso un nuovo nodo su Linode, una macchina con 1024 mega di RAM a 32bit. Le specifiche minime per Splunk sono di una macchina con almeno 1GB di RAM, ma questo dipende dalla quantità di dati che verranno aggregati; si potrebbe riuscire a far girare Splunk anche su di una macchina dedicata con solo 512MB di RAM, ma moltro probabilmente si verificheranno dei crash in caso di un'elevata quantità di dati da analizzare.

Abbiamo installato Ubuntu LTS 10.04, effettuato gli aggiornamenti ed installato un po' di applicazioni accessorie tra cui il server web Apache. Tempo impiegato, 10 minuti in toto, compreso l'acquisto della VPS.

Nella nuova macchina che fungerà da server di monitoraggio, abbiamo scaricato la versione di Splunk adatta, nel nostro caso, splunk-4.1.6-89596-linux-2.6-intel.deb.

Scaricato il file, si può procedere all'installazione utilizzando il comando:

root@lin-xxx[SPLUNK]:~# dpkg -i splunk-4.1.6-89596-linux-2.6-intel.deb
Selecting previously deselected package splunk.
(Reading database ... 24977 files and directories currently installed.)
Unpacking splunk (from splunk-4.1.6-89596-linux-2.6-intel.deb) ...
Setting up splunk (4.1.6-89596) ...

----------------------------------------------------------------------
Splunk has been installed in:
        /opt/splunk

To start Splunk, run the command:
        /opt/splunk/bin/splunk start


To use the Splunk Web interface, point your browser at:
        http://lin-xxx:8000

Complete documentation is at http://www.splunk.com/r/docs
----------------------------------------------------------------------

root@lin-xxx[SPLUNK]:~#

Si noti che abbiamo utilizzato l'utente root per eseguire Splunk. Questo permetterà al programma di avere accesso a tutti i file di log e di configurazione presenti nel sistema. Abbiamo scelto questa soluzione sia per l'installazione di Splunk come server che per le installazioni come client.

Ci occuperemo successivamente di proteggere il server di monitoraggio utilizzando un firewall ed impostando una password di accesso all'interfaccia web.

E' possibile abilitare l'esecuzione automatica all'avvio con il comando:

root@lin-xxx[SPLUNK]:~# /opt/splunk/bin/splunk enable boot-start
SPLUNK SOFTWARE LICENSE AGREEMENT
...
Do you agree with this license? [y/n]: y

Al primo avvio di Splunk verrà chiesto di accettare la licenza d'uso e verranno effettuate alcune operazioni iniziali di configurazione. Per utilizare in modo comodo la linea di comando, potrebbe essere consigliato creare un link simbolico, inserendo l'eseguibile nel path di sistema:

ln -s /opt/splunk/bin/splunk /usr/bin/splunk

A questo punto è possible avviare splunk:

root@lin-xxx[SPLUNK]:~# splunk start

Il sistema è ora pronto ed è possibile accedere all'interfaccia web di configurazione. Supponendo il nostro server di monitoraggio sia raggiungibile all'indirizzo http://splunk.miodomino.com, potremmo iniziare a configurare Splunk aprendo puntando il browser all'indirizzo http://splunk.miodomino.com:8000. Ci si può loggare utilizzando i valori predefiniti admin / changeme:

[filefield-description]

Le licenze di Splunk non sono economiche; Splunk è un sistema di monitoraggio di livello enterprise, quindi vi lascio immaginare i possibili costi. La prima cosa quindi che abbiamo effettuato è stata quella di attivare sin da subito la versione free, cliccando su Manager » License e quindi "switch to a free license". Al termine sarà necessario riavviare Splunk.

[filefield-description]

La versione free di splunk ha un grosso limite, ovvero l'accesso all'interfaccia web non è protetto da password. Bella seccatura, dato che non possiamo di certo lasciare visibile a tutti il contenuto dei file di log o dei file di configurazione delle macchine monitorate. Come prima cosa, possiamo provvedere a modificare le porte di default (in Manager » System settings » General settings):

[filefield-description]

Abbiamo modificato le porte di default sia per la porta di management (predefinita 8089) che per la porta web, predefinita 8000. Sarà ovviamente necessario utilizzare porte libere e non già utilizzate.

Per applicare le modifiche alle porte di Splunk, sarà necessario riavviare Splunk stesso.

Se il nostro server lo supporta, possiamo inoltre attivare la protezione SSL.

Tutto questo tuttavia non è sufficiente, in quanto comunque tutti i nostri dati aggregati risultano accessibili dall'esterno: basta individuare la porta giusta. Un modo per ovviare al problema c'è. E' infatti sufficiente configurare Apache come reverse proxy verso la porta in cui è in ascolto Splunk, nel nostro caso verso  (dettagli su Splunk Free: .htaccess Protection using Apache).

Per Ubuntu 10.04 LTS è stato sufficiente aggiungere il file  /etc/apache2/sites-available/splunk.monitor con la seguente configurazione:

<virtualhost *:80>
  ServerAdmin admin@mail
  ServerAlias splunk.miodomino.com
  ProxyPass / http://127.0.0.1:9731/
  ProxyPassReverse / http://127.0.0.1:9731/
</virtualhost>

<proxy http://127.0.0.1:9731/*>
  Order deny,allow
  Deny from all
  Allow from all
  AuthName "Splunk Monitor facility"
  AuthType Basic
  AuthUserFile /etc/apache2/.apachepasswd
  AuthGroupFile /dev/null
  Require user splunk
</proxy>

Quindi creare la password per l'utente splunk con il comando:

root@lin-xxx[SPLUNK]:~# htpasswd /etc/apache2/.apachepasswd mia_password

Quindi abilitare splunk.monitor con il comando:

root@lin-xxx[SPLUNK]:~# a2ensite splunk.monitor

Abilitare il supporto proxy di Apache:

root@lin-xxx[SPLUNK]:~# a2enmod proxy proxy_http proxy_connect

E infine riavviare Apache:

root@lin-xxx[SPLUNK]:~# service apache2 restart

In pratica connettendosi alla porta 80 del nostro server, quindi ad Apache, si viene reindirizzati alla porta 9731 dove è in ascolto Splunk. L'accesso sarà tuttavia protetto dalla password impostata su Apache. Si noti che connettendosi direttamente alla porta 9731, sarà possibile bypassare Apache, dovremmo quindi assicurarci di chiudere con il firewall tutte le porte necessarie. Alla fine dell'articolo mostrerò come configurare Ubuntu Uncomplicated Firewall (ufw).

Aggiungere dei dati

Per iniziare a raccogliere i dati, è necessario aggiungere le fonti da cui raccoglierli. Se ad esempio si desidera monitorare tutto il contenuto della cartella con i file di log di Ubuntu presente nel sistema, è sufficiente aggiungere alle fonti la cartella /var/logs, come mostrato (Manager » Data inputs » Files & Directories):

[filefield-description]

I dati posso essere raccolti oltre che da file di log o di sistema presenti sul disco della macchina, anche con l'utilizzo di specifici script, che restituiscono in tempo reale informazioni quali ad esempio lo stato della RAM, l'utilizzo della CPU, le connessioni ec... Come accennavo in precedenza, esistono delle estensioni per Splunk (chiamate Apps) che aggiungono in modo automatico script e fonti su disco all'input dei dati. Per sistemi operativi Linux e più in generale Unix, l'estensione chiamata *nix è senza d'ubbio un must.

Ma oltre che dalla macchina corrente in cui è installato Splunk, i dati possono essere raccolti da altre installazioni di Splunk su macchine different.

"Client e server"

Splunk può essere installato sostanzialmente in due modalità: come server di monitoraggio con aggregazione ed analisi dei dati tramite l'interfaccia web, e come semplice forward (ne esistono 2 modalità, normale, provvista di interfaccia web, e light, sprovvista di interfaccia web). La modalità di forwarding è una sorta di sorta di client limitato all'invio dei dati e rispetto alla versione completa richiede decisamente meno risorse di sistema, e risulta quindi utilizzabile anche su macchine non dedicate. C'è da dire che è possibile anche utilizzare syslog-ng o rsyslog per inviare i dati al server Splunk centrale, utilizzando i protocolli TCP e UDP, oppure far eseguire via SSH degli script in remoto sulla macchina da monitorare (vedi Remote System Monitoring (without using a Forwarder from Splunk) ,but works with the *nix App).

La procedura più rapida è ovviamente quella di installare Splunk su tutte le macchine che desideriamo monitorare, utilizzare l'interfaccia web per tutte le operazioni di configurazione, e quindi selezionare l'opzione "Enable light forwarding" che trasforma Splunk in una sorta di versione "client".

Prima di fare questo è necessario mettere "in ascolto" il server Splunk, in modo che possa iniziare a raccogliere i dati inviati dai vari client Splunk. Anche questa è un'operazione decisamente semplice, che possiamo effettuare via web, nella sezione Manager » Forwarding and receiving » Receive data. Si tratta di creare una nuova porta alla quale mettere in ascolto Splunk e alla quale far spedire i dati dai vari client:

[filefield-description]

In questo caso abbiamo messo in ascolto Splunk alla porta 8939. Sarà necessario riavviare Splunk per abilitare la modifica.

Sul singolo client, ovvero sull'installazione di Splunk nella macchina che desideriamo monitorare, ci limiteremo a configurare un nuovo  forwarding in Manager » Forwarding and receiving » Forward data » Add New:

[filefield-description]

Facendolo puntare all'indirizzo IP ed alla porta del nostro server Splunk in precedenza configurato. Al riavvio, il client Splunk inizierà ad inviare i dati al server Splunk per l'aggregazione.

Terminata la configurazione del client, conviene attivare la modalità "light forwarding", che disabilita l'aggregazione dei dati in locale su database e disabilita l'interfaccia web:

[filefield-description]

Nel caso volessimo procedere ad una nuova configurazione del client, sarà sufficiente riattivare da linea di comando la comoda interfaccia web:

root@lin-xxx[SPLUNK]:~# splunk enable webserver && splunk restart 

Utilizzare il browser per fare le modifiche che ci servono, e quindi disattivare nuovamente l'interfaccia web:

root@lin-xxx[SPLUNK]:~# splunk disable webserver && splunk restart

Alcune considerazioni

In termini di sicurezza, soprattutto con la versione free, è necessario configurare opportunamente il firewall per garantire la riservatezza dei dati raccolti da Splunk. Utilizzando il metodo del reverse proxy di Apache segnalato sopra, sarà necessario chiudere tutte le porte dall'esterno. Con Uncomplicated Firewall è piuttosto semplice. Qui vediamo una semplice configurazione di Uncomplicated Firewall:

root@splunksrv:~# ufw status
Status: active

To                         Action      From
--                         ------      ----
Apache                     ALLOW       Anywhere
OpenSSH                    ALLOW       Anywhere
9731/tcp                   DENY        Anywhere
8939/tcp                   ALLOW       192.168.163.11
8939/tcp                   ALLOW       192.168.163.12

root@splunksrv:~#

Nell'esempio illustrato, oltre ad Apache ed a SSH è stata aperta solo la porta 8939 selettivamente per due indirizzi IP. Questo consente di inviare dati al nostro server solo alle macchine che sono all'indirizzo IP specificato. La regola che nega l'accesso alla porta 9731 in realtà è superflua, in quanto di base, al momento della configurazione di ufw tutte le porte sono state chiuse, tuttavia è stata inserita come promemoria, per ricordare a quale porta è in ascolto il webserver di Splunk.

Per maggiori informazioni su Uncomplicated Firewall, vi rimando alle diverse guide disponibili in rete.

Splunk effettua la ricerca e l'aggregazione dei dati raccolti in tempo reale, quindi nel caso di una quantità di dati molto elevata, potrebbe essere necessario potenziare le caratteristiche hardware della macchina che ospita il server, pena il non poter usufruire delle interessanti caratteristiche di Splunk.

Infine delle considerazioni in termini di trasmissione dati e risorse di banda. La raccolta di dati al server Splunk potrebbe in breve tempo creare dei problemi con la banda disponibile in alcuni piani di hosting VPS. Per questo quindi conviene, ove previsto dal sistema di hosting, utilizzare la LAN e gli indirizzi IP privati per inviare e ricevere i dati dai client ed al server Splunk.

Ad esempio con Linode.com è possibile attivare per ciascuna VPS un indirizzo IP privato che utilizza la LAN per trasmettere i dati tra le diverse macchine e che quindi non va a pesare sul traffico mensile disponibile. Tale indirizzo sarà visibile soltanto tra le VPS di Linode presenti nella stessa farm, ma tutto il traffico che transiterà su questi IP non sarà contabilizzato nel conto della banda mensile disponibile.

Questo mio articolo non vuole di certo essere una guida comprensiva all'utilizzo ed all'installazione di Splunk; mi premeva piuttosto fare un resoconto a 360° su quest'ottimo strumento di monitoraggio che ha i suoi pro (immediatezza e facilità di installazione e d'uso) ed i suoi contro (ad esempio pensantezza in termini di risorse), cercando di mostrare alcune delle interessanti potenzialità di questo strumento.

Manager » Data inputs » Files & Directories