Einleitung
In diesem Beitrag geht es um die Absicherung des SSH Dienstes auf Linux Systemen. Dabei werden die folgenden Punkte genauer erläutert:
- Absicherung des SSH Dienstes
- Zertifikatsbasierter Login
- Zwei Faktor Authentifizierung
Voraussetzungen
- SSH Dienst basierend auf OpenSSH
Schritt 1 - Absicherung des SSH Dienstes
Hier geht es hauptsächlich um die Anpassung der OpenSSH Konfiguration.
Alle nachfolgenden Änderungen in der SSH Konfigurations-Datei, beziehen sich auf die folgende Datei: /etc/ssh/sshd_config
Schritt 1.1 - Deaktivieren des Root Logins
Bevor der root Login abgestellt wird, sollte man einen Administrativen Benutzer erstellen, mit dem es möglich ist root Rechte zu erlangen.
Um einen solchen User zu erstellen, genügt es die nachfolgenden Befehle auf dem System auszuführen.
useradd -m -U -s /bin/bash -G sudo holu
passwd holu
Jetzt kann der Root Login deaktiviert werden.
Dazu muss in der SSH Konfigurations-Datei die Zeile PermitRootLogin
wie folgt angepasst werden:
PermitRootLogin no
Schritt 1.2 - Automatischer Sitzungs Timeout
Mit dieser Einstellung wird nach einer gewissen Inaktivität eine Zwangstrennung der SSH Verbindung vollzogen. Dabei sind folgende Einstellungen in der SSH Konfigurations-Datei notwendig:
ClientAliveInterval 300
ClientAliveCountMax 1
ClientActiveInterval
definiert die maximale Zeit, in der die Sitzung inaktiv sein darf, bevor sie geschlossen wird. In diesem Fall sind 300 Sekunden 5 Minuten. ClientAliveCountMax
definiert die Anzahl der Prüfungen, die vor einer Trennung durchzuführen sind.
Schritt 1.3 - Benutzer für SSH freischalten
Mit dieser Einstellung, wird es nur ausgewählten Benutzer erlaubt eine SSH Verbindung zum Server herzustellen. Dabei sind folgende Einstellungen in der SSH Konfigurations-Datei notwendig:
AllowUsers holu holu2
Schritt 1.4 - Standard Port für SSH ändern
Mit dieser Einstellung wird der SSH Port von 22 abgeändert.
Vorteile: Bots und Scanner die nach SSH Diensten auf Port 22 Scannen, finden den Server nicht mehr und starten keine automatisierten Angriffe gegen den Server.
Nachteile: Bei jeder Verbindung muss der abgeänderte SSH Port angegeben werden.
Hier gibt es aber die Möglichkeit, die SSH Verbindung zu speichern. Auf Windows zum Beispiel mit PuTTY geschieht das über die Oberfläche.
Auf Linux Clients, muss dafür die Datei ~/.ssh/config
mit folgendem Inhalt angelegt werden.
Host <yout_host>
HostName <your_host>
Port AUSGEWÄHLTER_PORT
(Optional) Hier kann auch später der Key hinterlegt werden: IdentityFile ~/.ssh/id_rsa
Achtung: Durch das Ändern des SSH Ports, kann es notwendig sein die Firewall Einstellungen zu ändern. Dies sollte vorher geprüft werden. Um die Einstellung anzuwenden, sind folgende Änderungen in der SSH Konfigurations-Datei notwendig: Es wird aus Sicherheitsgründen empfohlen einen Port unter 1024 zu wählen.
Port AUSGEWÄHLTER_PORT
Schritt 1.5 - Automatischer Verbindungsabbruch bei fehlerhaftem Login
Nach der angegebenen Anzahl von fehlgeschlagenen Login-Versuchen wird die SSH Verbindung automatisch vom Server getrennt. Um die Einstellung anzuwenden, sind folgende Änderungen in der SSH Konfigurations-Datei notwendig:
MaxAuthTries 2
Schritt 1.6 - Deaktivieren nicht genutzter Funktionen
Um das Ausnutzen von nicht genutzten Funktionen zu verhindern, sollten diese abgeschalten werden. Um die Einstellung anzuwenden, sind folgende Änderungen in der SSH Konfigurations-Datei notwendig:
AllowTcpForwarding no # Deaktiviert Port weiterleitungen.
X11Forwarding no # Deaktiviert remote GUI ansicht.
AllowAgentForwarding no # Deaktiviert die weiterleitung des SSH Logins.
AuthorizedKeysFile .ssh/authorized_keys # Dabei sollte die Angabe der Datei ".ssh/authorized_keys2" entfernt werden.
Schritt 1.7 - Die Einstellung übernehmen
Um die Einstellungen zu aktivieren, ist es nötig den SSH Dienst neuzustarten. Zuvor sollte aber die Konfiguration auf Fehler überprüft werden, dies geschieht mit diesem Befehl:
sshd -t
Sollten beim Überprüfen der Konfiguration keine Fehler zu erkennen gewesen sein, kann der SSH Dienst mit folgendem Befehl neugestartet werden:
systemctl restart sshd
Schritt 2 - Einrichtung von Fail2Ban
Diese Software bietet Schutz gegen sogenannte Brute-force Angriffe.
Dabei wird nach mehrmals falsch eingegebenen Passworts, die IP Adresse des Benutzers für eine gewisse Zeit gesperrt. Das soll verhindern, dass der Angreifer eine große Kennwortliste in kurzer Zeit ausprobieren kann.
Um Fail2Ban zu installieren sind folgende Schritte notwendig. Installation der Software:
- Ubuntu / Debian
apt install fail2ban systemctl enable fail2ban
- CentOS / RedHat
yum install epel-release yum install fail2ban systemctl enable fail2ban
- ArchLinux
pacman -S fail2ban systemctl enable fail2ban
- OpenSUSE / SLES
zypper install fail2ban systemctl enable fail2ban
- Fedora
dnf install fail2ban systemctl enable fail2ban
Anpassen der Fail2Ban Konfiguration
Erstellen der Konfiguration anhand einer Vorlage:
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
In der Datei /etc/fail2ban/jail.local
müssen folgende Änderungen erfolgen:
Unter dem Reiter [sshd]
muss enable
auf true
und der eventuell abgeänderte SSH Port angegeben werden.
enabled = true
port = AUSGEWÄHLTER_SSH_PORT
Optional können auch die Werte für:
bantime
(Die Zeit in der keine weiteren Logins möglich sind.)findtime
(Die Zeit in der die fehlerhaften Login-Versuche gezählt werden sollen. Startet ab dem ersten fehlerhaften Login.)maxretry
(Die maximal möglichen Fehlversuche, bevor es zu einer Sperrung kommt.)
abgeändert werden.
Der folgende Befehl übernimmt die geänderte Konfiguration:
systemctl restart fail2ban
Schritt 3 - Zertifikatsbasierte Authentifizierung
Der Benutzer kann sich dadurch ohne Login-Passwort am Server anmelden, es wird ausschließlich das Passwort zum Schutz des privaten Schlüssels benötigt.
Auf dem Client
-
Erstellen des SSH Schlüsselpaares
Linux / MacOS
Erstellen eines SSH Schlüsselpaares mit einer Bitlänge von
4096
ssh-keygen -b 4096
Achtung: Es wird aus sicherheitstechnischen Gründen empfohlen, den Schlüssel auf jeden Fall mit einer Passphrase zu schützen. Dadurch liegt der Schlüssel nicht im Klartext vor, sondern ist AES-CBC verschlüsselt.
Windows
Um auf Windowssystemen einen SSH Schlüsselpaar zu generieren, kann entweder das WSL (Windows Subsystem for Linux) oder die Software PuTTYgen verwendet werden.
-
Übertragen des Öffentlichen SSH Schlüssels auf den Server
Linux / MacOS
Für das Übertragen des öffentlichen Schlüssels auf den Server wird im ersten Schritt noch die SSH-Verbindung mittels Passwort-Authentifizierung genutzt. Das Werkzeug ssh-copy-id kopiert das entsprechende Identity-File auf den Server:
ssh-copy-id -i .ssh/id_rsa.pub -p <your_port> holu@<your_host>
Windows
Auf Windowssystemen erfolgt dieser Schritt manuell, dazu kopiert man den Inhalt des öffentlichen Schlüssels in die auf dem Server befindliche Datei
/home/holu/.ssh/authorized_keys
kopieren. Es ist auch möglich, dass diese Datei zuvor erstellt werden muss.
Testen der SSH Verbindung mit Zertifikatsbasierte Authentifizierung:
ssh -i .ssh/id_rsa -p <your_port> holu@<your_host>
Auf dem Server
Achtung: Wenn folgende Keywords auf "no" gesetzt werden, ist es nicht mehr möglich, sich mit einem Passwort über SSH anzumelden:
Keyword | Description |
---|---|
PasswordAuthentication | Legt fest ob Passwort-Authentifizierung möglich ist. |
ChallengeResponseAuthentication | Legt fest ob "Keyboard-interactive" Authentifizierung möglich ist. |
"ChallengeResponseAuthentication" ist veraltet und wurde abgelöst von "KbdInteractiveAuthentication".
Um alle Möglichkeiten zur Passwort-Authentifizierung zu blockieren, müssten beide Keywords auf "no" gesetzt werden. Der nächste Schritt, in dem erklärt wird wie man Zwei-Faktor-Authentifizierung einrichtet, funktioniert allerdings nur, wenn ChallengeResponseAuthentication
bzw. auf neuen Systemen KbdInteractiveAuthentication
auf "yes" gesetzt ist.
Die SSH Konfigurations-Datei kann jetzt unter /etc/ssh/sshd_config
bearbeitet werden.
-
Passwort-Authentifizierung blockieren
Um das einfache Authentifizieren über ein Passwort zu blockieren, muss die Konfiguration so aussehen:PasswordAuthentication no
Wenn Sie den letzten Schritt zum Einrichten einer "Zwei-Faktor-Authentifizierung" nicht ausführen möchten und Sie alle Möglichkeiten zur Passwort-Authentifizierung blockieren möchten, kann
ChallengeResponseAuthentication
bzw. auf neuen SystemenKbdInteractiveAuthentication
ebenfalls auf "no" gesetzt werden.Es ist auch möglich, die Passwort Authentifizierung für einen bestimmten Benutzer zu deaktivieren. Der Eintrag für die SSH Konfigurations-Datei sieht wie folgt aus:
Match User holu PasswordAuthentication no
- Public-Key-Authentifizierung erlauben
Es sollte geprüft werden obPubkeyAuthentication
auf "yes" gesetzt ist. Falls es auskommentiert ist, muss der Kommentar entfernt werden.PubkeyAuthentication yes
- Änderungen übernehmen
Um die Einstellungen zu aktivieren, ist es nötig den SSH-Dienst neuzustarten. Zuvor sollte aber die Konfiguration auf Fehler überprüft werden, dies geschieht mit diesem Befehl:Sollten beim Überprüfen der Konfiguration keine Fehler zu erkennen gewesen sein, kann der SSH Dienst mit folgendem Befehl neugestartet werden:sshd -t
systemctl restart sshd
Schritt 4 - Zwei Faktor Authentifizierung
Hier wird nach erfolgreichem Login nach einem Einmalpasswort verlangt, bevor der Loginvorgang abgeschlossen wird. Realisiert wird das Ganze über den Google Authenticator.
Hinweis: Um die zeitbasierten Einmalpasswörter (TOTP) zu erstellen, wird vorzugsweise ein Smartphone benötigt mit einer der aufgelisteten Apps.
Installation des Google Authenticator
- Ubuntu / Debian
apt install libpam-google-authenticator
- CentOS / RedHat
yum install epel-release yum install google-authenticator
- ArchLinux
pacman -S libpam-google-authenticator
- openSUSE / SLES
zypper install google-authenticator-libpam
Konfiguration des Google Authenticator
Nachdem das PAM-Modul installiert wurde, kann es wie folgt dargestellt initialisiert und konfiguriert werden.
Starten des Google Authenticator:
google-authenticator
Do you want authentication tokens to be time-based (y/n)
y
, es werden damit TOTP Tokens erstellt (zeitbasierte Einmalpasswörter) n
, dadurch werden HOTP Tokens erstellt (zählerbasierte Einmalpasswörter)
- Es wird nun ein QR-Code auf der SSH-Konsole angezeigt
Scannen Sie diesen Code mit einer kompatiblen App auf Ihrem Smartphone.
- Kopieren und verwahren Sie die unterhalb aufgelisteten Keys sicher.
Mit den emergency scratch codes kann Login ohne OTP durchgeführt werden.
Aktualisieren Sie die Datei .google_authenticator mit diesen Informationen.
Tippen Sie dazu y
ein.
- Bestätigen Sie sämtliche anderen Fragen mit
y
, oder bei gewünschten abweichenden Einstellungen mitn
.
Integration in die SSH-Anmeldung
Das Google Authenticator PAM-Modul ist fertig konfiguriert, nun können Dienste wie der SSH-Daemon angepasst werden, um eine 2-Faktor-Authentifizierung darüber zu ermöglichen.
-
Anpassungen in
/etc/pam.d/sshd
Hier muss die Zeile
@include common-auth
mit einem#
am Zeilenanfang Auskommentiert werden. Danach wird die Zeileauth required pam_google_authenticator.so
eingefügt. -
Anpassungen in
/etc/ssh/sshd_config
In der Konfigurationsdatei kann nun die
ChallengeResponseAuthentication
aufyes
gesetzt werden.ChallengeResponseAuthentication yes
Achtung, ab Ubuntu 22.04 heißt das Flag KbdInteractiveAuthentication und muss auf "yes" gesetzt werden:
KbdInteractiveAuthentication yes
Ebenso sollten die Einträge
UsePAM
undAuthenticationMethods
überprüft werden. der EintragUsePAM
sollte aufyes
stehen undAuthenticationMethods
sollte so aussehen:AuthenticationMethods publickey,keyboard-interactive
-
Neustarten des SSH Dienstes
systemctl restart sshd
Danach ist die Einrichtung der Zwei Faktor Authentifizierung abgeschlossen.
Ergebnis
In diesem Beitrag wurde mehrere Möglichkeiten beschrieben, mit deren Hilfe man den SSH Dienst auf Linux Systemen absichern kann.