In questo blog ho ampiamente discusso del mio MNS preferito (Nagios), mostrandone le diverse modalità di utilizzo e pubblicando, con una certa frequenza, alcuni plugin (da me realizzati) in grado di tenere sotto controllo un determinato servizio attivo su uno o più dispositivi.
Occorre precisare, però, che fin’ora ho discusso solo ed esclusivamente dei cosiddetti check attivi, ovvero quelli che vengono inizializzati dall’NMS ad intervalli di tempo specifici (di default ogni 5 minuti). Tale configurazione è più che sufficiente nella stragrande maggioranza dei casi, ma ovviamente esistono delle ecezioni.
Una di queste riguarda, ad esempio, la presenza di un firewall tra Nagios ed il server da tenere sotto controllo, il quale potrebbe bloccare i tentativi di connessione diretti verso quest’ultimo. Un’altra, invece, potrebbe riguardare l’individuazione di eventi totalmente asincroni (ad esempio le trap SNMP oppure i security alert), i quali, per loro natura, non possono essere collezionati mediante del semplice polling.
Per configurare in modo corretto i check passivi, occorre utilizzare alcuni elementi indispensabili:
1) Un tool da integrare a Nagios (NRDP Server) in grado di riconoscere gli eventi generati dai dispositivi monitorati e di girarli all’NMS;
2) Un client (NRDP Client per i sistemi *nix oppure NSCA Client per i sistemi Windows), il cui compito è quello di inviare gli eventi all’NMS.
Logica di funzionamento
NRDP Server è una Web applicaiton sviluppata in PHP, contattabile utilizzando il protocollo HTTP (o, in alternativa, HTTPS). Essa rimane in ascolto su una specifica porta (solitamente la TCP 80, ma dipende dalla configurazione dei Web server), in attesa degli eventi generati dai client NRDP. Nella fattispecie, anche in quest’ultimo caso, parliamo di uno scrip PHP il cui scopo è quello di generare un codice XML (in base ai parametri che gli vengono dati in pasto), da inoltrare al server. A questo punto, dopo aver ricevuto l’evento, il server NRDP popolerà il file nagios.cmd con una stringa che reca il seguente formato:
PROCESS_SERVICE_CHECK_RESULT;host;servicedescription;checkresult;output
ad esempio:
PROCESS_SERVICE_CHECK_RESULT;mysql-server1;test;1;questo è un evento di test
In seguitò verrà generato un file temporaneo all’interno della directory /var/log/nagios/spool/checkresults, il quale verrà poi processato da Nagios per l’aggiornamento dello status del servizio interessato.
Installazione e configurazione di NRDP Server
Per prima cosa scarichiamo il suddetto applicativo e scompattiamo l’archivio:
[root@linuxbox ~]# cd /usr/local [root@linuxbox ~]# wget https://assets.nagios.com/downloads/nrdp/nrdp.zip [root@linuxbox local]# unzip nrdp.zip [root@linuxbox local]# chown -R nagios:nagios /usr/local/nrdp
Creiamo quindi la directory in cui Nagios dovrà salvare i file temporanei (/var/log/nagios/spool/tmp):
[root@linuxbox local]# mkdir /var/log/nagios/spool/tmp [root@linuxbox local]# chown apache:nagios /var/log/nagios/spool/tmp [root@linuxbox local]# chmod 770 /var/log/nagios/spool/tmp
Inoltre, poichè NRDP Server gira grazie ad un Web server opportuno (ad esempio Apache), è necessario fare in modo che nella directory /var/log/nagios/spool/checkresults/ (in cui Nagios salverà i risultati dei check attivi e passivi utilizzando dei file temporanei), Apache abbia i diritti di lettura e scrittura:
[root@linuxbox local]# chown apache:nagios /var/log/nagios/spool/checkresults [root@linuxbox local]# chmod 770 /var/log/nagios/spool/checkresults
A questo punto possiamo dedicarci alla configurazione vera e propria di NRDP Server, editando il file /usr/local/nrdp/server/config.inc.php.
Di seguito riporto quella da me utilizzata:
$cfg['authorized_tokens'] = array( "vostrotoken", ); $cfg["nagios_command_group"]="nagios"; // full path to Nagios external command file $cfg["command_file"]="/var/spool/nagios/cmd/nagios.cmd"; // full path to check results spool directory $cfg["check_results_dir"]="/var/log/nagios/spool/checkresults"; // full path to directory where temp scratch files can be written // NOTE: the Apache user need to be able create files here, and the Nagios user needs to read/delete those same files, so the /tmp system directory won't work (it has a sticky bit on it) $cfg["tmp_dir"]="var/log/nagios/spool/tmp";
Passiamo ora alla configurazione di Apache, creando un file opportuno (nrdp.conf) all’interno della directory /etc/httpd/conf.d, il cui contenuto dovrebbe essere simile al seguente:
Alias /nrdp "/usr/local/nrdp/server" <Directory "/usr/local/nrdp"> Options None AllowOverride None Order allow,deny Allow from all Order deny,allow Deny from all Allow from <IP1> Allow from <IP2> Allow from <IP3> </Directory>
Come si può notare, ho consentito l’accesso alla suddetta pagina Web solo a determinati indirizzi IP (quelli di management e quelli dei server che devono inviare i check a Nagios/NRDP).
Ricarichiamo la configurazione di Apache per rendere effettive le suddette modifiche:
[root@linuxbox local]# service httpd reload
e finalmente NRDP Server dovrebbe essere attivo e funzionante. Per esserne sicuri al 100% conviene contattare la seguente URL:
http://IPNAGIOS/nrdp
e popolare il campo Token: con quello da noi inserito nella configurazione del server (config.inc.php), lasciando il campo Check Data: inalterato. Se entrambi i check vegnono processati correttamente da NRDP Server significa che il suddetto applicativo sta funzionando come dovrebbe.
Un consiglio: verificate che anche l’invio dei comandi via NRDP Server vada a buon fine (attraverso la sezione Submit Nagios Command:), in modo da scongiurare eventuali blocchi perpetrati da SElinux.
Installazione e configurazione di NRDP Client
Il primo step per mettere in funzione il suddetto client consiste nel copiarlo sui server da monitorare:
[root@linuxbox ~]# scp /usr/local/nrdp/client/send_nrdp.php root@serverdamonitorare:/usr/lib64/nagios/plugins
Una volta fatto ciò si può procedere con l’invio di un check di prova, utilizzando, ad esempio, la seguente sintassi:
[root@linuxbox ~]# /usr/bin/php send_nrdp.php --url=http://IPNAGIOS/nrdp --token="vostrotoken" --host="mysql-server" --state="1" --service="Test" --output="Questo è un evento di test"
Per una maggiore compatibilità con il sistema ospite, consiglio di modificare lo scrip send_nrdp.php, sostituendo il tag di apertura <? con <?php. Inoltre, se si vuole fare un pò di troubleshooting, conviene decommentare alcune parti di codice, ad esempio:
echo "XML=\n$xml\n";
linea 162;
echo "URL=$theurl\n";
linea 168;
echo "RESULT=\n"; print_r($result);
linee 177 e 178.
Configurazione di Nagios
Come ultimo passo procediamo con la creazione del servizio in grado di ricevere i check passivi, associandolo ad un determinato host.
Ad esempio:
define service{ use local-service host_name localhost service_description Test check_command check_passive passive_checks_enabled 1 active_checks_enabled 0 is_volatile 1 check_freshness 1 freshness_threshold 600 flap_detection_enabled 0 }
In particolare, ho abilitato le opzioni is_volatile, check_freshness e freshness_threshold. La prima serve a far generare un alert anche nel caso in cui vi sia solo una variazione dell’output restituito dal check (e non necessariamente un cambio di stato); la seconda serve a verificare che un determinato evento venga ricevuto entro un tempo limite (espresso in secondi), specificato mediante la terza direttiva, ovvero freshness_threshold.
Inoltre ho disabilitato la flap detection, poichè i check passivi possono cambiare stato molto frequentemente ed è mia intenzione tenere traccia (mediante alert) di tutti gli eventi.
Per ciò che concerne il comando check_passive (definito in /etc/nagios/objects/commands.cfg), esso presenta la seguente struttura:
# 'check_passive' command definition define command{ command_name check_passive command_line $USER1$/check_dummy 2 "No alerts received in 600 seconds" }
dove l’applicativo check_dummy non fa altro che restituire lo stato (in questo caso 2, ovvero CRITICAL), affiancato da un’opportuna descrizione (No alerts received in 600 seconds).
Ricarichiamo la configurazione di Nagios:
[root@linuxbox local]# service nagios reload
ed abbiamo finito. Alla prossima