Under Construction

SSH-Client: Einrichten der Host-Key Überprüfung mit dem Public-Key der Host-Zertifizierungsstelle

Der Public-Key der Host-Zertifizierungsstelle (ssh_host_ca_key.pub) kann zur Überprüfung von Host-Zertifikaten auf dem SSH-Client verwendet werden. Dazu muss der Public-Key auf dem Client abgelegt sein und es muss ein spezieller Eintrag in einer Known-Hosts Datei vorhanden sein, welcher dann anstelle eines normalen Host-Eintrags verwendet wird.

Wir kopieren zunächst den Public-Key der Host-Zertifizierungsstelle auf den Client:

user01@client01 $ scp ca-host:/etc/ssh-ca/ssh_host_ca_key.pub /tmp
ssh_host_ca_key.pub                                                     100%   97    57.7KB/s   00:00   
user01@client01 $

Die Überprüfung des Public-Keys des Zielrechners findet auf dem Client über eine der Known-Hosts Dateien statt (typischerweise ~/.ssh/known_hosts und /etc/ssh/ssh_known_hosts). Um Host-Zertifikate überprüfen zu können, braucht man einen Eintrag, der für bestimmte Zielrechner auf den Public-Key der Host-Zertifizierungsstelle verweist. Wir fügen einen solchen Eintrag testweise unserer privaten Known-Hosts-Datei hinzu:

user01@client01 $ echo "@cert-authority *.powercampus.de $(cat /tmp/ssh_host_ca_key.pub)" >>~/.ssh/known_hosts
user01@client01 $

Die Zeichenkette „@cert-authority“ identifiziert den Eintrag als eine Zertifizierungsstelle, das nächste Feld „*.powercampus.de“ bestimmt für welche Rechner dieser Eintrag verwendet werden soll und als letztes wird der komplette Public-Key der Host-Zertifizierungsstelle eingefügt. Insgesamt sieht dies dann so aus:

user01@client01 $ cat ~/.ssh/known_hosts

server01.powercampus.de ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKO0B1dqnnudHJqSBeb018DVWqUV/+lnq9G25yj9lFGg
server01.powercampus.de ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCjMKwutKaEEdKc3Cth7fNkv5yh2TArrCcVpCZG+1okGr1nPqkP9frYJW+HsXpMWH7PL1JTSzECVg2Pn34DeNlK9fPcxSECRJ4WVWYEMESwMytiZ5nW1Xq214hezvMV9xK7Li/PXzn+r29pezP9d4EEu6Pywd1Pdv53qDt/DdWG1GHr1eILeBIFYqv79t4echufGAOj8DY1h4/fCkaMor3y1NgnsSmAgfiNYoHs+1FfrMM+ogiLW0rRyPURZyJi78WnZB06lrLEPnONrRoVvtSNcGLl9ZkMP6fPhK17FGC4Q4uecgf20aOUh01ZUfybD0efNhrBaPsgFHsi9L4sKFMb
server02.powercampus.de ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIH3KHppqyVm/AYxHtFPqDjRt8PcR9SMDU5g0vR+KBhn4
@cert-authority *.powercampus.de ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICyVfkcCsyO22jpy1p/G8gvpIPYdAEG9u+YGmmPszvpF ssh_host_ca_key
user01@client01 $

Für Rechner in der Domain powercampus.de, die ein Host-Zertifikat besitzen, welches von der Host-Zertifizierungsstelle ausgestellt wurde, wird ab jetzt der Public-Key der Host-Zertifizierungsstelle bei der Authentifizierung des Ziel-Rechners verwendet. Die schon vorhandenen normalen Einträge für Rechner in der Domäne powercampus.de werden nur dann verwendet, wenn ein solcher Ziel-Rechner entweder kein gültiges Zertifikat hat, oder dieses von einer anderen Host-Zertifizierungsstelle ausgestellt wurde.

Wir machen einen Test, indem wir einen SSH-Connect zu dem Ziel-Rechner server01.powercampus.de starten (für diesen hatten wir ja ein Host-Zertifikat erstellt):

user01@client01 $ ssh -v server01.powercampus.de

debug1: Server host certificate: ssh-ed25519-cert-v01@openssh.com SHA256:po4nqX/FudIl2Vhr6IOxzN0DMhouHW89ikn6oGwmeuc, serial 0 ID "server01.powercampus.de" CA ssh-ed25519 SHA256:Yr22UVk95ilCGBTki8QP7BT16IBqW9PhoOY3JG/OeyA valid forever

debug1: Host 'server01.powercampus.de' is known and matches the ED25519-CERT host certificate.
debug1: Found CA key in /home/user01/.ssh/known_hosts:6

user01@client01 $

Der Debugging-Output zeigt das Zertifikat des Ziel-Rechners, den Hinweis das das Zertifikat erfolgreich überprüft wurde („… is known and matchest he ED25519-CERT host certificate“), sowie den Eintrag in der Known-Hosts Datei der für die Überprüfung verwendet wurde (Zeile 6 aus /home/user01/.ssh/known_hosts):

user01@client01 $ sed -ne 6p .ssh/known_hosts
@cert-authority *.powercampus.de ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICyVfkcCsyO22jpy1p/G8gvpIPYdAEG9u+YGmmPszvpF ssh_host_ca_key
user01@client01 $

Die spezifischen Known-Hosts Einträge aller Rechner in der Domäne powercampus.de die ein Host-Zertifikat besitzen, werden nicht mehr gebraucht und können aus der Datei entfernt werden. Das kann z.B. mit dem Kommando ssh-keygen und der Option „-R“ (remove) gemacht werden:

user01@client01 $ ssh-keygen -R server01.powercampus.de
# Host server01.powercampus.de found: line 3
# Host server01.powercampus.de found: line 4
/home/user01/.ssh/known_hosts updated.
Original contents retained as /home/user01/.ssh/known_hosts.old
user01@client01 $

Für den Fall das ausschließlich Host-Zertifikate verwendet werden, reicht der CA-Eintrag. Kommt ein neuer Rechner in der Domäne hinzu und besitzt dieser ein gültiges Zertifikat, dann muss auf den SSH-Clients nichts konfiguriert werden. Der schon vorhandene CA-Eintrag stellt sicher, das auch das neue System automatisch korrekt authentifiziert werden kann.

Im Prinzip bräuchte nun jeder Benutzer auf jedem SSH-Client einen solchen CA-Eintrag. Einfacher ist dann die Verwendung einer globalen Known-Hosts Datei, typischerweise /etc/ssh/ssh_known_hosts. Der CA-Eintrag wird einfach einmalig auf jedem SSH-Client in /etc/ssh/ssh_known_hosts hinzugefügt und gilt dann für alle Benutzer:

root@client01 # echo "@cert-authority *.powercampus.de $(cat /tmp/ssh_host_ca_key.pub)" >>/etc/ssh/ssh_known_hosts
root@client01 #

Auch hier können eventuell schon vorhandene Einträge von Ziel-Rechnern, die ein Zertifikat besitzen, entfernt werden. In vielen Fällen reicht dann der CA-Eintrag. Die Datei muss lesbar für alle Benutzer sein, sollte aber nur für root schreibbar sein:

user01@client01 $ ls -l /etc/ssh/ssh_known_hosts
-rw-r--r--    1 root     system          127 Jan 13 08:58 /etc/ssh/ssh_known_hosts
user01@client01 $

Benutzer die nur SSH-Verbindungen zu Systemen mit Zertifikat verwenden, könnten dann sogar ihre privaten ~/.ssh/known_hosts Dateien löschen.