SSH Server: Unterschied zwischen den Versionen
| (10 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 | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
=== Autostart beim Systemstart === | === Autostart beim Systemstart === | ||
| + | SSH automatisch beim Booten starten | ||
| + | '''systemctl enable ssh''' | ||
| + | |||
| + | Autostart deaktivieren | ||
| + | '''systemctl disable ssh''' | ||
| − | + | Status prüfen | |
| − | + | '''systemctl status ssh''' | |
| − | |||
| − | |||
| − | |||
| − | 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 | |
| − | + | '''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 62: | 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 93: | 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 (wietail -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 ClientClientAliveCountMax 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
- SSH-Verbindungsaufbau – Wie eine SSH-Verbindung aufgebaut wird
- SSH-Config – Client-seitige Konfiguration (~/.ssh/config)
- sshd_config – Serverkonfiguration im Detail