Get Rewarded! We will reward you with up to €50 credit on your account for every tutorial that you write and we publish!

Absicherung des SSH Dienstes

profile picture
Author
Markus
Published
2019-04-30
Time to read
10 minutes reading time

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 Systemen KbdInteractiveAuthentication 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 ob PubkeyAuthentication 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:
    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 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
  1. 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)

  1. Es wird nun ein QR-Code auf der SSH-Konsole angezeigt

Scannen Sie diesen Code mit einer kompatiblen App auf Ihrem Smartphone.

  1. 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.

  1. Bestätigen Sie sämtliche anderen Fragen mit y, oder bei gewünschten abweichenden Einstellungen mit n.

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 Zeile auth required pam_google_authenticator.so eingefügt.

  • Anpassungen in /etc/ssh/sshd_config

    In der Konfigurationsdatei kann nun die ChallengeResponseAuthentication auf yes 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 und AuthenticationMethods überprüft werden. der Eintrag UsePAM sollte auf yes stehen und AuthenticationMethods 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.

License: MIT
Want to contribute?

Get Rewarded: Get up to €50 in credit! Be a part of the community and contribute. Do it for the money. Do it for the bragging rights. And do it to teach others!

Report Issue
Try Hetzner Cloud

Get €20/$20 free credit!

Valid until: 31 December 2024 Valid for: 3 months and only for new customers
Get started
Want to contribute?

Get Rewarded: Get up to €50 credit on your account for every tutorial you write and we publish!

Find out more