Am Wochenende ist es mal ganz blöd gelaufen: ein Kundenrechner wurde williger Bot eines Drohnen-Netzwerkes und hat massenhaft Mails versendet. Mit korrekter Benutzerkennung und Absenderadresse und dadurch nicht auffällig.
Und weil es das Wochenende mit Nikolaus und 2. Advent war, haben mein Kompagnon und ich beide nicht bemerkt, das der Mailserver deutlich über Gebühr beansprucht wurde durch diesen Mißbrauch. Am Montag dann war das Kind im Brunnen: Der Server wurde geblacklisted, Mailzustellung war schwierig. Letztendlich haben wir dem Ding eine neue IP verpasst, um das Problem zu lösen, aber darum geht es hier nicht.
Das hätte uns auffallen können, denn der Mailqueue – also der Zwischenspeicher am Mailserver, hatte bis zu 150.000 Mails gepuffert. Wir brauchen also ein Werkzeug, mit dem wir diesen Puffer überwachen können, und der uns ggfs. eine Alarmmail sendet. Nachdem ich mir ein paar tools angesehen habe (alles Quatsch) hab ich ein Script geschrieben, welches per Cronjob minütlich ausgeführt wird und mir bei Schwellwertüberschreitung eine Mail sendet. Das war erst lang und umständlich und ich hab es eine Weile optimiert, und damit sich nicht jeder die gleiche Arbeit machen muss, stelle ich es hier zur Verfügung:
#!/bin/bash
LANG=POSIX
LC_LANG=C
ALARMLEVEL=1000
CURQ=$(mailq | tail -n 1 | awk '$5>0 ? $n=$5 : $n=0 {print $n}')
if [ -z "${CURQ}" ]
then # null
## echo "isnix" #testausgabe
exit 1
fi
##echo -e ${CURQ} "\n" #testausgabe
if [ ${CURQ} -gt ${ALARMLEVEL} ]
then
echo -e "subject: MAILQUEUEALARM" ${CURQ} "\n\nEs sind" ${CURQ} "Mails im Queue" |sendmail root
fi
exit 1
Kurze Erläuterung:
- Umgebung festlegen
- Alarmlevel auf 1000 setzen
- den Wert des Mailq auslesen – letzte Zeile, 5. Stelle (wenn der leer ist, steht da nix)
- dann prüfen wir ob da nix drinsteht und beenden falls ja
- steht da eine Zahl drin, vergleichen wir die mit dem Schwellenwert und senden eine Mail, falls es mehr sind
Die Tricks dabei:
- die Sache mit der 5. Stelle in der Ausgabe bei leerem Queue, die gibt es nämlich nicht wenn der leer ist.
- Sendmail mit 2 escaped-en Zeilenumbrüchen auf „echo -e“ – dadurch trennen wir betreff vom body – den Trick kannte ich auch noch nicht
Das script (chmod +x nicht vergessen) minütlich in den crotab, und vergessen.
Wer das findet weil er danach gesucht hat, dem wird es helfen. Ich hätte es gefunden, wenn es das gegeben hätte.
Weitere coole Infos gegen Spam:
Anti-Spam SMTP Proxy Server | SourceForge.net
Spamschutz am Postfix mit Regex für PTR und helo
Update 08.01.2015
Das Script kann unter Umständen im Cronjob versagen, und zwar dahingehend, das keine Mail versendet wird. Dann muss der absolute Sendmail-Pfad angegeben werden
(…)
if [ ${CURQ} -gt ${ALARMLEVEL} ]
then
echo -e "subject: MAILQUEUEALARM" ${CURQ} "\n\nEs sind" ${CURQ} "Mails im Queue" |/usr/lib/sendmail root
fi
Und wenn man gerne die Ergebnisse geloggt haben möchte, dann macht das Linux-Tool logger eine gute Figur, da die Syntax der Zeile des Log-Eintrages korrekt ist
(…)
#echo -e ${CURQ} "\n" #testausgabe
logger "mailqalert mailq is" ${CURQ}
Mal sehen, wann das nächste Update kommt.