Was sind bewährte Methoden zum Verwalten von SSH-Schlüsseln in einem Team?


42

Ich arbeite mit kleinen Teams (<10) von Entwicklern und Administratoren mit den folgenden Eigenschaften:

  • Die meisten Mitglieder des Teams haben> 1 PC, von denen die meisten tragbar sind
  • Teammitglieder haben Zugriff auf 10-50 Server, normalerweise mit sudo

Ich denke, das ist ziemlich typisch für die meisten Startups und kleinen bis mittleren IT-Konzernen.

Was sind die Best Practices für die Verwaltung von SSH-Schlüsseln in einem solchen Team?

Sollten Sie einen einzigen Schlüssel für das gesamte Team freigeben?

Sollte jede Person einen eigenen Schlüssel für ein gemeinsam genutztes Konto haben ("ubuntu" auf jedem Server)?

Konten trennen?

Sollte jedes Teammitglied für jeden Laptop oder Desktop-Computer einen eigenen Schlüssel haben?

Antworten:


33

In meinem Unternehmen verwenden wir LDAP, um auf allen Computern einen einheitlichen Kontensatz zu haben, und verwenden dann ein Konfigurationsverwaltungstool (in unserem Fall derzeit cfengine), um authorized_keysDateien für jeden Benutzer auf allen Servern zu verteilen . Die Schlüsseldateien selbst werden (zusammen mit anderen Systemkonfigurationsinformationen) in einem Git-Repository gespeichert, damit wir sehen können, wann Schlüssel kommen und gehen. cfengine verteilt auch eine sudoersDatei, die steuert, wer Zugriff hat, um was als root auf jedem Host auszuführen, und zwar unter Verwendung der Benutzer und Gruppen aus dem LDAP-Verzeichnis.

Die Kennwortauthentifizierung ist auf unseren Produktionsservern vollständig deaktiviert, daher ist die SSH-Schlüsselauthentifizierung obligatorisch. Die Richtlinie empfiehlt die Verwendung eines separaten Schlüssels für jeden Laptop / Desktop / was auch immer und die Verwendung einer Passphrase für alle Schlüssel, um die Auswirkungen eines verlorenen / gestohlenen Laptops zu verringern.

Wir haben auch einen Bastion-Host, der verwendet wird, um auf Hosts im Produktionsnetzwerk zuzugreifen, sodass wir in diesem Netzwerk sehr restriktive Firewall-Regeln haben. Die meisten Ingenieure haben eine spezielle SSH-Konfiguration, um dies transparent zu machen:

Host prod-*.example.com
     User jsmith
     ForwardAgent yes
     ProxyCommand ssh -q bastion.example.com "nc %h %p"

Das Hinzufügen eines neuen Schlüssels oder das Entfernen eines alten Schlüssels erfordert in diesem Setup einige Zeremonien. Ich würde argumentieren, dass es für das Hinzufügen eines neuen Schlüssels wünschenswert ist, dass es sich um eine Operation handelt, die einen Prüfpfad verlässt und für alle sichtbar ist. Aufgrund des damit verbundenen Aufwands wird es jedoch manchmal vernachlässigt, einen alten Schlüssel zu entfernen, wenn er nicht mehr benötigt wird, und wir haben keine echte Möglichkeit, dies zu verfolgen, außer aufzuräumen, wenn ein Mitarbeiter das Unternehmen verlässt. Es erzeugt auch zusätzliche Reibung, wenn ein neuer Ingenieur an Bord ist, da er einen neuen Schlüssel generieren und an alle Hosts senden muss, bevor er vollständig produktiv ist.

Der größte Vorteil ist jedoch, dass jeder Benutzer einen eigenen Benutzernamen hat. Dies erleichtert die differenziertere Zugriffskontrolle, wenn dies erforderlich ist, und gibt jedem Benutzer eine Identität, die in Überwachungsprotokollen angezeigt wird Produktionsproblem zurück zu einer Sysadmin-Aktion.

Bei dieser Konfiguration ist es lästig, automatisierte Systeme zu haben, die Maßnahmen gegen Produktionshosts ergreifen, da deren "bekannte" SSH-Schlüssel als alternativer Zugriffspfad dienen können. Bisher haben wir den Benutzerkonten für diese automatisierten Systeme nur den minimalen Zugriff gewährt, den sie für ihre Arbeit benötigen, und akzeptiert, dass ein böswilliger Benutzer (der bereits Ingenieur mit Produktionszugriff sein muss) diese Aktionen auch halbwegs ausführen kann. anonym mit dem Schlüssel der Anwendung.


Das ist eine wirklich gute Antwort! Folgefrage: Sie verwenden cfengine, um .authorized_keys zu verteilen. Haben Sie nach Möglichkeiten gesucht, öffentliche SSH-Schlüssel direkt auf Ihrem LDAP-Server zu speichern? Sie erfordern meistens das Patchen von sshd, was sich zerbrechlich anfühlt.
Evan Prodromou

Ich habe etwas Ähnliches mit Chef gemacht.
gWaldo

1
@EvanProdromou Ich habe öffentliche SSH-Schlüssel in LDAP eingerichtet, aber das war weitaus mühsamer als es sich gelohnt hat, da ich selbst aktuelle SSH-Pakete warten musste und es sich um die Zeit einiger SSH-Sicherheitslücken handelte
Daniel Lawson

1
Sudo-Regeln und SSH-Schlüssel können auch in LDAP abgelegt werden. SSSD kann dazu verwendet werden. Links: sudo.ws/sudoers.ldap.man.html und access.redhat.com/knowledge/docs/en-US/Red_Hat_Enterprise_Linux/...
fuero

Ich mag dein ProxyCommand ssh -qbisschen dort! Das habe ich noch nie gesehen. Ich zögere, einen Bastion-Server einzurichten, aber wenn er für die Endbenutzer transparent sein kann, bin ich vielleicht alles dafür. Vielen Dank, Martin!
the0ther

6

Persönlich mag ich die Idee, dass jeder Mitarbeiter einen Schlüssel auf einem dedizierten SSH-Bastion-Computer hat, auf dem er ein grundlegendes Benutzerkonto hat. Dieses Benutzerkonto verfügt über einen SSH-Schlüssel, der den Zugriff auf alle Server ermöglicht, die sie benötigen. (Diese anderen Server sollten ebenfalls mit einer Firewall versehen sein, damit nur der SSH-Zugriff vom Bastion-Computer aus möglich ist.)

Dann können sie an ihren täglichen Arbeitsmaschinen, Laptops, Tablets usw. selbst entscheiden, ob sie einen Schlüssel zwischen sich oder mehrere Schlüssel haben möchten.

Als Systemadministrator in diesem Netzwerk müssen Sie eine Mindestanzahl von Schlüsseln verwalten (einen pro Entwickler), können den SSH-Zugriff über das Netzwerk problemlos überwachen (da alle über die Bastion-Maschine geleitet werden) und ob die Entwickler mehrere Schlüssel benötigen oder nur Eine, die sie auf ihren Rechnern teilen, ist kein wirkliches Problem, da Sie nur einen Rechner aktualisieren müssen. (es sei denn, die ssh-Schlüssel der Bastionen sind kompromittiert, aber das ist weitaus unwahrscheinlicher als einer der Benutzerschlüssel)


5

Ich hatte die Situation, in der ich einem Team von 40 Entwicklern SSH-Schlüsselzugriff auf ~ 120 entfernte Kundenserver gewähren musste.

Ich kontrollierte den Zugriff, indem ich die Entwickler zwang, eine Verbindung über einen einzigen "Sprunghost" herzustellen. Von diesem Host aus habe ich private / öffentliche Schlüssel generiert und an die Kundenserver weitergeleitet. Wenn die Entwickler Zugriff von einem Laptop benötigen, können sie auf ihrem lokalen System dasselbe Schlüsselpaar verwenden.


2

Ich persönlich würde mit pro Benutzer gehen, dann haben Sie sofort Verantwortlichkeit und stellen Beschränkungen viel einfacher ein - ich weiß nicht, was andere Leute denken?


2

Ein Ansatz, von dem ich gehört habe, den ich aber nicht selbst verwendet habe, besteht darin, dass jeder Benutzer ein Paket (z. B. .deb, .rpm) hat, das die Konfiguration seines öffentlichen SSH-Schlüssels sowie alle von ihm gewünschten Punktedateien (.bashrc) enthält , .profile, .vimrc etc). Dies wird signiert und in einem Unternehmensrepository gespeichert. Dieses Paket kann auch für die Erstellung des Benutzerkontos verantwortlich sein oder das Erstellen des Kontos (cfengine / puppet usw.) oder ein zentrales Authentifizierungssystem wie LDAP ergänzen.

Diese Pakete werden dann über einen beliebigen Mechanismus (cfengine / puppet etc, cron job) auf den Hosts installiert. Ein Ansatz ist ein Metapaket, das von den Paketen pro Benutzer abhängt.

Wenn Sie einen öffentlichen Schlüssel entfernen möchten, jedoch nicht den Benutzer, wird das Paket pro Benutzer aktualisiert. Wenn Sie einen Benutzer entfernen möchten, entfernen Sie das Paket.

Wenn Sie heterogene Systeme haben und sowohl .rpm- als auch .deb-Dateien verwalten müssen, kann ich dies als etwas ärgerlich empfinden, obwohl Tools wie alien dies möglicherweise etwas erleichtern.

Wie ich schon sagte, ich habe das nicht selbst gemacht. Der Vorteil dieses Ansatzes ist für mich, dass er ein zentrales LDAP-System und die zentrale Verwaltung von Benutzerkonten ergänzt, indem er es einem Benutzer ermöglicht, sein Paket auf einfache Weise so zu aktualisieren, dass es beispielsweise seine .vimrc-Datei enthält, ohne dass diese Datei verwaltet werden muss durch Werkzeuge wie Marionetten, auf die ein Benutzer möglicherweise keinen Zugriff hat.


1

Sie sollten den sichereren Weg einschlagen und jeden Benutzer dazu zwingen, separate Schlüssel zu haben, wahrscheinlich für jedes Gerät.

Wenn Sie Schlüssel zwischen Benutzern gemeinsam nutzen - auch wenn Sie ein kleines Team sind -, ist das Widerrufen eines Schlüssels für alle anderen eine Unannehmlichkeit.

Wenn Sie Ihren Mitarbeitern erlauben, einen Schlüssel für alle ihre Geräte zu haben, können sie auswählen, mit welchen Servern sie sich mit diesem Gerät verbinden können. Ein mobiler Laptop kann beispielsweise auf einen oder zwei Server beschränkt sein, der Desktop im Büro kann jedoch auf alle Server zugreifen.


1

Vor ein paar Jahren hat Envy Labs ein Tool namens Keymaster (in Zusammenarbeit mit dem Kunden Gatekeeper) geschrieben, um so etwas für Entwicklungsteams zu erledigen.

Das Projekt hatte in den letzten zwei Jahren nicht viel Liebe, aber es ist wahrscheinlich etwas, an dem Sie basteln und das Sie vielleicht wieder zum Leben erwecken könnten?

Das Repo ist in github verfügbar: https://github.com/envylabs/keymaster


-4

Ein Ansatz könnte darin bestehen, einen NIS-Server mit / home share über NFS einzurichten. Dies wird mit sudo auf den Servern kombiniert und ermöglicht nur Benutzern, die Sie über die ssh-Konfiguration an jeden Server senden möchten.

Auf diese Weise verwendet jedes Mitglied des Teams nur einen Benutzer und seinen Schlüssel, um auf alle Server zuzugreifen. Sudo und ein Passwort für die Admin-Aufgaben.

Grüße,

Rafael


1
1) Das Aktivieren von NIS ist eine Sicherheitslücke. 2) Ein einziges Passwort und Konto widersprechen der Rückverfolgbarkeit und Verantwortlichkeit.
Deer Hunter
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.