Zu allererst sollte man verstehen das SSH Server nichts anderes sind als die Kommandozeile eines entfernten Rechner. Deshalb ist es auch wichtig zu verstehen das auch Fremde versuchen sich mit den Rechner zu verbinden um Schaden anzurichten, sofern der Server für andere Zugänglich ist.

Insoweit man die Zugriffsversuche loggt, stellt man fest das sekündlich Zugriffsversuche entstehen.

Meistens werden Standard Credentials benutzt die Hersteller bei Geräten festlegen. Solche Sachen wie admin:admin, root:root oder ähnliches. Deshalb wäre es fatal gewesen, wenn man in der Vergangenheit einen Raspi mit dem Standard Raspberry Pi OS und der Standardkonfiguration einfach dem Internet überlassen hätte.

Die Credentials dafür waren pi als Benutzer und raspberry als Passwort.

Nur um das zu verdeutlichen… Der Benutzer pi konnte sudo ohne Einschränkung nutzen. Das heißt man hat vollständige Adminrechte für einen Computer in einem fremden Netzwerk. Mehr muss dazu nicht gesagt werden…

Konfiguration und Absicherung

Deshalb ist es für mich eine Selbstverständlichkeit keinen SSH Server in die Öffentlichkeit zu setzen ohne entsprechende Anpassungen vorgenommen zu haben.

  • GatewayPorts
  • SSH Port
  • Authentifzierung
  • Rechteverwaltung
  • fail2ban

GatewayPorts

Diese Funktion muss aktiviert werden, damit auch die Geräte im kompletten Netzwerk des Zielservers auf den geöffneten Port zugreifen können

sudo nano /etc/ssh/sshd_config

Folgenden Inhalt…

#AllowTcpForwarding yes
#GatewayPorts no
X11Forwarding yes

…entsprechend Anpassen:

#AllowTcpForwarding yes
GatewayPorts yes
X11Forwarding yes

Jede Anpassung die in der sshd_config passiert wird erst nach einem neustarten des Dienstes aktiv.

Das kann mittels systemctl restart ssh, systemctl status sshd oder auch service sshd restart erfolgen.

SSH Port

Die meisten Bots versuchen über Port 22 sich per SSH zu verbinden da das der Standard Port ist. Alleine das zu ändern sorgt dafür das kaum bis gar keine Anfragen mehr kommen, je nachdem welcher Port verwendet wird. Statt 22 könnte man ja sowas wie 22522, 52222 2222 oder auch 42452 nutzen. Bei 65535 ist Schluss.

sudo nano /etc/ssh/sshd_config

Dort ist folgender Inhalt zu finden:

#Port 22
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::
 

Das kann folgendermaßen geändert werden:

Port 54322
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::

Authentifzierung

Passwörter werden standardmäßig immer als Authentifzierung genommen. Jedoch gibt es eine bequemere und sichere Möglichkeit sich mit den Systemen zu verbinden.

Mittels SSH-Keys kann die Authentifzierung ohne Passwort erfolgen. Dafür erstellt man lediglich die keys mittels ssh-keygen und sendet diese an das Zielsystem mitssh-copy-id.

user@host:~# ssh-keygen -t ed25519
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/user/.ssh/id_ed25519): 
Created directory '/home/user/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/user/.ssh/id_ed25519
Your public key has been saved in /home/user/.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:qlTCoRakidohmE3Bxq7gGjA7kgagsKO7sLvX10l7F+c root@SSH-Exposer
The key's randomart image is:
+--[ED25519 256]--+
| o+.             |
|=B+              |
|@++ .            |
|Xo.= .           |
|B*+ o . S        |
|O+   o ..   . .  |
|=+ .. .o o   +   |
|+...... + . . E  |
|==  ..   . .     |
+----[SHA256]-----+

ssh-copy-id user@ssh-server -p <port> 

Danach sollte die nächste SSH Verbindung ohne Passwortabfrage aufgebaut werden.

Rechteverwaltung

Es ist ebenfalls auch möglich User so einzuschränken dass diese nur bestimmte Zwecke erfüllen dürfen.

Beispielsweise kann man den Nutzer /bin/bash vollständig wegnehmen damit keine Befehle durchgeführt werden können. Oder lediglich auf einzelne Sachen beschränken das Starten von bestimmten Skripten.

Dazu wird noch recherchiert wie man das machen kann und wie es am sinnvollsten ist.

fail2ban

DIeses Tool wird in diesem Fall verwendet um zu bannen. Wenn der Client zu oft die Verbindung nicht erfolgreich aufbauen konnte aufgrund von fehlgeschlagene Authentifizierung, wird deren IP in die Firewall eingetragen und für bestimmten Zeitraum gebannt.

Installieren der Pakete

sudo apt update
sudo apt install fail2ban
# Optional
sudo apt install rsyslog iptables

Die jail.conf kopieren da die bei jeder Aktualisierung des Programms überschrieben wird.

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local

Folgenden Eintrag könnte eventuell schon vorhanden sein:

[sshd]
 
# To use more aggressive sshd modes set filter parameter "mode" in jail.local:
# normal (default), ddos, extra or aggressive (combines all).
# See "tests/files/logs/sshd" or "filter.d/sshd.conf" for usage example and details.
#mode   = normal
port    = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s
 

Wie man es anpassen kann:

[sshd]
 
enabled	= true
port    = ssh
filter	= sshd
logpath	= /var/log/auth.log
maxretry = 4

Danach den Dienst fail2ban neustarten.

sudo service fail2ban restart

SSHLinux