Man glaubt es kaum, wenige Stunden in Betrieb und schon versuchen böse Buben in den neuen Linux Virtual Private Server bei Contabo einzudringen und feuern gefühlt tausende von Requests auf die PHPMyAdmin Installation ab. Auch wenn sie nicht erfolgreich waren, möchte ich es ihnen noch ein wenig schwerer gestalten und PHPMyAdmin absichern.
Dazu habe ich unter https://blog.louwii.fr/2017/01/secure-phpmyadmin-install-with-fail2ban/ eine tolle Anleitung gefunden, die ich leicht abgewandelt verwendet habe.
PHPMyAdmin absichern: URL verschleiern
Im ersten Schritt verschleiern wir die PHPMyAdmin-URL um PHPMyAdmin abzusichern. Normalerweie findet man PHPMyAdmin unter http://servername/phpmyadmin. Das ändern wir jetzt. Dazu editiert man /etc/phpmyadmin/apache.conf und ändert die Zeile, die mit „Alias“ beginnt entsprechend ab.
Alias /phpmyadmin /usr/share/phpmyadmin
nach
Alias /geheimerAlias /usr/share/phpmyadmin
Das „geheimerAlias“ ersetzt man natürlich durch eine möglichst sinnlose Zeichenkette, die niemand mit PHPMyAdmin in Verbindung bringt. Danache einmal Apache neu starten.
service apache2 restart
Jetzt ruft man PHPMyAdmin unter „http://servername/geheimerAlias“ auf.
PHPMyAdmin absichern: Login mit fail2ban überwachen
Sollten die bösen Buben meine PHPMyAdmin Installation danach trotzdem noch finden soll fail2ban aufpassen. Meinen Artikel darüber wie ich den Server schon vorher auch mit fail2ban etwas sicherer gemacht habe findet ihr hier. Alternativ kann man natürlich auch einfach ein zweites Passwort mit htaccess davor schalten und damit PHPMyAdmin absichern. Wie das geht, ist bei digitalocean.com klasse beschrieben.
Damit fail2ban eine Chance hat PHPMyAdmin zu überwachen muss man zuerst dafür sorgen, dass fehlgeschlagene Anmeldeversuche in eine überwachte Log-Datei geschrieben werden.
Auch wenn es nicht schön ist, klappte bei mir nur die Ergänzung einer Zeile direkt im PHPMyAdmin Quellcode in der Datei /usr/share/phpmyadmin/libraries/plugins/auth/AuthenticationCookie.class.php. Dort habe ich in der Funktion „public function authFails()“ ganz am Ende vor „$this->auth()“ folgende Zeil ergänzt:
error_log( 'phpmyadmin: invalid login attempt - User: '. $GLOBALS['PHP_AUTH_USER'] );
Danach definiert man den fail2ban Filter, indem die Datei /etc/fail2ban/filter.d/phpmyadmin.conf mit folgendem Inhalt neu angelegt wird:
[Definition]
failregex = .*\[client <HOST>:[0-9]+] phpmyadmin: invalid login attempt - User:.*
ignoreregex =
Jetzt noch die Filterregel in die Datei /etc/fail2ban/jail.local eintragen und folgenden Abschnitt ergänzen:
[phpmyadmin]
enabled = true
filter = phpmyadmin
port = http,https
logpath = /var/log/apache2/*error.log
In der Zeile, die den logpath definiert, muss der Pfad angegeben werden, wo die Logdateien stehen in die PHPMyAdmin seine Einträge schreibt. Normalerweise wird das /var/log/apache2/error.log sein. Je nach Installation kann die Logdatei eines Apache Virtual Host auch ganz woanders liegen. Am Einfachsten man testet in welcher Logdatei der Eintrag landet, wenn man sich bei PHPMyAdmin mit einem falschen Passwort versucht anzumelden.
Abschließend startet man fail2ban neu mit
service fail2ban restart
Um zu sehen, ob der Filter angenommen wurde schauen wir in der Datei /var/log/fail2ban.log nach und finden etwas Ähnliches wie:
tail -f /var/log/fail2ban.log
…
2017-10-11 09:59:23,142 fail2ban.jail [16581]: INFO Jail 'apache-nohome' started
2017-10-11 09:59:23,143 fail2ban.jail [16581]: INFO Jail 'phpmyadmin' started
…
Der neue Filter wurde also gestartet.
Beim Testen ob der Filter auch greift bitte darauf achten, dass man nicht die eigene IP durch fail2ban ignorieren läßt, dann greift der Filter natürlich nie.