Tag Archives: Wordpress

fail2ban mit WordPress, ownCloud und Squirrelmail

Mit fail2ban lassen sich ganz wunderbar die unzähligen Login-Versuche blockieren, die tagtäglich auf einen Linuxserver einprasseln. Für SSH, Apache und viele weitere Dienste sind Filter vorab konfiguriert. Für WordPress, ownCloud und Squirrelmail ist etwas Handarbeit nötig.

Als Grundlage diente hier eine aktuelle Ubuntu 14.04 Installation. WordPress und ownCloud wurden manuell installiert, Squirrelmail direkt aus den Paketquellen. Letzteres benötigt zusätzlich auch noch das Paket squirrelmail-logger.

Die weiter unten erwähnten fail2ban Filter gehören jeweils ins Verzeichniss /etc/fail2ban/filter.d/, wohingegen die jail.conf sich in /etc/fail2ban/ findet. Ehe mittels
service fail2ban restart
die Filter scharf gestellt werden, lassen diese sich zuvor mittels
fail2ban-regex /pfad/zu/logfile.log /etc/fail2ban/filter.d/filtername.conf
manuell anwenden und debuggen.

Wer eine von den fail2ban Standardeinstellungen (im oberen Teil der jail.conf) abweichende findtime (Zeit in der Login-Fehler gezählt werden) oder bantime (Zeit die die IP gebannt wird) je nach Webservice konfigurieren möchte, kann das ganz analog zum Feld maxretry (Anzahl der Login-Fehler ehe geblockt wird) tun.

WordPress

WordPress schreibt in der Standardkonfiguration auf einem Apache in das access.log einen HTTP-Status Code 200 bei einem gescheiterten Login. Der fail2ban filter apache-wplogin.conf sieht dann wie folgt aus

[Definition]
failregex = <HOST>.*] "POST .*/wp-login\.php HTTP.* 200 .*$
ignoreregex =

und die jail.conf wird um folgenden Block ergänzt

[apache-wplogin]
enabled = true
port = http,https
filter = apache-wplogin
logpath = /var/log/apache*/*access.log
maxretry = 3

ownCloud

Für ownCloud müssen zunächst in der config.php folgende drei Punkte ggf. ergänzt werden

'logtimezone' => 'Europe/Berlin',
'log_type' => 'syslog',
'log_authfailip' => 'true',

um anschließend den fail2ban Filter owncloud.conf zu erstellen

[Definition]
failregex = .*ownCloud.*Login failed:.*, IP:<HOST>.*$
ignoreregex =

und die jail.conf zu erweitern

[owncloud]
enabled = true
port = http,https
filter = owncloud
logpath = /var/log/syslog
maxretry = 3

Squirrelmail

Nachdem das Paket squirrelmail-logger installiert war, hat Squirrelmail von sich aus nach syslog geloggt, daher kann direkt der fail2ban Filter squirremail.conf erstellt werden

[Definition]
failregex = .*squirrelmail: Failed webmail login.* at <HOST>.*$
ignoreregex =

und der entsprechende Block in der jail.conf ergänzt werden

[squirrelmail]
enabled = true
port = http,https
filter = squirrelmail
logpath = /var/log/mail.log
maxretry = 3

Bei der Recherche waren die folgenden Quellen teilweise nützlich:

  • fail2ban und WordPress
  • fail2ban und ownCloud
  • WordPress Backup-Script [Update]

    Heute habe ich endlich mal das Update von WordPress 2.8 auf Version 2.8.2 vollzogen. Zum Glück habe ich mir vorher ein Backup angelegt da beim ersten Versuch mit der Vollversion von 2.8.2 einige PHP Fehlermeldungen bei Wiederinbetriebnahme auftraten.

    Erst das Inkrementelle Update von 2.8 auf 2.8.1 und anschließend von 2.8.1 auf 2.8.2 hat ohne Probleme geklappt. Um für das Backup nicht jedes mal alles nachzuschlagen habe ich alle Schritte in ein Bash-Script gepackt. Es erstellt ein Backup der WordPress Installation und der Datenbank. In einem zentralen Backup Verzeichnis wird für jede WordPress Version ein eigenes Unterverzeichnis erstellt in dem dann alle Backups dieser Version landen.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    
    #!/bin/bash
     
    # author: Michael Prim
    # date: 25.07.2009
    # contact: www.mprim.de
     
    # main webserver directory
    APACHE=/var/www
    # wordpress subfolder
    WP=wordpress
    # current WP version
    VERSION=`grep Version $APACHE/$WP/liesmich.html | head -n 1 | awk '{print $3}' | sed 's/\r//g'`
    # wp database
    DBUSER=username
    DBNAME=databasename
    # backup destination
    BACKUPMAINFOLDER=$HOME/BackupFolder
    BACKUPVERSIONFOLDER=$BACKUPMAINFOLDER/$VERSION
    BACKUP=$BACKUPVERSIONFOLDER
    mkdir -pv $BACKUP
    # timestamp every backup file will get
    TIMESTAMP=$(date +"%Y%m%d-%H_%M")
    # logfile
    LOG=blog.backup_$TIMESTAMP.log
     
    echo '--- backup blog files ---'
    cd $APACHE
    tar -czvf $BACKUP/blog.backup_$TIMESTAMP.tar.gz $WP &> $BACKUP/$LOG
     
    echo '--- dump SQL database - password required ---'
    cd $BACKUP
    mysqldump --add-drop-table -u $DBUSER -p $DBNAME --lock-tables=false | bzip2 -c > blog.backup_$TIMESTAMP.sql.bz2

    Die Werte für VERSION,APACHE,WP,DBUSER,DBNAME und BACKUPMAINFOLDER müssen natürlich noch an die eigene Umgebung angepasst werden.

    Um bei der Wiederherstellung die Rechte der Ordner der WordPress Installation zu erhalten sollte das Backup mit der Option -p entpackt werden:

    $ tar -xpzvf blog.backup_$TIMESTAMP.tar.gz

    [Update]
    Nachdem in kurzer Zeit noch die Updates auf 2.8.3 und 2.8.4 erschienen sind, habe ich das Script erweitert. Die aktuelle Version wird jeweils aus der liesmich.html ausgelesen. Diese liegt der deutschen WordPress Version und allen Updates bei.