Lästig: am Server werden Passwörter der IMAP/POP Accounts ausprobiert. Es geht nicht um brute force Attacken, sondern ganz langsames Probieren.
Ein Test, dann eine Weile später ein Test von einer anderen IP, dann eine Weile später wieder von einer anderen IP,... usw.
Bei so was greifen Helferlein wie fail2ban einfach nicht. Andererseits sollte man sich auch nicht allein auf die Stärke der Passwörter verlassen. Zum Glück kann man auch gegen die langsamen password-guesser etwas tun.
Voraussetzung: dovecot verwendet pam als passdb.
Die folgende Beschreibung bezieht sich auf Debian, andere Distributionen haben sicher andere Paketnamen und Pfade.
Zuerst das entsprechende pam_geoip Distri Paket samt Abhängigkeiten installieren:
apt-get install libpam-geoip
Hilfreich zum Debuggen ist auch noch das commandline tool für libgeoip geoip-bin.
Die Datenbanken der Distripakete sind nicht besonders aktuell, es empfiehlt sich, frischere Versionen zu holen (siehe weiter unten).
Als nächstes wird pam_geoip für dovecot konfiguriert.
In /etc/security/geoip.conf:
#<domain> <service> <action> <location>
* dovecot deny CN;US;IN;KR;SC
* * ignore UNKNOWN
* * allow *
Die Dokumentation zu geoip.conf gibt's entweder mit man geoip.conf oder online auf http://ankh-morp.org/code/pam_geoip/geoip.conf.html
In meinem Beispiel werden Zugriffe von China, USA, Indien, Korea und den Seychellen blockiert.
Auch der umgekehrte Weg ist natürlich möglich: nur für bestimmte Länder freigeben und alles andere blockieren.
Danach kommt pam für dovecot dran
In /etc/pam.d/dovecot:
#%PAM-1.0
@include common-auth
@include common-account
@include common-session
account required pam_geoip.so system_file=/etc/security/geoip.conf geoip_db=/usr/local/share/GeoIP/GeoLiteCity.dat use_v6=0 action=allow
Hier wurde die letzte Zeile hinzugefügt.
Der Pfad zur Datei GeoLiteCity.dat ist nicht der des Disti-Paketes sondern ein eigener. Ipv6 will ich nicht verwenden, falls gar nichts greift, ist die default Aktion "allow".
Die Dokumentation zu den Parametern gibt es auf http://ankh-morp.org/code/pam_geoip/pam_geoip.html
Problem:
Das Ganze funktioniert nur mit der GeoLiteCity.dat, mit der GeoIP.dat (geolite country) werden keine records in der db gefunden, alles is "UNKNOWN"
Entsprechende Einträge in /var/log/auth.log: "...no record for 1.2.3.4 setting GeoIP to 'UNKNOWN,*'
Also muss GeoLiteCity.dat verwendet werden.
Debug:
Zu den Parametern in /etc/pam.d/dovecot kann auch debug hinzugefügt werden. Dann gibt es etwas mehr logging in /var/log/auth.log
Falls es bei "UNKNOWN" bleibt, kann das mit geoiplookup geprüft werden:
geoiplookup -f /usr/local/share/GeoIP/GeoLiteCity.dat 1.2.3.4
Achtung:
Die pam rules greifen erst, wenn es um tatsächlich existierende User geht. Solange es sich um "user unknown" dreht, greift die rule nicht.
Da es um limits pro User/Gruppe geht, muss das natürlich zuerst feststehen.
Weitere Links:
https://github.com/vetinari/pam_geoip - pam_geoip source code (mirror?) auf Github
http://dev.maxmind.com/geoip/legacy/geolite/ - Download frischer GeoIP legacy Datenbanken.
Bash Skript Helferlein:
Zum aktuell Halten der lokalen GeoIP db.
#!/bin/bash
# Fetch fresh geoip city db from maxmind used by pam_geoip
BASE='/usr/local/share/GeoIP'
FILENAME='GeoLiteCity.dat'
URL='http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz'
cd $BASE
wget -q $URL
STATUS=$?
if [ $STATUS -eq 0 -a -f $FILENAME.gz ]
then
mv $FILENAME ${FILENAME}_old
gunzip $FILENAME.gz
else
echo "Problem when trying to fetch $URL" | mail -s 'update-geoip-db' user@yourmailserver.tld
exit 1
fi
exit 0
Das Skript am besten als cronjob einmal pro Monat ausführen. Dabei selbstverständlich die Mailadresse der Fehlermeldung auf was Sinnvolles setzen.
Warum das Ganze:
Auch IMAP/POP wäre an sich schützenswert (Privatsphäre), aber eigentlich geht es darum, dass die Zugangsdaten für smtp die selben sind. Sobald die abgegriffen wurden, mutiert der Mailaccount mit Sicherheit zur Spamschleuder und das will niemand.
Warum nicht mit Firewall:
Aus Performancegründen. Es macht einfach keinen Sinn, Tonnen von IPs zu laden, wenn davon nur einzelne gebraucht werden.