Marionettensicherheit und Netzwerktopologien


26

Hintergrund:

Ich nehme mir endlich Zeit, mich dem 21. Jahrhundert anzuschließen und mir Puppet anzuschauen.

Nach dem heutigen Stand der Versionskontrolle werden alle Serverkonfigurationen in einem internen Repository im Büro verwaltet. Wenn ein Update durchgeführt werden muss, werden die Änderungen wieder in die Repos eingecheckt und manuell auf die betreffende Maschine übertragen. Dies bedeutet normalerweise, dass SFTPs auf den Remote-Computer gesendet werden und anschließend Dateien mit den entsprechenden Berechtigungen von einer Shell an ihren Platz verschoben werden.

Daher hoffe ich, dass Puppet eine einfache, aber erstaunliche Erweiterung zu dem sein wird, was wir bereits haben.

Jetzt denke ich, dass wir derzeit einigermaßen sicher sein müssen. Unter der Annahme, dass unser internes Netzwerk immer relativ sicherer ist als die öffentlichen Netzwerke in unseren Rechenzentren.

  • Der Prozess ist immer ein Weg. Änderungen werden von einer sicheren Umgebung zu einer unsicheren und niemals umgekehrt.

  • Der Master Store befindet sich am sichersten Ort. Das Risiko von Kompromissen durch das Stehlen von Konfigurationen oder das Versenden von böswilligen Änderungen wird erheblich reduziert.

Frage:

Nach meinem Verständnis des Puppet-Server- / Client-Modells rufen die Clients Aktualisierungen direkt vom Server ab und rufen sie ab. Der Datenverkehr ist SSL-geschützt und kann daher nicht abgefangen oder gefälscht werden. Es unterscheidet sich jedoch von dem, was wir derzeit tun, da die Puppet-Server an einem öffentlichen Ort gehostet werden müssten. Entweder zentral oder für jeden von uns verwalteten Rechenzentrumsstandort.

Ich frage mich also:

  • Bin ich unnötig paranoid beim Wechsel von Push zu Pull?

  • Bin ich unnötig paranoid, wenn ich all diese Informationen zentral in einem öffentlichen Netzwerk speichere?

  • Wie unterhalten andere mehrere Netzwerke - separate Server für jeden Standort?


Update 30/07/09:

Ich denke, eines meiner anderen großen Anliegen ist es, auf eine einzige Maschine zu vertrauen. Der oder die Puppenmeister wären Firewall, gesichert und so. Trotzdem hat jede öffentliche Maschine mit Abhördiensten eine Angriffsfläche von einer bestimmten Größe.

Wenn der Master die Berechtigung hat, eine Datei auf einem der Puppet-Clients zu aktualisieren, führt dies vermutlich letztendlich zu einer Gefährdung aller seiner Clients. Die "Könige zum Königreich" sozusagen.

  • Ist diese Hypothese richtig?

  • Gibt es eine Möglichkeit, dies zu mildern?


Ihre Hypothesen sind richtig; kompromisse beim puppenmeister sind kompromisse bei allen kunden. Es ist jedoch einfacher, sich bei der Sicherheit einer einzelnen Maschine wohl zu fühlen, auf die Sie Ihre Aufmerksamkeit konzentrieren können, als auf ein ganzes Netzwerk von Maschinen, nicht wahr? Die Schadensbegrenzung hängt von Ihrer Umgebung ab, aber Marionette ist als Klempner geschrieben. Es gibt eine ganze Reihe von "Haken", an denen Sie nach Bedarf Audits oder zusätzliche Prüfungen hinzufügen können.
Paul Lathrop

1
@Paul - Eine Art "alle Eier in einen Korb legen, nachdem Sie sichergestellt haben, dass Sie einen sehr guten Korb haben" -Ansatz?
Matt Simmons

Antworten:


10

Da ich manchmal Passwörter in Variablen in meinen Modulen speichere, um Anwendungen bereitstellen zu können, ohne die Konfiguration manuell abschließen zu müssen, bedeutet dies, dass ich mein Puppet Repo nicht anständig auf einen öffentlichen Server stellen kann. Dies würde bedeuten, dass ein Angriff auf den Puppenmeister es erlauben würde, einige App- oder DB-Passwörter für alle unsere verschiedenen Anwendungen auf allen unseren Servern zu erhalten.

Mein Puppetmaster ist also in unserem privaten Netzwerk und ich starte keinen Puppetd-Daemon auf den Servern. Wenn ich bereitstellen muss, verwende ich ssh vom privaten Netz zu den Servern, erstelle einen Tunnel und rufe Puppetd aus der Ferne auf.
Der Trick besteht nicht darin, den Remote-Tunnel und Puppet-Client so einzustellen, dass eine Verbindung zum Puppetmaster hergestellt wird, sondern zu einem Proxy, der http connect akzeptiert und den Puppetmaster-Server im privaten Netzwerk erreichen kann. Andernfalls weigert sich Puppet zu ziehen, da der Hostname mit den Zertifikaten in Konflikt steht

# From a machine inside privatenet.net :
ssh -R 3128:httpconnectproxy.privatenet.net:3128 \
    -t remoteclient.publicnetwork.net \
    sudo /usr/sbin/puppetd --server puppetmaster.privatenet.net \
    --http_proxy_host localhost --http_proxy_port 3128 \
    --waitforcert 60 --test –-verbose

Es funktioniert für mich, hofft, es hilft dir


Brillant! Aber brauchst du eine einzige Zeit für die Puppe? Andernfalls bricht der Tunnel nicht zusammen, nachdem der Befehl ausgeführt wurde. Puppetd wird jedoch standardmäßig als Server ausgeführt.
Purfideas

Die Marionette, die gestartet wird, ist nicht daemonisiert. Ich bevorzuge die Option --test anstelle des Paares --onetime --no-daemonize. Puppetd wird also im Vordergrund ausgeführt und ssh erzwingt ein Terminal (Option -t). Es hat auch den Vorteil, dass Sie mit der laufenden Puppe interagieren können (z. B. Strg ^ c für eine saubere Beendigung der Puppe). Sobald puppetd beendet ist, wird die SSH-Sitzung beendet und der Tunnel geschlossen.
Alex F

Ich fand, dass dies immer noch Probleme verursachte und so einen OpenVPN-Server auf der Firewall-Maschine so konfigurierte, dass das Netzwerk mit dem Puppet-Server von der / den entfernten Maschine (n) aus kontaktiert werden kann ...
David Gardner

4

Wir haben zwei Standorte, unser Büro und unser Büro. Jeder Ort hat seinen eigenen Puppenspieler. Wir haben ein SVN-Repository mit der folgenden Struktur eingerichtet:

root/office
root/office/manifests/site.pp
root/office/modules
root/colo
root/colo/manifests/site.pp
root/colo/modules
root/modules

Das Modulverzeichnis unter jeder Site ist ein Verzeichnis svn: externals zurück zum Modulverzeichnis der obersten Ebene. Dies bedeutet, dass sie genau dasselbe Modulverzeichnis verwenden. Wir stellen dann sicher, dass sich die überwiegende Mehrheit der von uns geschriebenen Klassen im Verzeichnis modules befindet und von beiden Sites verwendet wird. Dies hat den schönen Vorteil, dass wir gezwungen sind, generisch zu denken und keine Klasse an eine bestimmte Site zu binden.

Aus Sicherheitsgründen hosten wir unseren Puppenspieler (und den Rest unseres Netzwerks) hinter unserer Firewall, sodass wir uns nicht darum kümmern, die Konfiguration zentral zu speichern. Der Puppenspieler sendet die Konfiguration nur an Hosts, denen er vertraut. Natürlich müssen Sie diesen Server sicher halten.


Vielen Dank. Der SVN: Externals-Tipp ist eine nette Geste. Alles wird durch eine Firewall geschützt. Wie Sie wissen, hat ein Abhördienst von Natur aus eine größere Angriffsfläche.
Dan Carley

2

Ich kann nicht beurteilen, wie notwendig Ihre Paranoia ist, es hängt stark von Ihrer Umgebung ab. Ich kann jedoch mit Zuversicht sagen, dass die beiden Hauptpunkte Ihrer bestehenden Konfiguration weiterhin zutreffen. Sie können sicherstellen, dass Ihr Wechsel von einer sicheren Umgebung (dem Repository in Ihrem Büro) zu einer weniger sicheren Umgebung erfolgt, unabhängig davon, wo sich Ihr Puppenspieler befindet. Sie ändern den Prozess von SFTP'ing auf eine Reihe von Servern und legen die Dateien manuell an Ihren Puppenmeister, damit Puppet die Dateien verteilt und an der richtigen Stelle ablegt. Ihr Hauptgeschäft ist weiterhin das Repository, und Ihre Risiken werden gemindert.

Ich glaube nicht, dass Push oder Pull von Natur aus sicherer sind als das andere Modell. Puppet leistet hervorragende Arbeit bei der Sicherung der Konfigurationen während der Übertragung sowie bei der Authentifizierung von Client und Server, um sicherzustellen, dass ein bidirektionales Vertrauen besteht.

Was die Mehrfachnetze betrifft, so erledigen wir dies mit einem zentralen "Master" -Puppenmeister mit Satellitenpuppenmeistern an jedem Standort, die als Kunden für den zentralen Master fungieren.


Der Satellitenansatz klingt interessant. Ist eine spezielle Konfiguration erforderlich? Könnten Sie mich in die Richtung einer Dokumentation weisen?
Dan Carley

Es ist keine spezielle Konfiguration erforderlich. Sie rennen nur Puppetd auf den Satelliten. puppet.conf sollte die Servereinstellung auf "master" setzen, anstatt auf sich selbst zu zeigen (was eine typischere Konfiguration ist)
Paul Lathrop

1

Ein Entwurfsansatz besteht darin, einen Puppenmeister vor Ort an jedem Systemstandort zu haben und ein Bereitstellungstool zu verwenden, um Änderungen an den Puppenmeistern zu übertragen. (Die Verwendung von Git mit Git Hooks könnte auch funktionieren).

Dies würde Ihre Besorgnis über Abhördienste in einem öffentlichen Netzwerk bewahren, da der Puppet-Netzwerkverkehr nur intern erfolgen würde.

Es ist auch möglich, die Manifeste auf jeden Server zu übertragen und den Puppet-Client die Manifeste analysieren zu lassen und die entsprechenden Konfigurationen anzuwenden.


0

Obwohl du "extern" sagst, bezweifle ich wirklich, dass willkürliche Leute eine Verbindung zu deinem Puppenspieler herstellen müssen. Sie können immer ein VPN in die Mischung werfen. Ein Freund von mir fragte mich einmal: "Müssen Sie sich um die Sicherheit des Protokolls sorgen, wenn die Verbindung sicher ist?" Obwohl ich mit dieser Einstellung nicht einverstanden bin, tut eine zusätzliche Schicht niemals weh und wirkt mit Sicherheit Wunder auf meine persönliche Paranoia. Außerdem macht es Spaß, Tunnel zu tunneln.


0

Mark Burgess, der Autor von cfengine und Universitätsprofessor (dieser Puppe scheint sein Erbe zu verdanken), hat viel über Push and Pull geschrieben. Er behauptet, Pull sei von Natur aus sicherer. Wenn Sie sich die Website von cfengine ansehen, gab es in den letzten 17 Jahren nur einen Sicherheitsvorfall. Burgess behauptet, das liege am Pull-Design. Ich denke, ein einziger Kompromisspunkt ist unvermeidlich. Ich wäre mehr besorgt über die Angriffswege bis zu diesem Punkt.


0

Sie können Marionetten ohne einen zentralen Master ausführen, wenn Sie möchten. Eine Methode, die ich gesehen habe, ist die Verwendung eines Git-Repositorys und Skripts, die nur dann ein Update zusammenführen und bereitstellen, wenn das Tag von einer vordefinierten Liste von GPG-Schlüsseln signiert ist. Die Leute haben sogar herausgefunden, wie man gespeicherte Konfigurationen erhält (zum Beispiel um Nagios Monitoring auf einem zentralen Server von einer Ressource aus einzurichten, die auf einem anderen Server verarbeitet wurde).

Wenn also der zentrale Git-Server kompromittiert wäre, würden die anderen Server keine Updates mehr von ihm anwenden. Die gpg-Schlüssel befinden sich auf Laptops von sys admin oder so, zusammen mit einer Möglichkeit, Schlüssel zu widerrufen.

Weitere Informationen finden Sie unter http://current.workingdirectory.net/posts/2011/puppet-without-masters/

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.