SSH Server: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
 
(10 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 84: 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.
 +
 +
Wechseln nach /etc/ssh
 +
'''cd /etc/ssh'''
 +
 +
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:
 +
<pre>
 +
Include /etc/ssh/sshd_config.d/*.conf
 +
Port 2222
 +
#PermitRootLogin yes
 +
#PermitRootLogin no
 +
PermitRootLogin without-password
 +
AllowGroups ssh-users
 +
PasswordAuthentication no
 +
KbdInteractiveAuthentication no
 +
UsePAM yes
 +
X11Forwarding yes
 +
PrintMotd no
 +
AcceptEnv LANG LC_* COLORTERM NO_COLOR
 +
Subsystem sftp /usr/lib/openssh/sftp-server
 +
</pre>
 +
 +
Konfiguration auf Syntaxfehler prüfen:
 +
'''sshd -t'''
 +
 +
Alle gesetzen Werte auch die Defaultwerte anschauen
 +
'''sshd -T'''
 +
 +
Erst danach neu laden:
 +
'''systemctl reload ssh'''
 +
==Aufgabe==
 +
Für die folgenden Rechner passt die Konfiguration an.
 +
*fw
 +
*ns
 +
*dhcp
 +
*smb
 +
Übernehmt die Konfiguration von oben
 +
*An folgendest ist zu denken
 +
**Achtet drauf das von eurem Host und vom Client die Öffentlichen für den user kit auf alle Rechner  übertragen wurden.
 +
**Erst dann kann man '''PasswordAuthentication no''' stellen
 +
**Passt für den Host und für den Rechner Client die Konfiguration an
 +
**Denkt daran die Gruppe '''ssh-user''' und den user '''kit''' hinzuefügen.
 +
;Beispiel für die config vom Host bezüglich ProxyJump '''Port beachten'''
 +
Host fw
 +
  Hostname 192.168.7.213
 +
  Port 2222
 +
  User kit
 +
 +
Host ns
 +
  Hostname 10.88.213.21
 +
  Port 2222
 +
  ProxyJump kit@fw
 +
;Auf Rocky muss man mehr tun
 +
SELinux sagen, das ssh auf einem anderen Port lauschen darf
 +
sudo semanage port -a -t ssh_port_t -p tcp 2222
 +
Firewall noch freischalten
 +
sudo firewall-cmd --zone=public --add-port=2222/tcp --permanent
 +
sudo firewall-cmd --reload
  
 
== Siehe auch ==
 
== Siehe auch ==

Aktuelle Version vom 22. April 2026, 10:01 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.

Wechseln nach /etc/ssh

cd /etc/ssh

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
Port 2222
#PermitRootLogin yes
#PermitRootLogin no
PermitRootLogin without-password
AllowGroups ssh-users
PasswordAuthentication no
KbdInteractiveAuthentication no
UsePAM yes
X11Forwarding yes
PrintMotd no
AcceptEnv LANG LC_* COLORTERM NO_COLOR
Subsystem	sftp	/usr/lib/openssh/sftp-server

Konfiguration auf Syntaxfehler prüfen:

sshd -t

Alle gesetzen Werte auch die Defaultwerte anschauen

sshd -T

Erst danach neu laden:

systemctl reload ssh

Aufgabe

Für die folgenden Rechner passt die Konfiguration an.

  • fw
  • ns
  • dhcp
  • smb

Übernehmt die Konfiguration von oben

  • An folgendest ist zu denken
    • Achtet drauf das von eurem Host und vom Client die Öffentlichen für den user kit auf alle Rechner übertragen wurden.
    • Erst dann kann man PasswordAuthentication no stellen
    • Passt für den Host und für den Rechner Client die Konfiguration an
    • Denkt daran die Gruppe ssh-user und den user kit hinzuefügen.
Beispiel für die config vom Host bezüglich ProxyJump Port beachten
Host fw
 Hostname 192.168.7.213
 Port 2222
 User kit
Host ns
 Hostname 10.88.213.21
 Port 2222
 ProxyJump kit@fw
Auf Rocky muss man mehr tun

SELinux sagen, das ssh auf einem anderen Port lauschen darf

sudo semanage port -a -t ssh_port_t -p tcp 2222

Firewall noch freischalten

sudo firewall-cmd --zone=public --add-port=2222/tcp --permanent
sudo firewall-cmd --reload

Siehe auch