WordPress-Login mittels fail2ban schützen

fail2ban schützt dein WordPress-Login nach mehreren, fehlgeschlagen Versuchen und sperrt die entsprechende IP-Adresse aus. Installiere das Paket fail2ban:

# apt install fail2ban

Das nötige Konfigurationsfile findet man unter:
/etc/fail2ban/jail.conf

Erstelle eine Kopie vom Originalfile:

# cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

die verhindert, dass bei einem Update die eigenen Regeln überschrieben werden.

Den aktuellen Status von fail2ban rufst du per systemctl auf:

$ systemctl status fail2ban
● fail2ban.service - Fail2Ban Service
     Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; vendor preset: enabled)
     Active: active (running) since Fri 2021-11-26 10:14:43 CET; 1 weeks 1 days ago
       Docs: man:fail2ban(1)
   Main PID: 655 (fail2ban-server)
      Tasks: 5 (limit: 4678)
     Memory: 21.2M
        CPU: 6min 15.308s
     CGroup: /system.slice/fail2ban.service
             └─655 /usr/bin/python3 /usr/bin/fail2ban-server -xf start

Warning: some journal files were not opened due to insufficient permissions.

Erstelle nun einen Filter unter /etc/fail2ban/filter.d/wordpress.conf

[Definition]
failregex = ^<HOST> .* "POST .*wp-login.php
            ^<HOST> .* "POST .*xmlrpc.php
ignoreregex =

Anschliessend erstellen oder ergänzen wir noch die entsprechende jail-Datei unter /etc/fail2ban/jail.local

[wordpress]
enabled = true
port = http,https
filter = wordpress
action = iptables-multiport[name=wordpress, port="http,https", protocol=tcp]
logpath = /var/log/apache2*/access*log
maxretry = 3
findtime = 60m

Starte fail2ban neu:

# /etc/init.d/fail2ban restart

Mittels fail2ban-client -i kann der Status vom jail wordpress abgefragt werden. Hier z. B. wurde die IP 12.34.567.89 nach mehreren, fehlgeschlagen Versuchen gesperrt.

# fail2ban-client -i
fail2ban> status wordpress
Status for the jail: wordpress
|- Filter
|  |- Currently failed: 9
|  |- Total failed:     12
|  `- File list:        /var/log/apache2/access.log
`- Actions
   |- Currently banned: 1
   |- Total banned:     1
   `- Banned IP list:   12.34.567.89

Falls du dich versehentlich selbst aus WordPress ausgesperrt hast, kann die IP wieder entsperrt werden.

fail2ban> set wordpress unbanip 12.34.567.89
nach 3 missglückten Versuchen innerhalb vom 60 Minuten ist Schluss. fail2ban ignoriert dann jegliche Anfrage von der gebannten IP

Bootparameter GRUB / Debian

Bootoptionen oder Bootparameter können bei Debian direkt manuell eingegeben werden. Falls der aktuelle Kernel beim Booten stehen bleibt, können wir versuchen, mit verschiedenen Bootoptionen dies zu verhindern. Hier ein Beispiel mittels acpi=off:

Um die Einstellungen permanent zu übernehmen, editiere die Datei grub:

# nano /etc/default/grub

die Zeile dazu lautet: GRUB_CMDLINE_LINUX_DEFAULT="quiet acpi=off"

aktuallisiere anschliessend den Bootloader mit:

# update-grub
drücke hier die Taste e

Klartextpasswort verbieten

Nachdem ein ssh-key generiert wurde und die Anmeldung geklappt hat, können wir noch einen Schritt weitergehen und verbieten die Anmeldung mittels Passwort. Öffne die sshd-Konfigurationsdatei:

# nano /etc/ssh/sshd_config

und kommentiere die Passwort-Authentifizierung aus und setze den Wert auf Nein:

# To disable tunneled clear text passwords, change to no here!
PasswordAuthentication no
#PermitEmptyPasswords no

Vorsicht: Damit kannst Du dich vom gesamten System aussperren. Mache dies nur, wenn Du sicher bist, was du hier genau tust!

ssh-key generieren (rsa)

Im nachfolgenden Beispiel wird als Benutzername yuna und als IP 192.168.0.81 angenommen.

Benutzer (User): yuna
IP vom Server: 192.168.0.81

Um einen ssh-Key zu generieren, melden wir uns auf dem Server an und generieren einen Schlüssel mit dem Befehl:

$ ssh-keygen -m PEM -t rsa -b 4096
$ ssh-keygen -m PEM -t rsa -b 4096
Generating public/private rsa key pair.
Enter file in which to save the key (/home/yuna/.ssh/id_rsa): 
Created directory '/home/yuna/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/yuna/.ssh/id_rsa
Your public key has been saved in /home/yuna/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:5I0tLZWA4Npi2HtU7s+1jJm7Vh0M/9nuIg1otSnlz1I benutzer@server
The key's randomart image is:
+------ [RSA 4096] ------+
|         _nnnn_         |
|        dGGGGMMb        |
|       @p~qp~~qMb       |
|       M|@||@) M|       |
|       @,----.JM|       |
|      JS^\__/  qKL      |
|     dZP        qKRb    |
|    dZP          qKKb   |
|   fZP            SMMb  |
|   HZM            MMMM  |
|   FqM            MMMM  |
| __| ".        |\dS"qML |
| |    `.       | `' \Zq |
|_)      \.___.,|     .' |
|\____   )MMMMMP|   .'   |
|     `-'       `--' hjm |
+--------[SHA256]--------+

Kopiere anschliessend den Schlüssel. Passe Username und IP-Adresse an:

$ ssh-copy-id benutzername@192.168.0.81
$ ssh-copy-id yuna@192.168.0.81
The authenticity of host '192.168.0.81 (192.168.0.81)' can't be established.
ECDSA key fingerprint is SHA256:vu1+RPGYAaOIS7x6pSg8FL9J7ZoxHCs92HAR3e/k9Ps.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
yuna@192.168.0.81's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'yuna@192.168.0.81'"
and check to make sure that only the key(s) you wanted were added.

Windows

Nun übertragen/kopieren wir den privaten Schlüssel id_rsa nach: C:\Users\BENUTZER\.ssh

Achte darauf, bei Windows die Dateierweiterung .txt zu entfernen. Die Datei heisst hier id_rsa und nicht id_rsa.txt

Bei einem Login wird nun der private Schlüssel auf Deinem PC mit dem Schlüssel auf dem Server abgeglichen. Passen die zusammen, wird die Verbindung akzeptiert.

 

Linux

Hier muss zwingend die Berechtigung vom id_rsa Schlüssel unter ~/.ssh/id_rsa auf 600 gesetzt werden. Ansonst kommt es zu diesem Vorfall:

$ ssh yuna@192.168.0.81 -p 22
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0770 for '/home/BENUTZER/.ssh/id_rsa' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "/home/BENUTZER/.ssh/id_rsa": bad permissions
yuna@192.168.0.81's password: 
(...)

Die korrekte Berechtigung setzen wir mittels:

# chmod 600 /home/BENUTZER/.ssh/id_rsa

einen externen Server einbinden

sshfs lässt zu, einen entfernten Server in Debian einzubinden. Dieser Server wird als normales Laufwerk in Debian angezeigt und kann auch als solches verwendet werden. Dazu benötigen wir lediglich einen Debian-Server in der Minimalinstallation. Port 22 ist der einzige Port, der geöffnet werden muss. Falls der Server zusätzlich unter Windows 11 verfügbar sein soll, ist die Installation eines Samba-Servers notwendig.

Installiere nun auf der Workstation (nicht auf dem Server) das Paket sshfs:

# apt install sshfs

Auf dem Server, welcher Du nun einbinden möchtest, erstellst Du unter /home/benutzer einen Ordner share. Dasselbe gilt für Deine Workstation:

$ mkdir share

Das war’s bereits. Eingehängt wird der entfernte Server mittels sshfs und dem Zielpfad auf deinem Debiansystem.

$ sshfs benutzer@12.345.678.90:/home/benutzer/share /home/benutzer/share

Dabei gilt:

benutzer = Benutzername auf dem entfernten Server.
benutzer = Benutzername deines aktuellen Systems.
12.345.678.90 = IP-Adresse vom Server.

Hinweis

Das Einhängen vom Server niemals mit root-Rechten ausführen. Es ist ausreichend, einen normalen Benutzer zu erstellen und diesen Benutzer zu verwenden.

# adduser BENUTZER
# adduser share
Lege Benutzer »share« an ...
Lege neue Gruppe »share« (1001) an ...
Lege neuen Benutzer »share« (1001) mit Gruppe »share« an ...
Erstelle Home-Verzeichnis »/home/share« ...
Kopiere Dateien aus »/etc/skel« ...
Geben Sie ein neues Passwort ein: 
Geben Sie das neue Passwort erneut ein: 
passwd: Passwort erfolgreich geändert
Benutzerinformationen für share werden geändert.
Geben Sie einen neuen Wert an oder drücken Sie ENTER für den Standardwert
	Vollständiger Name []: Server_share
	Zimmernummer []: 
	Telefon geschäftlich []: 
	Telefon privat []: 
	Sonstiges []: 
Sind die Informationen korrekt? [J/n] J
root@debian:~#