Monitorare la coda dei messaggi di posta elettronica è sempre un task importante per chi gestisce un server. Basta che venga trafugata una password di qualche utente o che il pc di qualche utente sia affetto da malware che il nostro server comincia a produrre un’infinità di messaggi di spam. Questa situazione è assolutamente da evitare perché, a parte i problemi derivanti dall’effetto “tappo” dato dalla massa dei messaggi in uscita e il conseguente sovraccarico in termini di CPU e di memoria, c’è la severa possibilità che l’indirizzo IP del server venga presto inserito nelle blacklist.
Nel caso il nostro server venga gestito tramite Plesk e il servizio di posta elettronica sia basato su QMail (caso piuttosto diffuso) possiamo utilizzare direttamente il pannello di controllo di Plesk per monitorare ed eventualmente per cancellare i messaggi che stanno affollando pericolosamente la coda. E’ utile, prima di cancellare i messaggi sospetti, analizzare gli header degli stessi per capire da quale account stanno partendo.
Tutte queste operazioni possone essere fatte da pannello di controllo se la coda non è già arrivata a dimensioni ingestibili da una interfaccia grafica web. Se la coda supera i 100 messaggi, è il caso di aprire una shell SSH e agire direttamente da riga di comando sul server.
Il comando da utilizzare per leggere le informazioni riassuntive della situazione della coda di QMail è:
/usr/local/psa/admin/sbin/mailqueuemng -s
Il comando produce un output simile a questo:
Messages in local queue: 0
Messages in remote queue: 0
Messages in todo queue: 0
Messages total: 0
Messages found: 0
Timestamp: 1464875716
Invece, il comando:
/usr/local/psa/admin/bin/mailqueuemng -R
permette di listare tutti i messaggi, ma non è bene eseguirlo se i messaggi sono troppo numerosi. In questo caso conviene andarsi a leggere i logs dal file maillog che si trova in /usr/local/psa/var/log. Scorrendo il file maillog sarà possibile individuare l’account incriminato.
Una volta individuato l’account che sta producendo spam, la prima operazione da fare è di cambiargli la password, in genere questa operazione è sufficiente a terminare la proliferazione di messaggi (se ciò non bastasse i guai si fanno seri…). Questa operazione è possibile anche dal pannello di controllo in modalità grafica, ma è sicuramente più veloce e sicura da linea di comando:
/usr/local/psa/bin/mail -u test@example.com -passwd nuovapassword
Adesso possiamo eliminare tutti i messaggi in coda tramite il comando:
/usr/local/psa/admin/bin/mailqueuemng -D
Quando viene eseguito questo comando, viene prima fermato il servizio QMail e al termine riavviato. Se proprio si vuole essere sicuri lo si può fare comunque:
Per fermare Qmail: /etc/init.d/qmail stop
e per riavviarlo: /etc/init.d/qmail start
Per evitare di trovarsi in situazioni di questo tipo e di essere costretti ad intervenire troppo tardi, ho scritto un piccolo script bash che controlla la quantità dei messaggi in coda e confronta il numero con un limite che può essere fissato a piacimento. Lo script dovrà essere inserito sotto cron
per essere eseguito ad intervalli regolari nell’arco della giornata. Se il numero di messaggi in coda supera il limite prefissato, parte una mail di allarme all’indirizzo del postmaster.
Ecco il codice:
1 2 3 4 5 6 7 8 | #!/bin/bash [ ! "$#" == "1" ] && exit 1 LOGFILE=/var/log/queue.log queue=$(cat test.txt|grep "Messages total:" |sed -n '/total:/,${s/[^0-9]*//g;/./p}') echo "$(date) QMail queue: $queue [limit: $1]" >> "$LOGFILE" if [ "$queue" -gt $1 ]; then echo "Subject: Queue alarm: $queue [limit: $1]" | sendmail -t postmaster@example.com fi |
Lo script (che ho chiamato: readqueue.sh ) deve essere eseguito con un parametro che sarà il limite che si vuole imporre come soglia di allarme.
Es: readqueue.sh 20
Durante l’esecuzione produce anche un file di log (il path e il nome lo potete modificare in riga 3) che viene aggiornato con la data e l’ora di esecuzione e il numero di messaggi in coda in quel momento. Se viene superata la soglia, viene inviata anche una mail. Ricordatevi di cambiare l’indirizzo email in riga 7 postmaster@example.com con quello che desiderate!
Infine per inserirlo in esecuzione automatica ogni ora basta aggiungere una riga di questo tipo:
0 * * * * /path/to/readqueue.sh 20
utilizzando il comando crontab -e
Nota: Queste procedure sono state testate su un server con Plesk 10.4 su distro CentOS 6.8 e QMail. Sebbene probabilmente gli stessi comandi siano utilizzabile su qualsiasi versione di Plesk + QMail, è bene accertarsi prima con versioni differenti da quella che ho testato!
Riferimenti:
How to check the mail queue on your server