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_keys
Dateien 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 sudoers
Datei, 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.
ProxyCommand ssh -q
bisschen 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!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)
quelle
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.
quelle
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?
quelle
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.
quelle
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.
quelle
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
quelle
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
quelle