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