Monitorare un server con Munin e Monit
Attenzione. Questa guida è da considerarsi abbandonata, per via del tempo trascorso dall'ultima verifica.
Potrà essere resa obsoleta, previa segnalazione sul forum, se nessuno si propone per l'adozione. |
Versioni Compatibili Debian 6 "squeeze" Debian 7 "wheezy" |
ATTENZIONE Per Debian Stretch e successive si veda la guida aggiornata: Monitorare un server con Munin e Monit - Stretch |
Introduzione
In questa guida vedremo come monitorare un server Debian Wheezy attraverso gli strumenti munin e monit.
Munin è un tool che, con una veloce configurazione, è in grado di produrre grafici su parecchi aspetti del nostro server: load average, memory usage, CPU usage, MySQL throughput, eth0 traffic, etc.
Monit è un tool che controlla periodicamente lo stato di servizi come Apache, MySQL, Postfix e, in caso un servizio non si comporti come dovrebbe, prende le opportune contromisure.
La combinazione di questi due tool ci permette un completo monitoraggio delle risorse e dello stato del nostro server. Munin permette il monitoraggio di più host, ma in questa guida vedremo come installare una configurazione per un singolo host locale.
Installazione
L'installazione è una cosa di pochi minuti:
# apt-get install munin munin-node munin-plugins-extra
A installazione terminata, abilitiamo alcuni plugin extra:
# cd /etc/munin/plugins # ln -s /usr/share/munin/plugins/mysql_ mysql_ # ln -s /usr/share/munin/plugins/mysql_bytes mysql_bytes # ln -s /usr/share/munin/plugins/mysql_innodb mysql_innodb # ln -s /usr/share/munin/plugins/mysql_isam_space_ mysql_isam_space_ # ln -s /usr/share/munin/plugins/mysql_queries mysql_queries # ln -s /usr/share/munin/plugins/mysql_slowqueries mysql_slowqueries # ln -s /usr/share/munin/plugins/mysql_threads mysql_threads
Configurazione
Apriamo il file di configurazione di Munin
# nano /etc/munin/munin.conf
e modifichiamo alcune cose:
- decommentiamo le linee dbdir, htmldir, logdir, rundir, tmpldir
- sostituiamo localhost.localdomain con il FQDN del nostro server, ad esempio server1.example.com, nella sezione simple host tree
La configurazione di Munin per Apache si trova nel file /etc/apache2/conf.d/munin
(che attualmente è un symlink verso /etc/munin/apache.conf
): tra le altre cose definisce un alias chiamato munin alla directory di output dei report HTML di Munin /var/cache/munin/www
; questo significa che possiamo accedere alle statistiche di Munin da tutti i Virtual Host del nostro webserver attraverso il percorso relativo /munin
(ad esempio http://www.example.com/munin).
Apriamo il file in questione:
# nano /etc/apache2/conf.d/munin
e assicuriamoci di commentare la linea:
# Allow from localhost 127.0.0.0/8 ::1
e di aggiungere una linea:
# Accesso da ogni IP Allow from all # Oppure accesso solo dalla nostra LAN Allow from 192.168.0.0/24
altrimenti Munin sarà accessibile solo da localhost.
Riavviamo Apache:
# /etc/init.d/apache2 restart
Quindi riavviamo anche munin:
# /etc/init.d/munin-node restart
Attendiamo qualche minuto, per dare a Munin il tempo di generare le prime statistiche, e rechiamoci all'indirizzo http://ip.del.mio.server/munin per vedere i primi grafici.
Protezione di Munin
È una buona idea proteggere tramite password l'accesso ai grafici HTML prodotti da Munin; vogliamo forse che tutto il mondo veda come sta funzionando il nostro server?
Per proteggere Munin dobbiamo creare un file di password /etc/munin/munin-htpasswd
e abilitare un utente chiamato admin:
# htpasswd -c /etc/munin/munin-htpasswd admin
Inseriamo la password di protezione, quindi apriamo di nuovo:
# nano /etc/apache2/conf.d/munin
e decommentiamo la sezione seguente:
[...] AuthUserFile /etc/munin/munin-htpasswd AuthName "Munin" AuthType Basic require valid-user [...]
Apportiamo ancora una modifica, aggiungendo all'inizio del file la sezione seguente, per abilitare automaticamente HTTPS sulle pagine di Munin:
<IfModule mod_rewrite.c> <IfModule mod_ssl.c> <Location /munin> RewriteEngine on RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}/munin [R] </Location> </IfModule> </IfModule>
Infine riavviamo Apache e Munin:
# /etc/init.d/apache2 restart # /etc/init.d/munin-node restart
Installazione di Monit
Installare Monit in Debian è semplice:
# apt-get install monit
Il file di configurazione è /etc/monit/monitrc
. Il file di default contiene un sacco di esempi. Nel nostro caso noi vogliamo:
- monitorare proftpd, sshd, mysql, apache, postfix
- abilitare l'interfaccia di monit sulla porta 2812
- abilitare HTTPS sull'interfaccia
- proteggere le pagine con una username e una password
- inviare degli alert vie email all'indirizzo root@localhost
Salviamo la configurazione originale e creiamo quindi il nostro file di configurazione, secondo le specifiche stabilite:
# cp /etc/monit/monitrc /etc/monit/monitrc_orig # cat /dev/null > /etc/monit/monitrc # nano /etc/monit/monitrc
dandogli questo contenuto:
set daemon 60 set logfile syslog facility log_daemon set mailserver localhost set mail-format { from: monit@server1.example.com } set alert root@localhost set httpd port 2812 and use address IP.DEL.NOSTRO.SERVER SSL ENABLE PEMFILE /var/certs/monit.pem allow admin:test check process proftpd with pidfile /var/run/proftpd.pid start program = "/etc/init.d/proftpd start" stop program = "/etc/init.d/proftpd stop" if failed port 21 protocol ftp then restart if 5 restarts within 5 cycles then timeout check process sshd with pidfile /var/run/sshd.pid start program "/etc/init.d/ssh start" stop program "/etc/init.d/ssh stop" if failed port 22 protocol ssh then restart if 5 restarts within 5 cycles then timeout check process mysql with pidfile /var/run/mysqld/mysqld.pid group database start program = "/etc/init.d/mysql start" stop program = "/etc/init.d/mysql stop" if failed host 127.0.0.1 port 3306 then restart if 5 restarts within 5 cycles then timeout check process apache with pidfile /var/run/apache2.pid group www start program = "/etc/init.d/apache2 start" stop program = "/etc/init.d/apache2 stop" if failed host www.example.com port 80 protocol http and request "/monit/token" then restart if cpu is greater than 60% for 2 cycles then alert if cpu > 80% for 5 cycles then restart if totalmem > 500 MB for 5 cycles then restart if children > 250 then restart if loadavg(5min) greater than 10 for 8 cycles then stop if 3 restarts within 5 cycles then timeout check process postfix with pidfile /var/spool/postfix/pid/master.pid group mail start program = "/etc/init.d/postfix start" stop program = "/etc/init.d/postfix stop" if failed port 25 protocol smtp then restart if 5 restarts within 5 cycles then timeout check process munin-node with pidfile /var/run/munin/munin-node.pid group system start program = "/etc/init.d/munin-node start" stop program = "/etc/init.d/munin-node stop" if failed host localhost port 4949 then restart if 5 restarts within 5 cycles then timeout #check process nginx with pidfile /var/run/nginx.pid # start program = "/etc/init.d/nginx start" # stop program = "/etc/init.d/nginx stop" # if failed host 127.0.0.1 port 80 then restart # #check process memcached with pidfile /var/run/memcached.pid # start program = "/etc/init.d/memcached start" # stop program = "/etc/init.d/memcached stop" # if failed host 127.0.0.1 port 11211 then restart # #check process pureftpd with pidfile /var/run/pure-ftpd/pure-ftpd.pid # start program = "/etc/init.d/pure-ftpd-mysql start" # stop program = "/etc/init.d/pure-ftpd-mysql stop" # if failed port 21 protocol ftp then restart # if 5 restarts within 5 cycles then timeout # #check process named with pidfile /var/run/named/named.pid # start program = "/etc/init.d/bind9 start" # stop program = "/etc/init.d/bind9 stop" # if failed host 127.0.0.1 port 53 type tcp protocol dns then restart # if failed host 127.0.0.1 port 53 type udp protocol dns then restart # if 5 restarts within 5 cycles then timeout # #check process ntpd with pidfile /var/run/ntpd.pid # start program = "/etc/init.d/ntp start" # stop program = "/etc/init.d/ntp stop" # if failed host 127.0.0.1 port 123 type udp then restart # if 5 restarts within 5 cycles then timeout # #check process mailman with pidfile /var/run/mailman/mailman.pid # group mail # start program = "/etc/init.d/mailman start" # stop program = "/etc/init.d/mailman stop" # #check process amavisd with pidfile /var/run/amavis/amavisd.pid # group mail # start program = "/etc/init.d/amavis start" # stop program = "/etc/init.d/amavis stop" # if failed port 10024 protocol smtp then restart # if 5 restarts within 5 cycles then timeout # #check process courier-imap with pidfile /var/run/courier/imapd.pid # group mail # start program = "/etc/init.d/courier-imap start" # stop program = "/etc/init.d/courier-imap stop" # if failed host localhost port 143 type tcp protocol imap then restart # if 5 restarts within 5 cycles then timeout # #check process courier-imap-ssl with pidfile /var/run/courier/imapd-ssl.pid # group mail # start program = "/etc/init.d/courier-imap-ssl start" # stop program = "/etc/init.d/courier-imap-ssl stop" # if failed host localhost port 993 type tcpssl sslauto protocol imap then restart # if 5 restarts within 5 cycles then timeout # #check process courier-pop3 with pidfile /var/run/courier/pop3d.pid # group mail # start program = "/etc/init.d/courier-pop start" # stop program = "/etc/init.d/courier-pop stop" # if failed host localhost port 110 type tcp protocol pop then restart # if 5 restarts within 5 cycles then timeout # #check process courier-pop3-ssl with pidfile /var/run/courier/pop3d-ssl.pid # group mail # start program = "/etc/init.d/courier-pop-ssl start" # stop program = "/etc/init.d/courier-pop-ssl stop" # if failed host localhost port 995 type tcpssl sslauto protocol pop then restart # if 5 restarts within 5 cycles then timeout # #check process dovecot with pidfile /var/run/dovecot/master.pid # group mail # start program = "/etc/init.d/dovecot start" # stop program = "/etc/init.d/dovecot stop" # if failed host localhost port 993 type tcpssl sslauto protocol imap then restart # if 5 restarts within 5 cycles then timeout # #check process clamav with pidfile /var/run/clamav/clamd.pid # group virus # start program = "/etc/init.d/clamav-daemon start" # stop program = "/etc/init.d/clamav-daemon stop" # if failed host localhost port 3310 then restart # if 5 restarts within 5 cycles then timeout # #check process freshclam with pidfile /var/run/clamav/freshclam.pid # group virus # start program = "/etc/init.d/clamav-freshclam start" # stop program = "/etc/init.d/clamav-freshclam stop" # if 5 restarts within 5 cycles then timeout # #check process cron with pidfile /var/run/crond.pid # group system # start program = "/etc/init.d/cron start" # stop program = "/etc/init.d/cron stop" # if 5 restarts within 5 cycles then timeout # #check process dspam with pidfile /var/run/dspam/dspam.pid # group mail # start program = "/etc/init.d/dspam start" # stop program = "/etc/init.d/dspam stop" # if 5 restarts within 5 cycles then timeout # #check process fail2ban with pidfile /var/run/fail2ban/fail2ban.pid # start program = "/etc/init.d/fail2ban start" # stop program = "/etc/init.d/fail2ban stop" # if failed unixsocket /var/run/fail2ban/fail2ban.sock then restart # if 5 restarts within 5 cycles then timeout # #check process vsftpd with pidfile /var/run/vsftpd/vsftpd.pid # start program = "/etc/init.d/vsftpd start" # stop program = "/etc/init.d/vsftpd stop" # if failed port 21 protocol ftp then restart # if 5 restarts within 5 cycles then timeout
Nella configurazione sono stati lasciati, commentati, anche i parametri per monitorare servizi diversi da quelli impostati nel nostro caso specifico.
Nella parte di configurazione dedicata ad Apache si trova:
if failed host www.example.com port 80 protocol http and request "/monit/token" then restart
che significa che Monit prova a connettersi a www.example.com sulla porta 80 e cerca di accedere al file /monit/token
, il cui path completo è /var/www/www.example.com/web/monit/token
, supponendo che la root del nostro sito web sia /var/www/www.example.com/web
. Di conseguenza dobbiamo creare il file:
# mkdir /var/www/www.example.com/web/monit # echo "hello" > /var/www/www.example.com/web/monit/token
Protezione di Monit
Adesso occorre creare il certificato pem (/var/certs/monit.pem
) di cui ci serviremo per proteggere via SSL l'interfaccia web di Monit:
# mkdir /var/certs # cd /var/certs
Abbiamo bisogno di una configurazione OpenSSL per creare il nostro certificato. Il file di configurazione può essere come il seguente:
# nano /var/certs/monit.cnf
# create RSA certs - Server RANDFILE = ./openssl.rnd [ req ] default_bits = 2048 encrypt_key = yes distinguished_name = req_dn x509_extensions = cert_type [ req_dn ] countryName = Country Name (2 letter code) countryName_default = MO stateOrProvinceName = State or Province Name (full name) stateOrProvinceName_default = Monitoria localityName = Locality Name (eg, city) localityName_default = Monittown organizationName = Organization Name (eg, company) organizationName_default = Monit Inc. organizationalUnitName = Organizational Unit Name (eg, section) organizationalUnitName_default = Dept. of Monitoring Technologies commonName = Common Name (FQDN of your server) commonName_default = server.monit.mo emailAddress = Email Address emailAddress_default = root@monit.mo [ cert_type ] nsCertType = server
Ora possiamo creare il certificato:
# openssl req -new -x509 -days 3650 -nodes -config ./monit.cnf -out /var/certs/monit.pem -keyout /var/certs/monit.pem # openssl gendh 512 >> /var/certs/monit.pem # openssl x509 -subject -dates -fingerprint -noout -in /var/certs/monit.pem # chmod 700 /var/certs/monit.pem
Finalmente, possiamo avviare Monit:
# /etc/init.d/monit start
Puntando il browser all'indirizzo https://www.example.com:2812 e facendo login con le credenziali impostate in precedenza nella configurazione (admin / test) raggiungeremo l'interfaccia web di Monit.
Guida scritta da: Ferdybassi 15:31, 09 mar 2014 (CEST) | Debianized 20% |
Estesa da: | |
Verificata da: | |
Verificare ed estendere la guida | Cos'è una guida Debianized |