SSH-Zugriff mit signierten Zertifikaten

13 Mai 2025 - Lesezeit: 4 Minuten

Ziel

Benutzer sollen sich per SSH auf Linux-Servern anmelden können, ohne dass ihre Public Keys manuell auf jedem Server eingetragen werden müssen. Stattdessen signieren sie ihren eigenen Public Key bei einer zentralen SSH Certificate Authority (CA). Die Server akzeptieren dann automatisch alle gültigen, signierten Zertifikate.


SSH-Zertifikate

OpenSSH unterstützt neben gewöhnlichen Public Keys auch sogenannte SSH-Zertifikate. Diese funktionieren ähnlich wie TLS-Zertifikate:

  • Ein Benutzer erzeugt ein eigenes Keypair
  • Eine SSH-CA signiert den Public Key
  • Der Zielserver prüft, ob das Zertifikat gültig ist und ob die CA vertrauenswürdig ist.
  • Der Zugriff wird anhand von im Zertifikat hinterlegten Informationen (z. B. Benutzername, Ablaufzeit) gewährt oder verweigert.

Vorteile

  • Kein Deployment von Public Keys auf jedem Server
  • Zugriffskontrolle zentral über die CA
  • Zertifikate können zeitlich begrenzt werden (z. B. nur 1 Stunde gültig)
  • Prinzipal (Benutzername) wird im Zertifikat festgelegt - kein Spoofing

Einrichtung

1. CA-Schlüssel erzeugen (einmalig)

ssh-keygen -f /etc/ssh/ca_key -C "SSH CA" -t rsa

Erzeugt zwei Dateien:

  • /etc/ssh/ca_key – privater CA-Schlüssel (geheim halten)
  • /etc/ssh/ca_key.pub – öffentlicher CA-Schlüssel (wird auf Server verteilt)

2. Zielserver konfigurieren

CA Public Key auf den Server kopieren, z. B. nach /etc/ssh/ca_key.pub.

Dann in /etc/ssh/sshd_config folgenden Eintrag ergänzen:

TrustedUserCAKeys /etc/ssh/ca_key.pub
# Dienst neu starten
systemctl reload sshd

3. Benutzerkey erzeugen

Jeder Benutzer generiert lokal einen eigenen Key:

ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519 -C "user@example.com"

4. Key signieren lassen

Der Benutzer sendet seinen Public Key zur Signierung an die CA. Die CA signiert den Key:

ssh-keygen -s /etc/ssh/ca_key \
  -I user@example.com \
  -n <username> \
  ~/.ssh/id_ed25519.pub

kurze Gedankenstütze: -I Identifier (frei wählbar, z. B. E-Mail) -n Principal (Benutzername auf dem Zielsystem)

Erzeugt: id_ed25519-cert.pub - die geht wieder zurückzum Benutzer.

5. Verbindung zum Server

ssh -i ~/.ssh/id_ed25519 \
    -o CertificateFile=~/.ssh/id_ed25519-cert.pub \
    user@zielserver

Oder dauerhaft in ~/.ssh/config:

Host zielserver
  HostName server.example.com
  User <username>
  IdentityFile ~/.ssh/id_ed25519
  CertificateFile ~/.ssh/id_ed25519-cert.pub

Kurzlebige Zertifikate

Warum? Weil es geil ist!

  • Reduzieren Angriffsfläche bei Kompromittierung
  • Erzwingen regelmäßige Re-Authentifizierung
  • Kein manuelles Entfernen veralteter Keys nötig

Umsetzung

Bei der Signierung wird die Gültigkeit angegeben:

ssh-keygen -s ca_key -I user -n user -V +1h user.pub

Alternativ absolute Zeitspanne:

ssh-keygen -s ca_key -I user -n user -V "20250513T100000:20250513T180000" user.pub

Das wiederum würde sich auch ganz gut eigenen um sich automatisieren zu lassen. Webportal oder CLI für Benutzer, um ein Zertifikat per SSO oder Token zu erhalten

Es wurden noch keine Kommentare verfasst, sei der erste!