Failed to initialize any backend for Jail sshd

Nach der Installation von fail2ban zeigt systemctl status fail2ban folgendes an:

# systemctl status fail2ban
× fail2ban.service - Fail2Ban Service
     Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; preset: enabled)
     Active: failed (Result: exit-code) since Fri 2024-05-03 10:30:22 CEST; 54s ago
   Duration: 163ms
       Docs: man:fail2ban(1)
    Process: 4115 ExecStart=/usr/bin/fail2ban-server -xf start (code=exited, status=255/EXCEPTION)
   Main PID: 4115 (code=exited, status=255/EXCEPTION)
        CPU: 142ms

Mai 03 10:30:22 backup systemd[1]: Started fail2ban.service - Fail2Ban Service.
Mai 03 10:30:22 backup fail2ban-server[4115]: 2024-05-03 10:30:22,685 fail2ban.configreader   [4115]: WARNING 'allowipv6' not defined in 'Definition'. Using default one: 'auto'
Mai 03 10:30:22 backup fail2ban-server[4115]: 2024-05-03 10:30:22,698 fail2ban                [4115]: ERROR   Failed during configuration: Have not found any log file for sshd jail
Mai 03 10:30:22 backup fail2ban-server[4115]: 2024-05-03 10:30:22,702 fail2ban                [4115]: ERROR   Async configuration of server failed
Mai 03 10:30:22 backup systemd[1]: fail2ban.service: Main process exited, code=exited, status=255/EXCEPTION
Mai 03 10:30:22 backup systemd[1]: fail2ban.service: Failed with result 'exit-code'.

Lösung:
1. erstelle die Datei jail.local unter /etc/fail2ban/jail.local und trage folgendes ein:

# nano /etc/fail2ban/jail.local

[sshd]
enabled = true
backend = systemd

2. installiere das Paket python3-systemd:

# apt install python3-systemd

3. starte fail2ban neu:

# systemctl restart fail2ban

crontab mit bash-Script

crontab kann per Bash-Script ausgeführt werden. In diesem Beispiel erstellen wir uns einen crontab, der jeweils um 23:30 Uhr auf unserem Rocket.Chat Server ein Backup erstellt.

# nano /etc/crontab
/etc/crontab zeigt beim ersten Aufruf die Tutorialseite an. Tippe hier die systemweiten crontab ein.

# /etc/crontab: system-wide crontab

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# Starte Backup um 23:30 Uhr
30 23 * * * root bash /root/backup_chat.sh
# lösche Backups > 3 Tage. Überprüfe jeweils um 23:45 Uhr.
45 23 * * * root find /var/snap/rocketchat-server/common/backup/*.* -mtime +3 -exec rm {} \;
#

dieser crontab ruft somit um 23:30 Uhr das backup-Script backup_chat.sh auf. Das Script liegt hier unter /root/backup_chat.sh
#!/bin/bash
service snap.rocketchat-server.rocketchat-server stop
snap run rocketchat-server.backupdb
service snap.rocketchat-server.rocketchat-server start

das Script kann im Voraus noch geprüft werden:

# bash /root/backup_chat.sh
[*] Creating backup file...
[+] A backup of your data can be found at /var/snap/rocketchat-server/common/backup/rocketchat_backup_20231113.0944.tar.gz

SSH-Keys generieren und verwenden

Normalerweise erstellt der Befehl ssh-keygen einen Schlüssel id_rsa unter dem Home Verzeichnis. Was aber, wenn wir mehrere SSH-Keys verwenden wollen? Den SSH-Key erstellen wir hier für einen normalen Benutzer und niemals für root!

Server IP: 123.45.678.90
Benutzer: USER
SSH-Key: id_rsa_local

auf dem Server (hier die IP 123.45.678.90)

Erstelle mittels ssh-keygen den Schlüssel (hier id_rsa_local) und kopiere diesen mittels cat nach ~/.ssh/authorized_keys

$ ssh-keygen -m PEM -t rsa -b 4096
$ cat ~/.ssh/KEYNAME.pub | ssh USER@123.45.678.90 "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

läuft der Server auf einem anderen Port als 22, ist der Port (hier 1004) anzugeben:

$ cat ~/.ssh/KEYNAME.pub | ssh USER@123.45.678.90 -p 1004 "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
$ ssh-keygen -m PEM -t rsa -b 4096
Generating public/private rsa key pair.
Enter file in which to save the key (/home/USER/.ssh/id_rsa): /home/USER/.ssh/id_rsa_local
  (...)
  (...)
  (...)
$ cat ~/.ssh/id_rsa_local.pub | ssh USER@123.45.678.90 "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
The authenticity of host '123.45.678.90 (123.45.678.90)' can't be established.
ED25519 key fingerprint is SHA256:bL8trr2HdSSw777CXIanpYeXvo1826v1Kj78UMa5NtE.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '123.45.678.90' (ED25519) to the list of known hosts.
USER@123.45.678.90's password: DEIN USER PASSWORT

Nun lassen wir uns den SSH-Key anzeigen und kopieren diesen Schlüssel auf unseren Client-PC:

$ less ~/id_rsa_local

Client PC

auf dem Client PC benötigen wir den ssh-key und ein config-File. Der ssh-key (hier id_rsa_local) muss die Berechtigung 600 haben. Diese Berechtigung ist per root zu setzen:

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

Erstelle unter ~.ssh ein config File mit:

$ nano ~/.ssh/config

# ssh configuration file
# BEISPIEL / EXAMPLE
# HostName = IP Adresse des Servers, z.B. 123.45.67.890

Host local
HostName 123.45.678.90
Port 123456
User USER
IdentityFile ~/.ssh/id_rsa

Host mailserver
HostName 25.10.200.4
Port 22
User dana
IdentityFile ~/.ssh/id_rsa_mailserver

Host backupserver
HostName 9.12.200.5
Port 22
User annalena
IdentityFile ~/.ssh/id_rsa_backupserver

Nun reicht die Übergabe des Host nach ssh:

$ ssh local

root-Login und Passwort verbieten

Vorsicht! Mach dies nur, wenn mit der Anmeldung SSH-Key wirklich alles klappt. An sonst kannst du dich vom System aussperren. Editiere dazu die /etc/ssh/sshd_config

# nano /etc/ssh/sshd_config

Setze nun PasswordAuthentication und PermitRootLogin auf den Wert no
PermitRootLogin no
PasswordAuthentication no

starte den Dienst neu:

# systemctl restart sshd

weitere Verschlüsselungen

Erstellen wir den Schlüssel mittels ED25519 oder ECDSA ist das Vorgehen analog! Der öffentliche Schlüssel (z.B. id_ecdsa.pub) muss nach ~/.ssh/known_hosts kopiert werden, während der geheime Schlüssel (z.B. id_ecdsa) auf dem Client-PC landen muss.

$ ssh-keygen -t ed25519
$ cat ~/.ssh/id_ed25519.pub | ssh USER@123.45.678.90 "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

oder alternativ

$ ssh-keygen -t ecdsa -b 521
$ cat ~/.ssh/id_ecdsa.pub | ssh USER@123.45.678.90 "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

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