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.
