it-swarm.com.de

Wie richte ich OpenSSH für die Verwendung der x509-PKI zur Authentifizierung ein?

Ich meine nicht einfach, den öffentlichen RSA-Schlüssel eines x.509-Zertifikats in ~/.ssh/authorized_keys Zu setzen - ich suche nach einer Möglichkeit, ein ssh so einzurichten, dass x.509-Zertifikate von einer vordefinierten Zertifizierungsstelle signiert werden automatisch Zugriff auf das verknüpfte Benutzerkonto gewährt. RFC 6187 scheint eine solche Funktionalität vorzuschlagen, aber ich kann keine Dokumentation dazu finden oder ob sie überhaupt in OpenSSH implementiert ist.

Hier ist eine ausführlichere Beschreibung dessen, was ich tun möchte:

  • Eine CA ("SSH-CA") wird eingerichtet
  • Diese Zertifizierungsstelle wird verwendet, um Benutzerzertifikate mit keyUsage=digitalSignature (Und möglicherweise dem Feld id-kp-secureShellClient ExtendedKeyUsage) zu signieren.
  • Mit diesem Zertifikat können Sie sich jetzt bei einem Server anmelden. Für den Server muss der öffentliche Schlüssel nicht im authorized_keys Vorhanden sein. Stattdessen wird es so eingerichtet, dass es der SSH-CA vertraut, um den öffentlichen Schlüssel und die Signatur des Zertifikats (oder der Zertifikatkette) und den Benutzernamen/die UID zu überprüfen (wahrscheinlich direkt im Feld subjectAltName oder möglicherweise unter Verwendung einiger serverseitige Zuordnung), bevor die übliche RSA-Authentifizierung stattfindet

Wie kann dies mit OpenSSH erreicht werden, und wenn ein Patch erforderlich ist, wie können clientseitige Änderungen minimal gehalten werden?


Alternativ könnte man auch ein beliebiges S/MIME-Zertifikat sowie einen Benutzernamen für die Zuordnung der E-Mail-Adresse verwenden, ohne eine eigene Zertifizierungsstelle zu benötigen. Der Client könnte auch weiterhin nur den privaten RSA-Schlüssel verwenden und ein Zertifikatserver wird verwendet, um ein Zertifikat von einem öffentlichen Schlüssel zu erhalten. Zusätzlich bietet er die Möglichkeit, auch PGP-Zertifikate (z. B. über monkeysphere ) ohne zu verwenden Der Benutzer benötigt Kenntnisse über all dies, solange er lediglich einen öffentlichen Schlüssel bereitstellt.

Wenn dies nicht von Haus aus möglich ist, könnte ich mir eine halbautomatische "Implementierung" einfallen lassen, indem ein Skript auf dem Server automatisch ein anderweitig übermitteltes Zertifikat über openssl (oder gnupg) und lassen Sie den öffentlichen Schlüssel in die authorized_keys - Datei des jeweiligen Benutzers einfügen - obwohl ich an diesem Punkt wahrscheinlich mehr oder weniger das = wiederhole monkeyshere project ...

38
Tobias Kienzler

OpenSSH unterstützt offiziell keine x.509-zertifikatbasierte Authentifizierung:

Die Entwickler sind der Ansicht, dass die Komplexität von X.509-Zertifikaten eine inakzeptable Angriffsfläche für sshd einführt. Stattdessen haben sie [kürzlich] ein alternatives Zertifikatformat implementiert, das viel einfacher zu analysieren ist und somit ein geringeres Risiko mit sich bringt.

...

OpenSSH verwendet nur die kryptografischen Algorithmen auf niedriger Ebene von OpenSSL.

Jedoch Roumen Petrov veröffentlicht OpenSSH-Builds, die X.509-Unterstützung enthalten , und Sie können es mit diesen versuchen.

X.509-Zertifikate können als "Benutzeridentität" und/oder "Hostschlüssel" in SSH-Authentifizierungen "Öffentlicher Schlüssel" und "Hostbasiert" verwendet werden.

Die Builds von Roumen Petrov können heruntergeladen werden über diese Seite .

Hier ist eine Debian-Anleitung für SSH mit Authentifizierungsschlüssel anstelle des Kennworts , die sich auch als nützlich erweisen kann, wenn Sie OpenSSH so einrichten, dass x509-PKI für die Benutzerauthentifizierung akzeptiert wird.

30
TildalWave

Die native zertifikatbasierte Authentifizierung ist in unverändertem Upstream-OpenSSH verfügbar. Es basiert jedoch nicht auf x.509.

Generieren Sie zunächst Ihre Zertifizierungsstelle:

ssh-keygen -f ssh-ca

Installieren Sie als Nächstes Ihren CA-Schlüssel in .authorized_keys Mit dem Präfix cert-authority:

echo "cert-authority $(<ssh-ca.pub)" >>.ssh/authorized_keys

Ab diesem Zeitpunkt, wenn ein Schlüssel von einem Benutzer generiert wird:

ssh-keygen -f real-key

... der öffentliche Teil kann von Ihrer SSH-Zertifizierungsstelle signiert werden. Danach wird er vom Server als vertrauenswürdig eingestuft, ohne dass dieser Schlüssel selbst zu authorized_keys hinzugefügt wird:

ssh-keygen -s ssh-ca -I identifier_for_your_real_key_goes_here real-key.pub
26
Charles Duffy

Mit OpenSSH ist das nicht möglich. Wie von @TildalWave gesagt, müssen Sie die Gabel von Roumen Petrov verwenden PKIXSSH .

Sobald Sie Ihr X509-Zertifikat haben, müssen Sie den öffentlichen Schlüssel nicht mehr zur Datei authorized_keys Hinzufügen.

Sie müssen zwei Dinge auf der Serverseite konfigurieren:

  • Fügen Sie das Zertifikat für die Zertifizierungsstelle in das Verzeichnis ein, das durch die Anweisung CACertificatePath in der Datei sshd_config Festgelegt wurde (normalerweise /etc/ssh/ca/crt, Denke ich). mit einem Link für den Hash des Zertifikats.

    Verwenden Sie zum Erstellen des Links openssl. Angenommen, das CA-Zertifikat wurde unter /ect/ssh/ca/crt/ca.crt Kopiert, lauten die Befehle:

cd /etc/ssh/ca/crt/
ln -s ca.crt `openssl x509 -in ca.crt -noout -hash`.0
  • Fügen Sie die "Betreff" -Informationen des x509-Zertifikats zur authorized_keys - Datei des Benutzers (im Zielserver) hinzu

    Angenommen, der private Schlüssel und das X509-Zertifikat des Benutzers befinden sich in ssh/id_rsa, Damit der Betreff im Client ausgeführt wird:

openssl x509 -noout -subject -in .ssh/id_rsa

Und sie auf dem Server, fügen Sie diese Zeile mit dem Präfix x509v3-sign-rsa subject= Zu authorized_keys Hinzu.

Diese Zeile hat einen ähnlichen Inhalt wie dieser:

x509v3-sign-rsa subject= /C=ES/ST=Pontevedra/L=Vigo/CN=testssh/[email protected]

Wie wir sehen können, erfolgt die Authentifizierung wirklich und vertraut der Zertifizierungsstelle für jedes gültige x509-Zertifikat des Benutzers . Wir könnten ein neues Zertifikat generieren und es wird ohne Eingreifen auf der Serverseite akzeptiert.


Nachdem ich einige Tage gekämpft habe, habe ich einen Beitrag geschrieben, in dem der gesamte Prozess in einem Blog erläutert wird, den ich gerade bereitgestellt habe. Sie können es unter "OpenSSH mit X509-Zertifikaten HOW TO" lesen.

2
Ciges

CA-signierte SSH-Schlüssel

Wenn Sie den Benutzerzugriff außerhalb der Grenzen verwalten möchten, möchten Sie den öffentlichen Schlüssel nicht in den Dateien "authorized_keys" auf den Servern installieren, auf die sie zugreifen müssen. Sie möchten auch keine persönlichen Konten verwalten, sondern stattdessen einen Principal (Funktionskonto, d. H. Admin) verwenden und einen Leasingvertrag dafür abschließen.

Sie können eine Certificate Signing Authority für Secure Shell (anders als X509 TLS/SSL) erstellen, indem Sie einfach ein SSH-Schlüsselpaar erstellen. Der öffentliche Schlüssel der Zertifizierungsstelle ist auf allen Servern installiert. Dies ist die einzige Datei, die vorhanden sein muss. (Sie können 2 CA-Schlüssel in der Datei oder mehr haben, wenn Sie benötigen.)

$ ssh-keygen -t rsa -b 4096 -f ~/.ssh/ca_ssh
cat ~/.ssh/ca_ssh.pub

Kopieren Sie diese Datei auf die Server und fügen Sie sie zu /etc/ssh/sshd_config:

TrustedUserCAKeys /etc/ssh/trusted-user-ca-keys.pub

Zugriff gewähren

Führen Sie diesen Befehl aus und senden Sie die Datei fred.pub-cert an Fred zurück, um Freds öffentlichen Schlüssel (fred.pub) zu signieren, um eine Woche Zugriff auf den Server als Administrator zu gewähren und sich als Mitarbeiter in/var/log/Secure anzumelden.

ssh-keygen -s ~/.ssh/ca_ssh -I staff -n admin -V +1w fred.pub

Schlüssel widerrufen

Fügen Sie öffentliche Schlüssel von Personen hinzu, die sich während ihres Mietvertrags nicht mehr anmelden sollten, um playbook_dir/files/ssh/revoked_keys

0
bbaassssiiee