Maker-Hub bei GitHub Maker-Hub bei Printables Maker-Hub bei MakerWorld Maker-Hub bei YouTube

In der heutigen vernetzten Welt ist die sichere Verwaltung von Servern und Netzwerkgeräten von zentraler Bedeutung. Eine der effektivsten Methoden zur sicheren Fernverwaltung ist die Nutzung von SSH (Secure Shell). SSH ermöglicht es, über eine verschlüsselte Verbindung sicher auf entfernte Systeme zuzugreifen und diese zu verwalten, wodurch sowohl die Vertraulichkeit als auch die Integrität der Kommunikation gewährleistet wird.

In diesem Tutorial wirst du lernen:

  • Was SSH ist und warum es wichtig ist
  • Wie du überprüfst, ob OpenSSH auf einem Debian-System bereits vorinstalliert ist
  • Schritte zur manuellen Installation von OpenSSH auf einem Debian-System
  • Grundkonfiguration von OpenSSH für sichere Verbindungen
  • Nützliche SSH-Befehle und Best Practices

Voraussetzung

Für dieses Tutorial verwende ich einen Laptop, auf dem ich Debian 12 mithilfe einer Netzwerkinstallation von einer Minimal-CD installiert habe. Dabei wurde lediglich die grundlegende Software installiert, und es wurde nur der Root-Benutzer angelegt. Diese Konfiguration dient als Vorbereitung für weitere Tutorials. Natürlich kannst du deine bevorzugte Konfiguration wählen.

Stelle sicher, dass du bereits als Root-Benutzer oder als normaler Benutzer direkt auf dem Debian-System angemeldet bist. Wenn du dich als normaler Benutzer anmeldest, solltest du das Root-Passwort kennen oder über sudo-Rechte verfügen. Falls OpenSSH bereits installiert ist, kannst du dich auch über SSH verbinden. Bei der Arbeit als Root benötigst du sudo nicht am Anfang der Befehle.

Netinst (Netzwerkinstallations)

Netinst, kurz für „Network Installation“, ist eine Installationsmethode für Debian, bei der nur ein minimaler Satz an Software von einer kleinen CD oder einem USB-Stick installiert wird. Diese Minimal-CD, oft als „Netinstall-CD“ bezeichnet, enthält nur die wesentlichen Systemkomponenten sowie den Installer selbst. Der Rest der Software wird während der Installation über das Netzwerk heruntergeladen.

Was ist SSH?

SSH (Secure Shell) ist ein Netzwerkprotokoll, das sichere, verschlüsselte Verbindungen zu entfernten Systemen ermöglicht. Es ersetzt unsichere Methoden wie Telnet und unverschlüsselte FTP-Übertragungen, indem es sowohl die Integrität der übertragenen Daten als auch die Vertraulichkeit der Kommunikation gewährleistet. Mit SSH können Administratoren sicher auf Server und Netzwerkgeräte zugreifen, Befehle ausführen, Dateien übertragen und Tunnel für andere Protokolle erstellen. Dies macht SSH zu einem unverzichtbaren Werkzeug für die sichere Verwaltung und Automatisierung von IT-Infrastrukturen.

Was ist OpenSSH

OpenSSH, eine freie Implementierung des SSH-Protokolls, ist in vielen Linux-Distributionen, einschließlich Debian, oft bereits vorinstalliert. Dennoch ist es wichtig zu wissen, wie man OpenSSH manuell installiert und konfiguriert, um die volle Kontrolle über die eigene Umgebung zu haben. Bei der Einrichtung eines Servers wähle ich immer eine Minimalkonfiguration (NetInstall) und füge dann gezielt die benötigten Komponenten hinzu.

Prüfen ob OpenSSH installiert ist

Um zu überprüfen, ob OpenSSH auf einem Debian-System vorinstalliert ist, kannst du den folgenden Befehl verwenden, um den Status des OpenSSH-Servers zu überprüfen:

sudo systemctl status sshCode-Sprache: Bash (bash)
SSH ist aktive

OpenSSH installieren

Der erste Schritt ist, das Paketverzeichnis zu aktualisieren:

sudo apt-get update -yCode-Sprache: Bash (bash)

Danach installieren wir OpenSSH:

sudo apt install -y openssh-serverCode-Sprache: Bash (bash)

Ich ändere gerne den Port für SSH, da viele Port-Scans auf den gängigen Port laufen. Das ist zwar nur ein minimaler Sicherheitsgewinn, aber so werden zumindest die Script-Kiddies abgefangen. Dazu passen wir die sshd_config an:

sudo nano /etc/ssh/sshd_config

Füge folgende Zeilen hinzu oder bearbeite sie:

Port 9922Code-Sprache: Bash (bash)

Da ich mit Root arbeite, erlaube ich temporär den SSH-Login mittels Root:

PermitRootLogin yesCode-Sprache: Bash (bash)

HinweisAchtung: Erlaube temporär den SSH-Login mittels Root nur für die Konfiguration. Entferne diese Einstellung später wieder und verwende sie niemals auf einem produktiven System!

Zu Schuss müssen wir OpenSSH nur noch aktivieren

sudo systemctl start ssh
sudo systemctl enable sshCode-Sprache: Bash (bash)

OpenSSH für sichere Verbindungen

Um eine wirklich sichere Verbindung zu gewährleisten, werden wir nun Zertifikate erstellen und installieren.
Zuerst erstellen wir die Verzeichnisstruktur, falls diese noch nicht durch SSL vorhanden ist:

Verzeichnis für die privaten Schlüssel

sudo mkdir -p /etc/ssl/private/
sudo chown root:root /etc/ssl/private/
sudo chmod 700 /etc/ssl/private/Code-Sprache: Bash (bash)

Verzeichnis für die öffentlichen Schlüssel/Zertifikate

sudo mkdir -p /etc/ssl/certs/
sudo chown root:root /etc/ssl/certs/
sudo chmod 755 /etc/ssl/certs/Code-Sprache: Bash (bash)

Auf das Verzeichnis /etc/ssl/private darf nur Root zugreifen (chmod 700). Damit stellen wir sicher, dass die privaten Schlüssel geschützt sind. Auf das Verzeichnis /etc/ssl/certs darf nur Root schreiben, aber es kann von allen anderen gelesen werden (chmod 755).

Falls du bereits ein SSH Root CA-Schlüssel-Paar hast, kannst du diesen Schritt überspringen.

sudo ssh-keygen -t ed25519 -f /etc/ssl/private/MakerHubSSHRootCA.key -C "MakerHub SSH Root CA"Code-Sprache: Bash (bash)
Erklärung des Befehls:
  • ssh-keygen: Dies ist das Kommando, das verwendet wird, um ein neues Schlüsselpaar (privater und öffentlicher Schlüssel) zu generieren.
  • -t ed25519: Gibt den Typ des Schlüssels an, der generiert werden soll. ed25519 ist ein moderner, sicherer und effizienter Schlüsseltyp für SSH.
  • -f /etc/ssl/private/MakerHubSSHRootCA.key: Gibt den Dateipfad und den Namen für den privaten Schlüssel an. Der Schlüssel wird im Verzeichnis /etc/ssl/private mit dem Namen MakerHubSSHRootCA.key gespeichert.
  • -C "MakerHub Root CA": Fügt einen Kommentar zum Schlüssel hinzu, in diesem Fall „MakerHub SSH Root CA“, der bei der Identifizierung des Schlüssels hilft.

Der öffentliche Schlüssel wird ebenfalls mit diesem Befehl generiert. Daher müssen wir den öffentlichen Schlüssel ins richtige Verzeichnis kopieren und die Berechtigungen anpassen:

sudo mv /etc/ssl/private/MakerHubSSHRootCA.key.pub /etc/ssl/certs/MakerHubSSHRootCA.pub
sudo chmod 644 /etc/ssl/certs/MakerHubSSHRootCA.pubCode-Sprache: Bash (bash)

Nun können wir den eigentlichen Schlüssel für den SSH-Server erstellen. Achte darauf, keine Passphrase für den privaten Schlüssel zu erstellen. Es ist zwar möglich, in der Serverumgebung mit Schlüsseln zu arbeiten, die eine Passphrase haben, aber dies ist eher unüblich.

sudo ssh-keygen -t ed25519 -f /etc/ssl/private/AuthServerSSH.key -C "MakerHub Authentication Server"Code-Sprache: Bash (bash)

Auch hier müssen wir wieder den öffentlichen Schlüssel in das richtige Verzeichnis kopieren und die Rechte anpassen:

sudo mv /etc/ssl/private/AuthServerSSH.key.pub /etc/ssl/certs/AuthServerSSH.pub
sudo chmod 644 /etc/ssl/certs/AuthServerSSH.pubCode-Sprache: Bash (bash)

Ebenfalls müssen wir die Rechte für den privaten Schlüssel anpassen:

sudo chmod 600 /etc/ssl/private/AuthServerSSH.keyCode-Sprache: Bash (bash)

Wir signieren den öffentlichen Schlüssel mit unserem Root CA-Schlüssel, damit wir ein gültiges Zertifikat bekommen:

sudo ssh-keygen -s /etc/ssl/private/MakerHubSSHRootCA.key -I auth-server.maker-hub.local -h -n auth-server.maker-hub.local -V +520w /etc/ssl/certs/AuthServerSSH.pubCode-Sprache: Bash (bash)
Erklärung des Befehls:
  • -s /etc/ssl/private/MakerHubSSHRootCA.key: Gibt den Pfad zum privaten Schlüssel der Root CA an, der verwendet wird, um das Zertifikat zu signieren.
  • -I auth-server.maker-hub.local: Setzt den Schlüssel- oder Zertifikatsidentifikator auf auth-server.maker-hub.local. Dies dient als eindeutige Bezeichnung für das Zertifikat.
  • -h: Gibt an, dass das Zertifikat für einen Host ist, nicht für einen Benutzer. Dies wird verwendet, um SSH-Host-Zertifikate zu erstellen.
  • -n auth-server.maker-hub.local: Setzt den Principals-Parameter auf auth-server.maker-hub.local. Der Principal ist der Hostname oder Benutzername, für den das Zertifikat gültig ist.
  • -V +520w: Setzt die Gültigkeitsdauer des Zertifikats auf 520 Wochen (10 Jahre). +520w bedeutet, dass das Zertifikat ab jetzt für die nächsten 520 Wochen gültig ist.
  • /etc/ssl/certs/AuthServer.pub: Gibt den Pfad zur öffentlichen Schlüsseldatei an, die signiert werden soll. Das resultierende Zertifikat wird den Dateiname mit dem Zusatz -cert haben: AuthServer-cert.pub

Damit auf das Zertifikat zugegriffen werden kann, muss wieder die Berechtigung angepasst werden:

sudo chmod 644 /etc/ssl/certs/AuthServer-certSSH.pubCode-Sprache: Bash (bash)

Nun müssen wir das neue Zertifikat und den Schlüssel dem SSH-Daemon bekannt geben. Zusätzlich setzen wir den öffentlichen Schlüssel der Root CA als vertrauenswürdig für User-Zertifikate. Dazu passen wir die sshd_config an:

sudo nano /etc/ssh/sshd_configCode-Sprache: Bash (bash)

Die folgenden Zeilen müssen angepasst bzw. wenn nicht vorhanden eingefügt werden:

TrustedUserCAKeys /etc/ssl/certs/MakerHubSSHRootCA.pub
HostCertificate /etc/ssl/certs/AuthServerSSH-cert.pub
HostKey /etc/ssl/private/AuthServerSSH.keyCode-Sprache: PHP (php)

Abschließend muss der SSH-Dienst neu gestartet werden:

sudo systemctl restart sshCode-Sprache: Bash (bash)

Fingerprint

prints, auch bekannt als Fingerabdrücke, sind einzigartige, kryptografische Hash-Werte, die zur Identifikation und Überprüfung von Schlüsseln und Zertifikaten verwendet werden. Ein Fingerprint dient als prägnante, leicht überprüfbare Zusammenfassung eines Schlüssels oder Zertifikats und ermöglicht eine schnelle Überprüfung der Integrität und Authentizität.

Wir können den Fingerprint mittels:

ssh-keygen -lf Pfad/DateiCode-Sprache: Bash (bash)

auslesen.

Für mein SSH Root CA sieht es so aus:

ssh-keygen -lf /etc/ssl/certs/MakerHubSSHRootCA.pubCode-Sprache: Bash (bash)
Fingerprint vom Maker Hub SSH Root CA
SHA256:HigbDl032kXdkmy4Cg8tZADRPXls//Uewf5opRksn6k MakerHub SSH Root CA (ED25519)Code-Sprache: Bash (bash)


Der Fingerprint vom privaten Schlüssel und dem öffentlichen Zertifikat müssen gleich sein.
Diese prüfen wir mittels:

ssh-keygen -lf /etc/ssl/private/AuthServerSSH.key
ssh-keygen -lf /etc/ssl/certs/AuthServerSSH-cert.pubCode-Sprache: Bash (bash)
Fingerprint vom Key und Zertifikat

Key: SHA256:veSiW1OZWgYh+c2OCo50Jgj2H/1Fn2Reh/Iy+aoNyIA MakerHub Authentication Server (ED25519)
Zertifikat: SHA256:veSiW1OZWgYh+c2OCo50Jgj2H/1Fn2Reh/Iy+aoNyIA MakerHub Authentication Server (ED25519-CERT)

Wir können uns auch mehr Details zum Zertifikat anzeigen lassen:

ssh-keygen -Lf /etc/ssl/certs/AuthServerSSH-cert.pubCode-Sprache: Bash (bash)

In den Details wird auch den Fingerprint des Zertifikates, dass das aktuelle Zertifikat signiert hat.

Erstellung von Client-Zertifikaten

Um Clients durch Zertifikate zu authentifizieren, müssen Benutzerzertifikate erstellt und entsprechend konfiguriert werden.

Dazu erstellen wir ein Benutzerzertifikat:

ssh-keygen -t ed25519 -f ~/.ssh/MiaSophieBehrendt.key -C "Mia Sophie Behrendt"Code-Sprache: JavaScript (javascript)

Danach muss den öffentlichen Schlüssel des Benutzers mit der Root CA signieren, um ein Zertifikat zu erstellen:

sudo ssh-keygen -s /etc/ssl/private/MakerHubSSHRootCA.key -I "Mia Sophie Behtendt" -n mib.behrendt -V +520w ~/.ssh/MiaSophieBehrendt.key.pub
Code-Sprache: JavaScript (javascript)

Erklärung des Befehls:

  • -s /etc/ssl/private/MakerHubSSHRootCA.key: Verwendet den privaten Schlüssel der CA (MakerHubSSHRootCA.key) zum Signieren des Zertifikats.
  • -I "Mia Sophie Behrendt": Setzt die Identität des Zertifikats auf „Mia Sophie Behrendt“. Dies ist ein beschreibender String, der zur Identifizierung des Zertifikats verwendet wird.
  • -n mib.behrendt: Setzt den Principal des Zertifikats auf mib.behrendt. Dies bedeutet, dass das Zertifikat für den Benutzer mib.behrendt gültig ist.
    Du kannst mehrere Principals durch Kommata getrennt angeben, z.B.: -n "user1,user2".
  • -V +520w: Setzt die Gültigkeitsdauer des Zertifikats auf 520 Wochen (10 Jahre). Ab dem Zeitpunkt der Erstellung ist das Zertifikat 520 Wochen gültig.
  • ~/.ssh/MiaSophieBehrendt.key.pub: Der Pfad zur öffentlichen Schlüsseldatei, die signiert werden soll. Das resultierende Zertifikat wird den Dateinamen MiaSophieBehrendt.key-cert.pub haben und im gleichen Verzeichnis gespeichert werden.

Mit diesen Schritten kanns du Benutzerzertifikate erstellen und verwalten, was eine zusätzliche Sicherheitsebene bietet. Client-Zertifikate sind besonders nützlich in großen Umgebungen oder dort, wo eine zusätzliche Authentifizierungsebene gewünscht wird.

Weiterführende Links

Wenn dir meine Arbeit gefällt, würde ich mich über einen Kaffee freuen