Monitorare il sistema con Inotify e Incron
Inotify è un ottimo sistema di notifica, presente dalla versione del Kernel 2.6.13 e sempre più usato nelle varie distro.
Grazie a questo "nuovo" sistema è possibile accorgersi di eventuali modifiche e danni in tempo quasi reale, rispetto invece ai più vecchi sistemi tipo dnotify.
Se poi lo controlliamo con inron il sistema diventa quasi perfetto.
Incron è un programma che prende molto da cron, anche se in verità incron non ha nulla a che vedere con lo scheduling.
Cron infatti svolge azioni periodiche, mentre incron rimane in ascolto e cattura gli eventi di inotify.
Per prima cosa installiamo incron.
Dovrebbe essere presente su tutte le distro; su Archlinux:
# pacman -Sy incron
La tabelle di inrcond sono divise in tre colonne:
- la prima indica il PATH da controllare
- la seconda l'evento da rilevare
- la terza il comando da eseguire quando si scatena l'evento
Per quanto riguarda l'evento da rilevare abbiamo a disposizione un'ampia scelta:
IN_ACCESS -> il file è stato letto
IN_ATTRIB -> cambiamento attributi
IN_CLOSE_WRITE -> file aperto in modifca e poi chiuso
IN_CLOSE_NOWRITE -> file chiuso senza modifiche
IN_CREATE -> file/directory create
IN_DELETE -> file/directory cancellate
IN_DELETE_SELF -> file/directory osservata è stata cancellata
IN_MODIFY -> file modificato
IN_MOVE_SELF -> file/directory spostata o rinominata
IN_MOVED_FROM -> file/directory spostata dalla directory controllata
IN_MOVED_TO -> file/directory spostata nella directory controllata
IN_OPEN -> file aperto
IN_ALL_EVENTS -> qualsiasi evento
Insomma ce ne è per tutti i gusti.
Per controllare gli eventi possiamo usare incrontab (simile a crontab).
Per vedere gli eventi per l'utente corrente:
# incrontab -l
/srv/http IN_CREATE,IN_DELETE logger "ATTENZIONE"
Io ho un solo evento impostato per root.
Per aggiungere o modificare una tabella possiamo usare lo switch -e e poi modificare il tutto usando l'editor predefinito (che in genere è Vim).
Nel mio caso controllo la directory di Apache, controllando qualsiasi evento.
Con il comando logger scrivo dentro a /var/log/messages.log il messaggio ATTENZIONE ogni qualvolta succede qualcosa.
Questo un altro esempio:
/srv/http IN_ALL_EVENTS logger "ATTENZIONE IN $@ è avvenuto $%"
Facciamo una prova:
# cd /srv/http
# touch prova
# rm prova
# cat /var/log/messages.log
Feb 20 21:52:23 localhost logger: "ATTENZIONE IN /srv/http è avvenuto IN_OPEN"
Feb 20 21:52:23 localhost logger: "ATTENZIONE IN /srv/http è avvenuto IN_CLOSE_WRITE"
Feb 20 21:52:23 localhost logger: "ATTENZIONE IN /srv/http è avvenuto IN_ATTRIB"
Feb 20 21:52:23 localhost logger: "ATTENZIONE IN /srv/http è avvenuto IN_CREATE"
Feb 20 21:52:25 localhost logger: "ATTENZIONE IN /srv/http è avvenuto IN_DELETE"
I vari simboli che iniziano con $ sono delle variabili sotto forma di argomento e ce ne sono diversi:
$$ -> per fare il segno del dollaro
$@ -> percorso, PATH, che stiamo controllando
$# -> nome del file che stiamo controllando
$% -> nome dell'evento rilevato
$& -> nome numerico dell'evento rilevato
Un problema di inotify, però, è che non riesce a controllare anche le subdirectory.
Quindi a meno che non vogliamo inserire una tabella per ogni directory dobbiamo modificare qualcosa del genere:
find /srv/http -type d -print0 | xargs -0 -I{} echo "{} IN_ALL_EVENTS logger "In $@/$# avvenuto $%"" > /etc/incron.d/webroot.conf
Con questo comando creiamo il file /etc/incron.d/webroot.conf con dentro il risultato del comando find.
Riavviamo il demone e facciamo qualche prova!
linux archlinux pacman inotify incron
Commentami!