SSH bietet die Möglichkeit, Host und User Zertifikate zur Authentifizierung zu verwenden. Dies wird möglich durch Signieren von öffentlichen SSH Schlüsseln mit einem CA Schlüssel.
Die Verwendung von Zertifikaten hat gleich mehrere Vorteile. Zertifikate können mit einer Laufzeit in ihrer Gültigkeit begrenzt werden. Wie bei Zertifikaten üblich können auch sog. _revocation lists_ geführt werden, und Zertifikate ungültig gemacht werden. Desweiteren kann man sich mit einem gültigen SSH-User-Zertifikat bei allen Hosts anmelden, die dafür konfiguriert sind, ohne, dass man seinen öffentlichen Schlüssel extra installieren muss.
Leider ist eine direkte Verwendung von den durch SSL bekannten X.509 Zertifikaten nicht vorgesehen, aber zumindest über Umwege möglich (siehe Extrahieren von SSH Schlüsseln aus X.509 Zertifikaten).
Aufbau einer SSH-CA
Um Host und User Schlüssel zu signieren, benötigt man eine SSH-CA. Sie ist lediglich ein SSH Schlüsselpaar, das zum Signieren von Host- und User-SSH-Schlüsseln verwendet wird. Man kann auch getrennte CAs für Host- und User-Schlüssel verwenden.
Folgender Befehl erstellt eine SSH-CA mit Namen `ssh_ca`.
ssh-keygen -b 4096 -t rsa -f ssh_ca -C "SSH CA for *.uni-konstanz.de"
Danach sollte der Host Schlüssel signiert werden.
ssh-keygen -s ssh_ca -h -n "$(hostname --fqdn)" -I "$(hostname --fqdn)-$(date +%s)" -V +52w+1d /etc/ssh/ssh_host_rsa_key
Hierdurch wird ein Zertifikat `/etc/ssh/ssh_host_rsa_key-cert.pub` erstellt.
Verwenden von Host-Zertifikaten
Das Verwenden von Host-Zertifikaten hat den Vorteil, dass Clienten die Vertrauenswürdigkeit von Hosts automatisch prüfen können und damit ein manuelles Prüfen von SSH-Fingerprints entfällt.
Liegt der zu signierende öffentliche Schlüssel der CA vor, wird er mit folgendem Befehl signiert.
ssh-keygen -s ssh_ca -h -n <full qualified hostname> -I <unique ID> -V <validity period> ssh_host_rsa_key.pub
Das entstandene Zertifikat wird dann zu dem Host zurück kopiert.
scp ssh_host_rsa_key-cert.pub host:/etc/ssh/
Der SSH Server des Hosts muss darauf noch so eingestellt werden, dass er das Host Zertifikat präsentiert.
# file: /etc/ssh/sshd_config HostCertificate /etc/ssh/ssh_host_rsa_key-cert.pub
Damit die SSH-Clients die Gültigkeit des Host-Zertifikats prüfen können, muss man die SSH-CA auf dem Client entweder systemweit oder für einzelne Nutzer bekannt machen. Hierzu kopiert man den öffentlichen Schlüssel `ssh_ca.pub` auf den Client und schreibt den Inhalt in die Datei `known_hosts`.
# für einzelne User echo "@cert-authority *.uni-konstanz.de $(cat ssh_ca.pub)" >> ~/.ssh/known_hosts # systemweit echo "@cert-authority *.uni-konstanz.de $(cat ssh_ca.pub)" >> /etc/ssh/known_hosts
Verwenden von User-Zertifikaten
Zuerst wird der öffentliche Schlüssel zum CA-Host kopiert. Dann wird er signiert.
ssh-keygen -s ssh_ca -n <user1,user2,...> -I <unique ID> -V <validity period> id_rsa.pub
Wichtig ist hierbei, dass alle Usernamen, für die das Zertifikat gültig sein soll, auch beim Signieren angegeben werden. Hat der*die Nutzer*in also auf verschiedenen Servern unterschiedliche Usernamen (bspw. `maria.muster` und `mm`), so müssen diese beim Signieren mit angegeben werden.
# Beispiel ssh-keygen -s ssh_ca -n maria.muster,mm -I maria.muster-$(date +%s) -V 20160101120000:20180101120000 id_rsa.pub
Das Zertifikat `id_rsa-cert.pub` wird dann zurück zum Client übertragen. Der Client benötigt zur Authentifizierung drei Dateien, den privaten Schlüssel (`id_rsa`), den öffentlichen Schlüssel (`id_rsa.pub`), sowie das Zertifikat (`id_rsa-cert.pub`).
Server, die die Anmeldung mit SSH-User-Zertifikaten unterstützen wollen, benötigen eine Kopie des öffentlichen Schlüssels der CA (`ssh_ca.pub`) und müssen entsprechend konfigriert werden.
# file: /etc/ssh/sshd_config TrustedUserCAKeys /etc/ssh/ssh_ca.pub
Zurückziehen von Zertifikaten
Um Zertifikate zurückzuziehen benötigt man sog. _revocation lists_, die in Dateien geführt werden. Jeder Server muss über eine Kopie der Liste verfügen.
Auf dem Server
Serverseitig gibt es dafür zwei verschiedene mögliche Formate.
Das Tool `ssh-keygen` kann eine binär kodierte revocation list erstellen.
ssh-keygen -k -f /etc/ssh/revoked-keys
Alternativ kann eine klartext Datei erstellt werden.
touch /etc/ssh/revoked-keys chmod 644 /etc/ssh/revoked-keys
Für binär kodierte Dateien können Zertifikate folgendermaßen zurückgezogen werden. Hierfür benötigt man das Zertifikat.
ssh-keygen -k -u -f /etc/ssh/revoked-keys <key or certificate file>
Bei Klartext-Listen kann man das Zertifikat einfach hinzufügen.
echo "@revoked $(cat <key or certificate file>)" >> /etc/ssh/revoked_keys
Der SSH Server muss dann noch über die Existenz der _revocation list_ informiert werden.
Auf dem Client
Clients führen keine eigene Datei, sondern fügen die zurückgezogenen Zertifikate der Datei `known_hosts` hinzu. Dies kann wieder für einzelne Nutzer*innen oder (besser) systemweit erfolgen.
# für Nutzer echo "@revoked $(cat <key or certificate file>)" >> ~/.ssh/known_hosts # systemweit echo "@revoked $(cat <key or certificate file>)" >> /etc/ssh/ssh_known_hosts'
Hierdurch wird ein Zertifikat `/etc/ssh/ssh_host_rsa_key-cert.pub` erstellt.