SSH Server: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
 
(13 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 24: Zeile 24:
 
=== Starten / Stoppen ===
 
=== Starten / Stoppen ===
 
Dienst starten
 
Dienst starten
 +
'''systemctl start ssh'''
  
'''systemctl start ssh'''
 
 
Dienst stoppen  
 
Dienst stoppen  
   
+
'''systemctl stop ssh'''
'''systemctl stop ssh'''
+
 
 
Dienst neu starten (z. B. nach Konfigurationsänderung)
 
Dienst neu starten (z. B. nach Konfigurationsänderung)
 
+
'''systemctl restart ssh'''
'''systemctl restart ssh'''  
 
 
 
'''Hinweis:''' <code>restart</code> trennt alle aktiven SSH-Verbindungen sofort.
 
Wer eingeloggte Sitzungen nicht unterbrechen will, verwendet stattdessen:
 
systemctl reload ssh    # Konfiguration neu laden ohne Verbindungen zu trennen
 
  
 
=== Autostart beim Systemstart ===
 
=== Autostart beim Systemstart ===
 +
SSH automatisch beim Booten starten
 +
'''systemctl enable ssh'''
 +
 
 +
Autostart deaktivieren
 +
'''systemctl disable ssh'''
  
systemctl enable ssh    # SSH automatisch beim Booten starten
+
Status prüfen
systemctl disable ssh    # Autostart deaktivieren
+
  '''systemctl status ssh'''
 
 
=== Status prüfen ===
 
 
 
  systemctl status ssh
 
  
 
Zeigt ob der Dienst läuft, seit wann, die PID und die letzten Logzeilen.
 
Zeigt ob der Dienst läuft, seit wann, die PID und die letzten Logzeilen.
  
=== Logs verfolgen ===
+
Logs verfolgen
 
+
  '''journalctl -fu ssh'''
  journalctl -fu ssh
 
  
 
* <code>-f</code> – folgt dem Log in Echtzeit (wie <code>tail -f</code>)
 
* <code>-f</code> – folgt dem Log in Echtzeit (wie <code>tail -f</code>)
Zeile 58: Zeile 53:
  
 
Nur die letzten 50 Zeilen anzeigen:
 
Nur die letzten 50 Zeilen anzeigen:
  journalctl -u ssh -n 50
+
  '''journalctl -u ssh -n 50'''
  
 
Logs eines bestimmten Zeitraums:
 
Logs eines bestimmten Zeitraums:
  journalctl -u ssh --since "2025-04-01 00:00" --until "2025-04-01 23:59"
+
  '''journalctl -u ssh --since "2025-04-01 00:00" --until "2025-04-01 23:59"
 +
'''
  
 
== Konfigurationsverzeichnis ==
 
== Konfigurationsverzeichnis ==
 
+
  '''ls /etc/ssh'''
  ls /etc/ssh
 
  
 
  moduli              sshd_config.d            ssh_host_ed25519_key.pub
 
  moduli              sshd_config.d            ssh_host_ed25519_key.pub
Zeile 89: Zeile 84:
 
| <code>ssh_host_*_key.pub</code> || Öffentliche Host Keys (werden dem Client beim Verbindungsaufbau gezeigt)
 
| <code>ssh_host_*_key.pub</code> || Öffentliche Host Keys (werden dem Client beim Verbindungsaufbau gezeigt)
 
|}
 
|}
 +
 +
= Die Hauptkonfigurationsdatei =
 +
 +
Die Hauptkonfigurationsdatei des SSH-Servers ist <code>/etc/ssh/sshd_config</code>.
 +
Sie enthält viele auskommentierte Standardwerte. Um einen besseren Überblick zu bekommen,
 +
empfiehlt es sich, zuerst ein Backup anzulegen und dann eine bereinigte Version zu erstellen.
 +
 +
Backup der Originaldatei anlegen:
 +
'''cp sshd_config sshd_config.org'''
 +
 +
Nur aktive (nicht auskommentierte) Zeilen in die Konfigurationsdatei schreiben:
 +
'''grep "^[^#]" sshd_config.org > sshd_config'''
 +
 +
Ergebnis anzeigen:
 +
'''cat sshd_config'''
 +
 +
Die Standardkonfiguration unter Debian/Ubuntu enthält dann folgende aktive Einstellungen:
 +
Include /etc/ssh/sshd_config.d/*.conf
 +
KbdInteractiveAuthentication no
 +
UsePAM yes
 +
X11Forwarding yes
 +
PrintMotd no
 +
AcceptEnv LANG LC_* COLORTERM NO_COLOR
 +
Subsystem sftp /usr/lib/openssh/sftp-server
 +
 +
== Erklärung der Standardeinstellungen ==
 +
 +
{| class="wikitable"
 +
! Option !! Wert !! Erklärung
 +
|-
 +
| <code>Include</code>
 +
| <code>/etc/ssh/sshd_config.d/*.conf</code>
 +
| Bindet alle <code>.conf</code>-Dateien aus dem Verzeichnis <code>/etc/ssh/sshd_config.d/</code> ein. Ermöglicht modulare Konfiguration. '''Hinweis:''' <code>Include</code> steht ganz am Anfang, da Drop-in-Dateien Werte aus <code>sshd_config</code> überschreiben können.
 +
|-
 +
| <code>KbdInteractiveAuthentication</code>
 +
| <code>no</code>
 +
| Deaktiviert die tastaturbasierte interaktive Authentifizierung (früher <code>ChallengeResponseAuthentication</code>). Betrifft z. B. Einmalpasswörter (OTP) oder PAM-Abfragen mit Benutzerinteraktion.
 +
|-
 +
| <code>UsePAM</code>
 +
| <code>yes</code>
 +
| Aktiviert PAM (Pluggable Authentication Modules) – das zentrale Authentifizierungssystem unter Linux. Übernimmt Passwortprüfung, Sitzungsverwaltung und Zugriffskontrolle. Bleibt auch bei deaktiviertem Passwort-Login aktiv.
 +
|-
 +
| <code>X11Forwarding</code>
 +
| <code>yes</code>
 +
| Erlaubt die Weiterleitung grafischer Anwendungen über SSH (<code>ssh -X</code>). Auf reinen Produktionsservern empfiehlt sich <code>no</code>, da es ein potenzielles Sicherheitsrisiko darstellt.
 +
|-
 +
| <code>PrintMotd</code>
 +
| <code>no</code>
 +
| Deaktiviert die Ausgabe der Message of the Day (<code>/etc/motd</code>) durch den SSH-Daemon. Die Ausgabe übernimmt stattdessen PAM, um doppelte Ausgaben zu vermeiden.
 +
|-
 +
| <code>AcceptEnv</code>
 +
| <code>LANG LC_* COLORTERM NO_COLOR</code>
 +
| Erlaubt dem Client, Umgebungsvariablen zu übertragen: Sprache (<code>LANG</code>), Locale-Einstellungen (<code>LC_*</code>), Terminal-Farbunterstützung (<code>COLORTERM</code>) und Farb-Deaktivierung (<code>NO_COLOR</code>).
 +
|-
 +
| <code>Subsystem sftp</code>
 +
| <code>/usr/lib/openssh/sftp-server</code>
 +
| Aktiviert das SFTP-Subsystem und gibt den Pfad zum SFTP-Server-Programm an. Ohne diese Zeile sind keine SFTP-Verbindungen möglich.
 +
|}
 +
 +
== Empfohlene Konfiguration für Einsteiger ==
 +
 +
Die folgenden Einstellungen werden direkt in <code>/etc/ssh/sshd_config</code> gesetzt.
 +
Nach jeder Änderung muss der SSH-Dienst neu geladen werden:
 +
'''systemctl reload ssh'''
 +
 +
=== 1. Port ändern ===
 +
 +
Standardmäßig lauscht SSH auf Port 22. Automatisierte Bots scannen das Internet permanent nach
 +
offenen Port-22-Verbindungen. Ein anderer Port hält diesen Lärm fern.
 +
'''Port 2222'''
 +
 +
'''Hinweis:''' Der Port selbst macht den Server nicht sicherer – er reduziert aber das Rauschen
 +
in den Logs erheblich. Wähle einen Port zwischen 1024 und 65535 der nicht anderweitig belegt ist.
 +
 +
Nach der Änderung muss der Port beim Verbinden angegeben werden:
 +
'''ssh -p 2222 user@server'''
 +
 +
'''Wichtig:''' Vor dem Neustart sicherstellen, dass der neue Port in der Firewall freigegeben ist –
 +
sonst sperrt man sich selbst aus:
 +
'''ufw allow 2222/tcp'''
 +
 +
=== 2. PermitRootLogin no ===
 +
 +
Verbietet den direkten Login als <code>root</code> über SSH. Root-Zugriff sollte immer über einen
 +
normalen Nutzer mit <code>sudo</code> erfolgen.
 +
'''PermitRootLogin no'''
 +
 +
'''Hinweis:''' Sicherstellen, dass mindestens ein normaler Nutzer mit <code>sudo</code>-Rechten
 +
existiert, bevor diese Option gesetzt wird – sonst verliert man den administrativen Zugang.
 +
 +
=== 3. PasswordAuthentication no ===
 +
 +
Deaktiviert den Passwort-Login vollständig. Verbindungen sind dann nur noch per Public Key möglich.
 +
'''PasswordAuthentication no'''
 +
 +
'''Wichtig:''' Vorher sicherstellen, dass der eigene Public Key auf dem Server hinterlegt ist –
 +
sonst sperrt man sich selbst aus:
 +
'''ssh-copy-id -p 2222 user@server'''
 +
 +
Siehe auch: [[SSH-Verbindungsaufbau#Phase 2: User Authentication]]
 +
 +
=== 4. AllowUsers ===
 +
 +
Erlaubt nur bestimmten Benutzern den SSH-Zugang. Alle anderen Nutzer werden abgewiesen,
 +
auch wenn sie ein gültiges Schlüsselpaar haben.
 +
'''AllowUsers alice bob'''
 +
 +
Alternativ kann man ganze Gruppen erlauben:
 +
'''AllowGroups ssh-users'''
 +
 +
Die Gruppe anlegen und Nutzer hinzufügen:
 +
'''groupadd ssh-users'''
 +
'''usermod -aG ssh-users alice'''
 +
 +
'''Hinweis:''' <code>AllowUsers</code> und <code>AllowGroups</code> können nicht kombiniert werden –
 +
nur eine der beiden Optionen verwenden.
 +
 +
=== 5. ClientAliveInterval und ClientAliveCountMax ===
 +
 +
Hängende Verbindungen – z. B. nach einem Netzwerkabbruch – bleiben sonst offen und belegen
 +
Ressourcen. Diese beiden Optionen trennen inaktive Verbindungen automatisch.
 +
'''ClientAliveInterval 60'''
 +
'''ClientAliveCountMax 3'''
 +
 +
* <code>ClientAliveInterval 60</code> – Server schickt alle 60 Sekunden ein Lebenszeichen an den Client
 +
* <code>ClientAliveCountMax 3</code> – Nach 3 ausbleibenden Antworten wird die Verbindung getrennt
 +
 +
Die Verbindung wird also nach spätestens 3 × 60 = '''180 Sekunden''' ohne Antwort getrennt.
 +
 +
=== 6. X11Forwarding no ===
 +
 +
Wie bereits im Abschnitt [[#Erklärung der Standardeinstellungen|Standardeinstellungen]] erklärt,
 +
ist X11Forwarding auf Produktionsservern ohne GUI ein unnötiges Sicherheitsrisiko.
 +
'''X11Forwarding no'''
 +
 +
=== 7. Banner ===
 +
 +
Zeigt vor dem Login eine Warnung oder einen Hinweis an. Nützlich z. B. für rechtliche Hinweise
 +
oder um unbefugte Nutzer zu warnen.
 +
 +
Datei anlegen:
 +
'''nano /etc/ssh/banner'''
 +
 +
Beispielinhalt:
 +
Unbefugter Zugriff ist strafbar.
 +
Alle Aktivitaeten werden protokolliert.
 +
 +
In <code>sshd_config</code> eintragen:
 +
'''Banner /etc/ssh/banner'''
 +
 +
'''Hinweis:''' Der Banner wird vor der Authentifizierung angezeigt – also bevor der Nutzer
 +
sein Passwort oder seinen Schlüssel verwendet.
 +
 +
== Fertige Konfiguration ==
 +
 +
Nach allen Änderungen sieht die <code>sshd_config</code> so aus:
 +
 +
Include /etc/ssh/sshd_config.d/*.conf
 +
KbdInteractiveAuthentication no
 +
UsePAM yes
 +
X11Forwarding no
 +
PrintMotd no
 +
AcceptEnv LANG LC_* COLORTERM NO_COLOR
 +
Subsystem sftp /usr/lib/openssh/sftp-server
 +
 +
Port 2222
 +
PermitRootLogin no
 +
PasswordAuthentication no
 +
AllowUsers alice bob
 +
ClientAliveInterval 60
 +
ClientAliveCountMax 3
 +
Banner /etc/ssh/banner
 +
 +
Konfiguration auf Syntaxfehler prüfen:
 +
'''sshd -t'''
 +
 +
Erst danach neu laden:
 +
'''systemctl reload ssh'''
  
 
== Siehe auch ==
 
== Siehe auch ==

Aktuelle Version vom 11. April 2026, 16:59 Uhr

SSH-Server

Der SSH-Server ermöglicht es, eingehende SSH-Verbindungen entgegenzunehmen. Unter Debian/Ubuntu läuft er als Systemdienst und wird über systemctl verwaltet.

Pakete

SSH besteht aus dem Metapaket
  • ssh
Dieses beinhaltet die Pakete
  • openssh-client – der SSH-Client (für ausgehende Verbindungen)
  • openssh-server – der SSH-Daemon (für eingehende Verbindungen)
  • openssh-sftp-server – SFTP-Subsystem für Dateiübertragungen

Installation:

apt install ssh

Dienstverwaltung

Der SSH-Server läuft als Systemdienst und wird über systemctl verwaltet. Für Logs wird journalctl verwendet.

Starten / Stoppen

Dienst starten

systemctl start ssh 

Dienst stoppen

systemctl stop ssh

Dienst neu starten (z. B. nach Konfigurationsänderung)

systemctl restart ssh

Autostart beim Systemstart

SSH automatisch beim Booten starten

systemctl enable ssh
 

Autostart deaktivieren

systemctl disable ssh

Status prüfen

systemctl status ssh

Zeigt ob der Dienst läuft, seit wann, die PID und die letzten Logzeilen.

Logs verfolgen

journalctl -fu ssh
  • -f – folgt dem Log in Echtzeit (wie tail -f)
  • -u ssh – filtert nur auf den SSH-Dienst

Nützlich zum Debuggen von fehlgeschlagenen Verbindungsversuchen oder Konfigurationsfehlern.

Nur die letzten 50 Zeilen anzeigen:

journalctl -u ssh -n 50

Logs eines bestimmten Zeitraums:

journalctl -u ssh --since "2025-04-01 00:00" --until "2025-04-01 23:59"

Konfigurationsverzeichnis

ls /etc/ssh
moduli               sshd_config.d            ssh_host_ed25519_key.pub
ssh_config           ssh_host_ecdsa_key        ssh_host_rsa_key
ssh_config.d         ssh_host_ecdsa_key.pub    ssh_host_rsa_key.pub
sshd_config          ssh_host_ed25519_key
Datei/Verzeichnis Bedeutung
sshd_config Hauptkonfiguration des SSH-Servers
sshd_config.d/ Optionale Drop-in-Konfigurationen (werden von sshd_config eingelesen)
ssh_config Systemweite Client-Konfiguration (gilt für alle Nutzer)
ssh_config.d/ Drop-ins für die systemweite Client-Konfiguration
moduli Parameter für den Diffie-Hellman-Schlüsselaustausch
ssh_host_*_key Private Host Keys des Servers (niemals weitergeben)
ssh_host_*_key.pub Öffentliche Host Keys (werden dem Client beim Verbindungsaufbau gezeigt)

Die Hauptkonfigurationsdatei

Die Hauptkonfigurationsdatei des SSH-Servers ist /etc/ssh/sshd_config. Sie enthält viele auskommentierte Standardwerte. Um einen besseren Überblick zu bekommen, empfiehlt es sich, zuerst ein Backup anzulegen und dann eine bereinigte Version zu erstellen.

Backup der Originaldatei anlegen:

cp sshd_config sshd_config.org

Nur aktive (nicht auskommentierte) Zeilen in die Konfigurationsdatei schreiben:

grep "^[^#]" sshd_config.org > sshd_config

Ergebnis anzeigen:

cat sshd_config

Die Standardkonfiguration unter Debian/Ubuntu enthält dann folgende aktive Einstellungen:

Include /etc/ssh/sshd_config.d/*.conf
KbdInteractiveAuthentication no
UsePAM yes
X11Forwarding yes
PrintMotd no
AcceptEnv LANG LC_* COLORTERM NO_COLOR
Subsystem	sftp	/usr/lib/openssh/sftp-server

Erklärung der Standardeinstellungen

Option Wert Erklärung
Include /etc/ssh/sshd_config.d/*.conf Bindet alle .conf-Dateien aus dem Verzeichnis /etc/ssh/sshd_config.d/ ein. Ermöglicht modulare Konfiguration. Hinweis: Include steht ganz am Anfang, da Drop-in-Dateien Werte aus sshd_config überschreiben können.
KbdInteractiveAuthentication no Deaktiviert die tastaturbasierte interaktive Authentifizierung (früher ChallengeResponseAuthentication). Betrifft z. B. Einmalpasswörter (OTP) oder PAM-Abfragen mit Benutzerinteraktion.
UsePAM yes Aktiviert PAM (Pluggable Authentication Modules) – das zentrale Authentifizierungssystem unter Linux. Übernimmt Passwortprüfung, Sitzungsverwaltung und Zugriffskontrolle. Bleibt auch bei deaktiviertem Passwort-Login aktiv.
X11Forwarding yes Erlaubt die Weiterleitung grafischer Anwendungen über SSH (ssh -X). Auf reinen Produktionsservern empfiehlt sich no, da es ein potenzielles Sicherheitsrisiko darstellt.
PrintMotd no Deaktiviert die Ausgabe der Message of the Day (/etc/motd) durch den SSH-Daemon. Die Ausgabe übernimmt stattdessen PAM, um doppelte Ausgaben zu vermeiden.
AcceptEnv LANG LC_* COLORTERM NO_COLOR Erlaubt dem Client, Umgebungsvariablen zu übertragen: Sprache (LANG), Locale-Einstellungen (LC_*), Terminal-Farbunterstützung (COLORTERM) und Farb-Deaktivierung (NO_COLOR).
Subsystem sftp /usr/lib/openssh/sftp-server Aktiviert das SFTP-Subsystem und gibt den Pfad zum SFTP-Server-Programm an. Ohne diese Zeile sind keine SFTP-Verbindungen möglich.

Empfohlene Konfiguration für Einsteiger

Die folgenden Einstellungen werden direkt in /etc/ssh/sshd_config gesetzt. Nach jeder Änderung muss der SSH-Dienst neu geladen werden:

systemctl reload ssh

1. Port ändern

Standardmäßig lauscht SSH auf Port 22. Automatisierte Bots scannen das Internet permanent nach offenen Port-22-Verbindungen. Ein anderer Port hält diesen Lärm fern.

Port 2222

Hinweis: Der Port selbst macht den Server nicht sicherer – er reduziert aber das Rauschen in den Logs erheblich. Wähle einen Port zwischen 1024 und 65535 der nicht anderweitig belegt ist.

Nach der Änderung muss der Port beim Verbinden angegeben werden:

ssh -p 2222 user@server

Wichtig: Vor dem Neustart sicherstellen, dass der neue Port in der Firewall freigegeben ist – sonst sperrt man sich selbst aus:

ufw allow 2222/tcp

2. PermitRootLogin no

Verbietet den direkten Login als root über SSH. Root-Zugriff sollte immer über einen normalen Nutzer mit sudo erfolgen.

PermitRootLogin no

Hinweis: Sicherstellen, dass mindestens ein normaler Nutzer mit sudo-Rechten existiert, bevor diese Option gesetzt wird – sonst verliert man den administrativen Zugang.

3. PasswordAuthentication no

Deaktiviert den Passwort-Login vollständig. Verbindungen sind dann nur noch per Public Key möglich.

PasswordAuthentication no

Wichtig: Vorher sicherstellen, dass der eigene Public Key auf dem Server hinterlegt ist – sonst sperrt man sich selbst aus:

ssh-copy-id -p 2222 user@server

Siehe auch: SSH-Verbindungsaufbau#Phase 2: User Authentication

4. AllowUsers

Erlaubt nur bestimmten Benutzern den SSH-Zugang. Alle anderen Nutzer werden abgewiesen, auch wenn sie ein gültiges Schlüsselpaar haben.

AllowUsers alice bob

Alternativ kann man ganze Gruppen erlauben:

AllowGroups ssh-users

Die Gruppe anlegen und Nutzer hinzufügen:

groupadd ssh-users
usermod -aG ssh-users alice

Hinweis: AllowUsers und AllowGroups können nicht kombiniert werden – nur eine der beiden Optionen verwenden.

5. ClientAliveInterval und ClientAliveCountMax

Hängende Verbindungen – z. B. nach einem Netzwerkabbruch – bleiben sonst offen und belegen Ressourcen. Diese beiden Optionen trennen inaktive Verbindungen automatisch.

ClientAliveInterval 60
ClientAliveCountMax 3
  • ClientAliveInterval 60 – Server schickt alle 60 Sekunden ein Lebenszeichen an den Client
  • ClientAliveCountMax 3 – Nach 3 ausbleibenden Antworten wird die Verbindung getrennt

Die Verbindung wird also nach spätestens 3 × 60 = 180 Sekunden ohne Antwort getrennt.

6. X11Forwarding no

Wie bereits im Abschnitt Standardeinstellungen erklärt, ist X11Forwarding auf Produktionsservern ohne GUI ein unnötiges Sicherheitsrisiko.

X11Forwarding no

7. Banner

Zeigt vor dem Login eine Warnung oder einen Hinweis an. Nützlich z. B. für rechtliche Hinweise oder um unbefugte Nutzer zu warnen.

Datei anlegen:

nano /etc/ssh/banner

Beispielinhalt:

Unbefugter Zugriff ist strafbar.
Alle Aktivitaeten werden protokolliert.

In sshd_config eintragen:

Banner /etc/ssh/banner

Hinweis: Der Banner wird vor der Authentifizierung angezeigt – also bevor der Nutzer sein Passwort oder seinen Schlüssel verwendet.

Fertige Konfiguration

Nach allen Änderungen sieht die sshd_config so aus:

Include /etc/ssh/sshd_config.d/*.conf
KbdInteractiveAuthentication no
UsePAM yes
X11Forwarding no
PrintMotd no
AcceptEnv LANG LC_* COLORTERM NO_COLOR
Subsystem	sftp	/usr/lib/openssh/sftp-server

Port 2222
PermitRootLogin no
PasswordAuthentication no
AllowUsers alice bob
ClientAliveInterval 60
ClientAliveCountMax 3
Banner /etc/ssh/banner

Konfiguration auf Syntaxfehler prüfen:

sshd -t

Erst danach neu laden:

systemctl reload ssh

Siehe auch