Sicherheit, wenn private SSH-Schlüssel verloren gehen

7

Benutzer A verfügt über zwei private SSH-Schlüssel und hat diesen öffentlichen Schlüssel im Laufe der Zeit auf mehreren Servern verwendet. Er hat einen davon verloren und ein neues Paar erstellt.

Wie informiert mich Benutzer A (der Systemadministrator), dass er seinen Schlüssel verloren hat, und wie verwalte ich alle Server, auf die er Zugriff hatte (ich habe keine Liste aller Server, auf die Benutzer A Zugriff hat). Mit anderen Worten, wie kann ich den öffentlichen Schlüssel abrufen, der diesem privaten Schlüssel zugeordnet ist?

Bei der LDAP-basierten Authentifizierung kommunizieren alle Server zur Authentifizierung mit einem einzelnen Server-Repository. Wenn ich den Zugriff auf das Server entferne oder das Kennwort auf dem Server ändere, sind alle Systeme, die dieses LDAP zur Authentifizierung verwenden, gesichert, wenn Benutzer A sein Kennwort verliert.

Shree Mandadi
quelle
Wenn Sie nicht wissen, auf welchen Maschinen der Schlüssel vorhanden sein kann, können Sie nicht alle Maschinen kennen, die Sie reinigen müssen.
womble

Antworten:

4

Welche Version von sshd verwenden Sie? OpenSSH 5.4 hat anscheinend eine Schlüsselwiderrufsoption:

* Add the ability to revoke keys in sshd(8) and ssh(1). User keys may
be revoked using a new sshd_config(5) option "RevokedKeys". Host keys 
are revoked through known_hosts (details in the sshd(8) man page).   
Revoked keys cannot be used for user or host authentication and will  
trigger a warning if used.

Wenn Sie eine frühere Version verwenden, müssen Sie wahrscheinlich alle möglichen autorisierten Schlüsseldateien auf allen Ihren Servern durchlaufen, um den verdächtigen öffentlichen Schlüssel zu suchen und zu entfernen. Dies würde jedes Konto einschließen, in das Benutzer-A ssh könnte, einschließlich root. Dies setzt voraus, dass Sie keine zentralisierte authoried_key-Verwaltung verwenden.

cjc
quelle
Um die Frage weiter zu klären: Wenn der private Schlüssel dieses Benutzers A gefährdet ist, wie können Sie alle Server und Benutzerkonten sichern, denen der öffentliche Schlüssel zugeordnet ist? Ich habe das Gefühl, dass RevokedKeys und Known_hosts eine clientseitige Option sind.
Shree Mandadi
+1 für Centralized Authorized_key-Lösung, ich
suche
RevokedKeys können serverseitig sein (und auf der Clientseite verwendet werden, um Verbindungen zu bekannten fehlerhaften Servern zu verbieten). Aber das ist OpenSSH 5.4, das beispielsweise nicht mit RHEL6 ausgeliefert wird. Ich erinnere mich, dass in der LDAP-Benutzerkontokonfiguration etwas vorhanden ist, in dem Sie die autorisierten Schlüssel für einen bestimmten Benutzer speichern, diese jedoch möglicherweise nicht konfiguriert haben. Oh, es sieht so aus, als müssten Sie den
SSH-
Abgesehen davon haben wir die Datei "authorized_keys" von unserem Konfigurationsmanagementsystem, Chef, aus gesteuert.
CJC
Danke cjc ... Ich denke, das ist der richtige Weg ... Entwöhnen Sie alle Server, die individuell gesteuerte autorisierte Dateien haben, und greifen Sie auf die CMS-Systeme zurück ...
Shree Mandadi
1

Eine mögliche kurzfristige Lösung für diese Situation ist die Verwendung eines Konfigurationsverwaltungstools ( Ansible kann hier eine gute Wahl sein).

Sie können insbesondere das authorized_keyModul ( https://docs.ansible.com/ansible/authorized_key_module.html ) verwenden, um einen (oder mehrere) bestimmte Fingerabdrücke des öffentlichen Schlüssels aus der Datei "authorized_key" eines bestimmten Benutzers zu entfernen.

Ein Beispiel fehlt für Ihre Bedürfnisse, aber so etwas könnte funktionieren:

- name: Set authorized key took from url
  authorized_key:
    user: charlie
    state: absent
    key: https://github.com/charlie.keys

Sie können auch (zumindest in ansible) einen Befehl ausführen, um eine Liste aller Benutzer auf einem System zu erstellen, indem Sie / etc / passwd abfragen.

Sie können auch einfach eine neue Whitelist mit Schlüsseln erstellen und alles andere entfernen, aber das ist in Ihrer Situation möglicherweise nicht praktikabel.

Die ansible Dokumente geben ein grobes Beispiel dafür, wie das funktionieren könnte:

- name: Set authorized key, removing all the authorized key already set
  authorized_key:
    user: root
    key: '{{ item }}'
    state: present
    exclusive: True
  with_file:
    - public_keys/doe-jane

Auf lange Sicht möchten Sie vielleicht über Jumphosts nachdenken - ich habe festgestellt, dass Teleport ziemlich gut ist.

Ich wurde von der Wahrheit gegessen
quelle
0

Sowohl in OpenSSH als auch in Putty können Sie den öffentlichen Schlüssel vom privaten Schlüssel neu generieren, aber nicht umgekehrt.

Verwenden Sie den Dateinamen ssh-keygen -y -f

Importieren Sie in PuttyGen den Schlüssel und es wird Ihnen der öffentliche Schlüssel angezeigt.

TheVyom
quelle
Das hat überhaupt nichts mit der OP-Frage zu tun.
Sven
1
Verloren wie in verlorener Kontrolle über den Schlüssel und glaubt, dass jemand anderes eine Kopie davon haben könnte, oder es ist einfach in den Äther gegangen. In jedem Fall sollte es nicht installiert bleiben. Das hilft das nicht.
Jeff Ferland
@SvenW: Nach dem erneuten Generieren des öffentlichen Schlüssels können Sie einfach ein Skript ausführen, um alle Maschinenlisten mit autorisierten Schlüsseln nach diesem öffentlichen Schlüssel zu durchsuchen. (Im Wesentlichen a grepin den verschiedenen sshVerzeichnissen für eine Folge von beispielsweise 12 Zeichen.) Die Frage lautet: "Mit anderen Worten, wie erinnere ich mich an den öffentlichen Schlüssel, der diesem privaten Schlüssel zugeordnet ist." und der erste Schritt dabei besteht darin, herauszufinden, was dieser öffentliche Schlüssel ist, damit Sie danach suchen können.
David Schwartz
0

Wenn dies ein Benutzerschlüssel ist (wie es scheint), befindet er sich in der authorized_keysDatei für Benutzer-IDs, auf die der Benutzer Zugriff hatte. Sie müssen das Unterverzeichnis .ssh der Home-Verzeichnisse durchsuchen. (Wenn Sie Home-Verzeichnisse automatisch bereitgestellt haben, müssen Sie nur das Verzeichnis auf einem Server durchsuchen. Andernfalls müssen Sie alle Server durchsuchen, auf die sie möglicherweise Zugriff hatten.)

Das Problem besteht darin, die erste Kopie des alten Schlüssels zu finden. Das Home-Verzeichnis des Benutzers auf Systemen, auf die häufig zugegriffen wird, ist ein guter Ausgangspunkt. Sobald Sie den Schlüssel haben, können Sie ihn auf anderen Systemen und Benutzer-IDs abrufen. Wenn Sie eher nach dem Schlüsselwert als nach dem Kommentar suchen, werden mit größerer Wahrscheinlichkeit alle Schlüssel gefunden.

BillThor
quelle
0

Wie erinnere ich mich an den öffentlichen Schlüssel, der diesem privaten Schlüssel zugeordnet ist?

Während das Widerrufen von SSH-Schlüsseln sicherlich keine schlechte Idee ist, besteht die bessere (oder skalierbarere) Lösung darin, MFA (Multi-Faktor-Authentifikator, auch bekannt als Zwei-Faktor-Authentifizierung) zu implementieren. Dies hat zur Folge, dass der Schlüssel abgewertet wird, da sich der Benutzer nur anmelden kann, wenn er (1) zusätzlichen Faktor erfüllt.

Es gibt einige Open Source-Lösungen wie Google Authenticator und Oath. Dann eine hybride Open Source / kommerzielle Lösung wie Duo. Mit Duo können Sie sogar Geo-Zaun-Logins und Push-Benachrichtigungen erstellen.

Für eine 100% funktionsfähige Beispielimplementierung überprüfen Sie diese Bastion, die als Docker-Container implementiert ist: https://github.com/cloudposse/bastion

Erik Osterman
quelle