Absichern von SSH Verbindungen mittels Zertifikat auf einem Mac oder Linux-System

Nachfolgend findest du die einzelnen Schritte, um deine SSH-Verbindung zu einem Server mithilfe eines Zertifikats (SSH-Schlüssels) abzusichern.

1. SSH-Schlüssel erstellen

Öffne das Terminal auf deinem Mac (oder Linux-System) und verwende folgenden Befehl, um ein SSH-Schlüsselpaar zu erstellen:

Bash
ssh-keygen -t ed25519 -C "deine_email@example.com"
  • Der Parameter -t ed25519 legt fest, dass ED25519 als Verschlüsselungsalgorithmus verwendet wird.
  • Mit -C "deine_email@example.com" kannst du einen Kommentar hinzufügen, z. B. deine E-Mail-Adresse.

Du wirst gefragt, wo der Schlüssel gespeichert werden soll. Der Standardpfad ist ~/.ssh/id_ed25519. Ich empfehle, den Schlüssel nach dem Server zu benennen, z. B. ~/.ssh/servername. Du kannst das Passwort leer lassen, wenn du den Schlüssel nicht zusätzlich schützen möchtest – ansonsten lege eines fest.

2. Öffentlichen Schlüssel auf den Linux-Rechner kopieren

Sobald der Schlüssel erstellt wurde, kannst du den öffentlichen Schlüssel (~/.ssh/id_ed25519.pub) auf deinen SSH-Host hochladen:

Bash
ssh-copy-id benutzername@hostname

Dies kopiert den Inhalt des öffentlichen Schlüssels in die Datei ~/.ssh/authorized_keys auf dem Linux-Rechner.

Ersetze benutzername und hostname durch den Benutzernamen und Hostnamen bzw. die IP-Adresse des Zielsystems.

3. Manuelles Kopieren des SSH-Schlüssels

Falls ssh-copy-id nicht verfügbar ist, kannst du den öffentlichen Schlüssel auch manuell kopieren:

Öffne den öffentlichen Schlüssel auf deinem Mac:

Bash
cat ~/.ssh/id_rsa.pub

Kopiere den angezeigten Schlüsselinhalt und füge ihn auf dem Linux-Rechner in die Datei ~/.ssh/authorized_keys ein. Du kannst diese Datei auf dem Linux-Rechner wie folgt bearbeiten:

Bash
nano ~/.ssh/authorized_keys

Füge den Schlüssel in einer neuen Zeile ein und speichere die Datei.

4. Testen der Verbindung

Teste die SSH-Verbindung:

Bash
ssh benutzername@hostname

Wenn alles korrekt eingerichtet ist, solltest du dich ohne Passwortabfrage anmelden können.

5. Passwort-Login auf dem Linux-Host deaktivieren

Wichtig: Vergewissere dich vorab, dass der Login mit SSH-Schlüssel funktioniert.
Andernfalls riskierst du, dich vom Server auszusperren.

Bearbeite auf dem Server die Datei:

Bash
sudo nano /etc/ssh/sshd_config

Füge folgende Einstellungen hinzu bzw. passe sie an:

/etc/ssh/sshd_config excerpt
PubkeyAuthentication yes
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitRootLogin prohibit-password

Erklärung:

  • PubkeyAuthentication yes: Aktiviert die Anmeldung per SSH-Schlüssel.
  • PasswordAuthentication no: Deaktiviert die Anmeldung per Passwort.
  • KbdInteractiveAuthentication no: Verhindert passwortähnliche Eingabeverfahren.
  • PermitRootLogin prohibit-password: Erlaubt Root-Zugriff nur per Schlüssel, nicht mit Passwort.

Starte den SSH-Dienst neu:

Bash
sudo systemctl restart ssh

Öffne ein neues Terminalfenster und teste die Verbindung erneut, bevor du die aktuelle Sitzung beendest.

Konfiguration des SSH-Profils auf dem Mac

Um den Verbindungsaufbau weiter zu vereinfachen, kannst du auf deinem Mac eine SSH-Konfigurationsdatei mit Profil-Einträgen anlegen.

Bearbeite die Datei ~/.ssh/config:

Bash
nano ~/.ssh/config

Beispielkonfiguration:

~/.ssh/config
Host hostname
    Hostname host.domain.com
    User username
    IdentityFile ~/.ssh/id_ed25519
    ServerAliveInterval 15
    ServerAliveCountMax 12
  • Host: Definiert entweder den Hostnamen oder einen Alias für den SSH-Zielserver. Falls du einen Alias definieren willst, dann musst du zusätzlich die Option HostName host.domain.com als Parameter hinzufügen.
  • User: Gibt den Benutzernamen an, mit dem du dich auf dem Server anmelden möchtest. Spart dir die manuelle Eingabe bei jeder Verbindung.
  • IdentityFile: Pfad zum privaten SSH-Schlüssel, der für die Authentifizierung verwendet wird. Er sollte zu einem auf dem Server hinterlegten öffentlichen Schlüssel passen.
  • ServerAliveInterval: Gibt an, in welchem Zeitintervall (in Sekunden) der Client ein Keep-Alive-Signal an den Server sendet, um Verbindungsabbrüche durch Inaktivität zu vermeiden.
  • ServerAliveCountMax: Bestimmt, wie oft ein Keep-Alive-Signal erfolglos gesendet werden darf, bevor der Client die Verbindung trennt. Multipliziert mit ServerAliveInterval ergibt sich die maximale Ausfallzeit in Sekunden.

Kommentare

Schreibe einen Kommentar