OpenSSH Certificate Authority – Kurzanleitung

Veröffentlichung 21. August 2018 @ 15:47
Letzte Änderung 3. Juni 2021 @ 6:41

Überblick

  • Certificate Authority (CA) zur zentralen Authentifizierung mit signierten OpenSSH-Zertifikaten
  • Host-Zertifikate zur Authentifizierung von Servern gegenüber Benutzern
  • Benutzer-Zertifikate zur Authentifizierung von Benutzern gegenüber Servern
  • Dateien known_hosts auf Client und authorized_keys auf Host sind obsolet
  • CA-Server kann (sollte) Offline sein

Voraussetzungen

CA-Server ca.example.com

  • Benutzerkonto root
  • CA-Schlüssel für Host-Zertifikate /root/.ssh/ca_host_key, /root/.ssh/ca_host_key.pub
  • CA-Schlüssel für Benutzer-Zertifikate /root/.ssh/ca_user_key, /root/.ssh/ca_user_key.pub

Client client.example.com

  • Benutzerkonto clientuser
  • Benutzer-Zertifikat /home/clientuser/.ssh/id_ed25519-cert.pub
  • CA-Host-Schlüssel /etc/ssh/ssh_known_hosts
  • Client-Schlüssel /home/clientuser/.ssh/id_*

Host host.example.com

  • Benutzerkonto hostuser
  • CA-Benutzer-Schlüssel /etc/ssh/ca_user_key.pub
  • Host-Schlüssel /etc/ssh/ssh_host_*
  • Host-Zertifikat /etc/ssh/ssh_host_ed25519_key-cert.pub
  • Konfiguration /etc/ssh/sshd_config
  • Log /var/log/auth.log
  • SSH-Port 42022

Software

  • OpenSSH 7.2, OpenSSL 1.0.2g #ssh -V
  • Ubuntu Server 16.04.04 LTS #lsb_release -a

Certificate-Authority-Schlüssel für Host-Zertifikate auf CA-Server erstellen und anzeigen

Schlüsselpaar zur Signierung von Host-Zertifikaten erzeugen

root@ca.example.com:~# ssh-keygen -f /root/.ssh/ca_host_key -t ed25519
Generating public/private ed25519 key pair.
Enter passphrase (empty for no passphrase): ***
Enter same passphrase again: ***
...

Öffentlichen CA-Host-Schlüssel anzeigen

root@ca.example.com:~# less /root/.ssh/ca_host_key.pub
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIKSVLOCkiHDiywSAMl+dGfV9R8Cj998wdL+wgUmFkY/ root@ca.example.com

Host-Zertifikat für host.example.com auf CA-Server erzeugen und anzeigen

(Vorhandenen) Öffentlichen Host-Schlüssel ssh_host_ed25519_key.pub von host.example.com nach CA-Server kopieren

root@ca.example.com:~# scp -i /root/.ssh/id_ed25519 -P 42022 hostuser@host.example.com:/etc/ssh/ssh_host_ed25519_key.pub /tmp/ssh_host_ed25519_key.pub

Öffentlichen Schlüssel signieren

Optionen
-h: Host-Zertifikat
-I: Zertifikatsname
-n: Hostname(n) („Principal(s)“)
-s: Privater CA-Schlüssel zur Signierung
-V: Gültigkeitsdauer des Zertifikats (52 Wochen = 1 Jahr)

root@ca.example.com:~# ssh-keygen -h -I host.example.com -n host.example.com -s /root/.ssh/ca_host_key -V +52w /tmp/ssh_host_ed25519_key.pub
Enter passphrase: ***
Signed host key /tmp/ssh_host_ed25519_key-cert.pub: id "host.example.com" serial 0 for host.example.com valid from xxx to xxx

Host-Zertifikat ssh_host_ed25519_key-cert.pub anzeigen

root@ca.example.com:~# ssh-keygen -f /tmp/ssh_host_ed25519_key-cert.pub -L
/tmp/ssh_host_ed25519_key-cert.pub:
Type: ssh-ed25519-cert-v01@openssh.com host certificate
Public key: ED25519-CERT SHA256:xxx
Signing CA: ED25519 SHA256:xxx
Key ID: "host.example.com"
Serial: 0
Valid: from xxx to xxx
Principals:
host.example.com
Critical Options: (none)
Extensions: (none)

Host-Zertifikat nach host.example.com kopieren und lokal verschieben #kein Remote-Schreibzugriff auf /etc/ssh/ssh_host_ed25519_key-cert.pub

root@ca.example.com:~# scp -i /root/.ssh/id_ed25519 -P 42022 /tmp/ssh_host_ed25519_key-cert.pub hostuser@host.example.com:/home/hostuser/ssh_host_ed25519_key-cert.pub
root@host.example.com:~# mv /home/thomas/ssh_host_ed25519_key-cert.pub /etc/ssh/ssh_host_ed25519_key-cert.pub
root@host.example.com:~# chown root:root /etc/ssh/ssh_host_ed25519_key-cert.pub

Öffentlichen Schlüssel und Host-Zertifikat auf CA-Server löschen

root@ca.example.com:~# rm /tmp/ssh_host_ed25519_key.pub /tmp/ssh_host_ed25519_key-cert.pub

SSH-Server-Konfiguration auf host.example.com anpassen

Konfiguration ergänzen

...
#SSH mit Zertifikaten, Datei(en) mit Host-Zertifikat(en):
HostCertificate /etc/ssh/ssh_host_ed25519_key-cert.pub

SSH-Server neustarten und Status abfragen

root@host.example.com:~# systemctl reload ssh
root@host.example.com:~# journalctl --unit ssh.service

SSH-Client-Konfiguration auf client.example.com anpassen

[Optional] Datei known_hosts löschen

root@client.example.com:~# rm /home/clientuser/.ssh/known_hosts

Öffentlichen CA-Host-Schlüssel zentral in Datei ssh_known_hosts hinterlegen

@cert-authority *.example.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIKSVLOCkiHDiywSAMl+dGfV9R8Cj998wdL+wgUmFkY/ root@ca.example.com

Certificate-Authority-Schlüssel für Benutzer-Zertifikate auf CA-Server erstellen und anzeigen

Schlüsselpaar zur Signierung von Benutzer-Zertifikaten erzeugen

root@ca.example.com:~# ssh-keygen -f /root/.ssh/ca_user_key -t ed25519
Generating public/private ed25519 key pair.
Enter passphrase (empty for no passphrase): ***
Enter same passphrase again: ***
...

Öffentlichen CA-Benutzer-Schlüssel anzeigen

root@ca.example.com:~# less /root/.ssh/ca_user_key.pub
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHh304gcBUArZTbVGk0b3HYQVIguCmQQlbo0DvU8gItO root@ca.example.com

CA-Benutzer-Schlüssel auf host.example.com hinterlegen und Konfiguration anpassen

Öffentlichen CA-Benutzer-Schlüssel ca_user_key.pub von CA-Server nach host.example.com kopieren und lokal verschieben #kein Remote-Schreibzugriff auf /etc/ssh/ca_user_key.pub

root@ca.example.com:~# scp -i /root/.ssh/id_ed25519 -P 42022 /root/.ssh/ca_user_key.pub hostuser@host.example.com:/home/hostuser/ca_user_key.pub
root@host.example.com:~# mv /home/hostuser/ca_user_key.pub /etc/ssh/ca_user_key.pub
root@host.example.com:~# chown root:root /etc/ssh/ca_user_key.pub

SSH-Server-Konfiguration auf host.example.com ergänzen

...
#SSH mit Zertifikaten, Datei(en) mit CA-Benutzer-Schlüssel(n):
TrustedUserCAKeys /etc/ssh/ca_user_key.pub

SSH-Server auf host.example.com neustarten und Status abfragen

root@host.example.com:~# systemctl reload ssh
root@host.example.com:~# journalctl --unit ssh.service

Benutzer-Zertifikat für clientuser@client.example.com auf CA-Server erzeugen und anzeigen

(Vorhandenen) Öffentlichen Client-Schlüssel id_ed25519.pub von client.example.com nach CA-Server kopieren

root@ca.example.com:~# scp -i /root/.ssh/id_ed25519 -P 42022 clientuser@client.example.com:/home/clientuser/.ssh/id_ed25519.pub /tmp/id_ed25519.pub

Öffentlichen Client-Schlüssel signieren

Optionen
-I: Zertifikatsname
-n: Benutzername(n) auf Host („Principal(s)“)
-s: Privater CA-Schlüssel zur Signierung
-V: Gültigkeitsdauer des Zertifikats (52 Wochen = 1 Jahr)

root@ca.example.com:~# ssh-keygen -I clientuser@client.example.com -n hostuser -s /root/.ssh/ca_user_key -V +52w /tmp/id_ed25519.pub
Enter passphrase: ***
Signed user key /tmp/id_ed25519-cert.pub: id "clientuser@client.example.com" serial 0 for hostuser valid from xxx to xxx

Benutzer-Zertifikat id_ed25519-cert.pub anzeigen

root@ca.example.com:~# ssh-keygen -f /tmp/id_ed25519-cert.pub -L
/tmp/id_ed25519-cert.pub:
Type: ssh-ed25519-cert-v01@openssh.com user certificate
Public key: ED25519-CERT SHA256:xxx
Signing CA: ED25519 SHA256:xxx
Key ID: "clientuser@client.example.com"
Serial: 0
Valid: from xxx to xxx
Principals:
hostuser
Critical Options: (none)
Extensions:
permit-X11-forwarding
permit-agent-forwarding
permit-port-forwarding
permit-pty
permit-user-rc

Benutzer-Zertifikat nach client.example.com kopieren

root@ca.example.com:~# scp -i /root/.ssh/id_ed25519 -P 42022 /tmp/id_ed25519-cert.pub clientuser@client.example.com:/home/clientuser/.ssh/id_ed25519-cert.pub

Öffentlichen Schlüssel und Benutzer-Zertifikat auf CA-Server löschen

root@ca.example.com:~# rm /tmp/id_ed25519.pub /tmp/id_ed25519-cert.pub

SSH-Client-Konfiguration auf client.example.com anpassen

Client-Konfigurationsdatei ergänzen

...
Host host
#SSH mit Zertifikaten, Benutzer-Zertifikat, Voreinstellung IdentityFile mit Endung "-cert.pub":
#CertificateFile ~/.ssh/id_ed25519-cert.pub
#sicherster Host-Authentifizierungs-Algorithmus gemäß ssh-keyscan -p 42022 host.example.com:
#HostKeyAlgorithms ssh-ed25519
#SSH mit Zertifikaten, Host-Authentifizierungs-Algorithmus für Host-Zertifikat gemäß ssh-keyscan -c -p 42022 host.example.com:
HostKeyAlgorithms ssh-ed25519-cert-v01@openssh.com
...

[Optional] Client-Schlüssel-Datei authorized_keys löschen

root@client.example.com:~# rm /home/clientuser/.ssh/authorized_keys

SSH-Zugriff auf Host testen

clientuser@client.example.com:~ ssh -v host
...
debug1: Server host certificate: ssh-ed25519-cert-v01@openssh.com SHA256:xxx, serial 0 ID "host.example.com" CA ssh-ed25519 SHA256:xxx valid from xxx to xxx
...
debug1: Host 'host.example.com' is known and matches the ED25519-CERT host certificate.
debug1: Found CA key in /etc/ssh/ssh_known_hosts:1
...
Enter passphrase for key '/home/clientuser/.ssh/id_ed25519': ***

Quellen

https://cvsweb.openbsd.org/cgi-bin/cvsweb/src/usr.bin/ssh/PROTOCOL.certkeys?annotate=HEAD
https://man.openbsd.org/scp
https://man.openbsd.org/ssh
https://man.openbsd.org/ssh-keygen
https://man.openbsd.org/ssh-keygen#CERTIFICATES
https://man.openbsd.org/ssh-keyscan
https://man.openbsd.org/sshd.8
http://manpages.ubuntu.com/manpages/xenial/man5/sshd_config.5.html
https://www.digitalocean.com/community/tutorials/how-to-create-an-ssh-ca-to-validate-hosts-and-clients-with-ubuntu