Verwalten von Linux-Computerclustern hinter Firewalls

19

Das Produkt meines Unternehmens ist im Wesentlichen eine Linux-Box (Ubuntu), die sich in einem fremden Netzwerk befindet und unsere Software ausführt. Bisher hatten wir weniger als 25 Boxen in freier Wildbahn und haben sie mit TeamViewer verwaltet.

Wir sind jetzt dabei, 1000 dieser Boxen auszuliefern, und TeamViewer ist keine Option mehr. Meine Aufgabe ist es, eine Möglichkeit zu finden, auf diese Boxen zuzugreifen und die Software auf ihnen zu aktualisieren . Diese Lösung sollte in der Lage sein, Firewalls zu durchdringen und was Sie haben.

Ich habe überlegt:

1. Eigenentwickelte Lösung (z. B. ein Linux-Dienst), die einen SSH-Reverse-Tunnel zu einem Server in der Cloud und einen weiteren Dienst in der Cloud herstellt, der diese verfolgt und Ihnen ermöglicht, eine Verbindung zu ihnen herzustellen .

Dies ist offensichtlich arbeitsintensiv und fühlt sich offen gesagt an, als würde man das Rad neu erfinden, da so viele andere Unternehmen bereits auf dieses Problem gestoßen sein müssen. Trotzdem bin ich mir nicht sicher, ob wir einen großartigen Job machen werden.

2. Tools wie Marionette, Koch oder OpenVPN

Ich habe versucht, so viel wie möglich zu lesen, aber ich kann nicht genug durch das Marketing sprechen, um die naheliegende Wahl zu verstehen.

Niemand außer uns muss sich mit diesen Boxen verbinden. Gibt es jemanden mit einschlägiger Erfahrung, der mir einige Hinweise geben kann?

Hakura
quelle
2
"Wir sind nicht im Begriff zu versenden" => "Wir sind jetzt im Begriff zu versenden"?
Bob

Antworten:

23

Updates ziehen, nicht pushen

Während Sie skalieren, wird es unmöglich, Push- Updates für alle Ihre Produkte durchzuführen.

  • Sie müssen jeden einzelnen Kunden verfolgen , der möglicherweise eine andere Firewall-Konfiguration hat.
  • Sie müssen eingehende Verbindungen über die Firewall des Kunden herstellen, für die eine Portweiterleitung oder ein ähnlicher Mechanismus erforderlich wäre. Dies ist ein Sicherheitsrisiko für Ihre Kunden

Lassen Sie Ihre Produkte stattdessen regelmäßig ihre Aktualisierungen abrufen, und fügen Sie dann dem Server zusätzliche Kapazität hinzu, wenn Sie wachsen.

Wie?

Dieses Problem wurde bereits gelöst, wie Sie vorgeschlagen haben. Hier sind einige Ansätze, die ich mir vorstellen kann.

  • using apt : Verwenden Sie das integrierte apt-System mit einer benutzerdefinierten PPA- und Quellenliste. Wie richte ich eine PPA ein?
    • Con: Wenn Sie keinen öffentlichen Hosting-Dienst wie das Launchpad verwenden, ist das Einrichten eines eigenen apt PPA + -Verpackungssystems nichts für schwache Nerven.
  • using ssh : Generieren Sie einen öffentlichen SSH-Schlüssel für jedes Produkt, und fügen Sie den Schlüssel dieses Geräts Ihren Update-Servern hinzu. Dann brauchen Sie nur Ihre Software rsync/ scpdie benötigten Dateien.
    • Con: Sie müssen alle öffentlichen Schlüssel für jedes Produkt, das Sie versenden, nachverfolgen (und sichern!).
    • Pro : Sicherer als ein unformatierter Download, da nur Geräte mit installiertem öffentlichen Schlüssel auf die Updates zugreifen können.
  • Raw-Download + Signaturprüfung :

    • Veröffentlichen Sie eine signierte Update-Datei (Amazon S3, FTP-Server usw.)
    • Ihr Produkt überprüft regelmäßig, ob die Aktualisierungsdatei geändert werden soll, und lädt die Signatur herunter bzw. überprüft sie.
    • Con : Abhängig davon, wie Sie dies bereitstellen, sind die Dateien möglicherweise öffentlich zugänglich (was das Reverse Engineering und das Hacken Ihres Produkts erleichtert).
  • ansible : Ansible ist ein großartiges Tool zum Verwalten von Systemkonfigurationen. Es ist im Bereich der Puppen / Köche, aber ohne Agenten (verwendet Python) und so konzipiert, dass es idempotent ist. Wenn die Bereitstellung Ihrer Software ein kompliziertes Bash-Skript erfordern würde, würde ich ein Tool wie dieses verwenden, um die Durchführung Ihrer Updates zu vereinfachen.

Natürlich gibt es andere Möglichkeiten, dies zu tun. Aber es bringt mich zu einem wichtigen Punkt.

Unterschreiben / validieren Sie Ihre Updates!

Unabhängig davon, was Sie tun, müssen Sie unbedingt über einen Mechanismus verfügen, der sicherstellt, dass Ihr Update nicht manipuliert wurde. Ein böswilliger Benutzer könnte sich in einer der oben genannten Konfigurationen als Updateserver ausgeben. Wenn Sie Ihr Update nicht validieren, ist Ihre Box viel einfacher zu hacken und in sie einzusteigen.

Eine gute Möglichkeit, dies zu tun, besteht darin, Ihre Aktualisierungsdateien zu signieren. Sie müssen ein Zertifikat führen (oder jemand dafür bezahlen), aber Sie können Ihren Fingerabdruck auf jedem Ihrer Geräte installieren, bevor Sie sie ausliefern, damit diese manipulierte Updates ablehnen können.

Physische Sicherheit

Wenn jemand physischen Zugriff auf die Bereitstellung des Kunden hat, kann er natürlich problemlos den Server übernehmen. Aber zumindest können sie die anderen Bereitstellungen nicht angreifen! Die physische Sicherheit liegt wahrscheinlich in der Verantwortung Ihres Kunden.

Stellen Sie sich für einen Moment vor, was passieren würde, wenn Sie ein großes OpenVPN-Netzwerk für Updates verwenden würden. Sie könnten dann den kompromittierten Server verwenden, um jede Instanz des VPN anzugreifen

Sicherheit

Was auch immer Sie tun, Sicherheit muss von Anfang an eingebaut werden . Schneiden Sie hier keine Ecken - Sie werden es am Ende bereuen, wenn Sie dies tun.

Das vollständige Sichern dieses Update-Systems fällt nicht in den Geltungsbereich dieses Beitrags. Ich empfehle dringend, einen Berater zu engagieren, wenn Sie oder jemand in Ihrem Team keine Kenntnisse in diesem Bereich haben. Es ist jeden Cent wert.

BobTuckerman
quelle
2
Ich würde die Verwendung von Ansible unterstützen - es liegt in der Mitte der Komplexität zwischen Shell-Skripten und umfassendem Konfigurationsmanagement im Puppet / Chef-Stil und hat die Raffinesse, komplexere Dinge zu tun, als nur die Software zu aktualisieren (wie in der Frage " verwalten").
RichVel
Wenn Sie Ansible verwenden, können Sie es so schreiben, dass es auf 'localhost' ausgeführt wird, und es erfordert keinen SSH-Zugriff auf einen der verwalteten Computer. Konfigurieren Sie es als Cronjob, und Sie sind goldrichtig.
BobTuckerman
1
Übrigens: Wenn Sie Ihren eigenen Paketserver ausführen möchten fpmund aptlyzwei großartige Tools sind, die das Erstellen und Hosten Ihrer eigenen Pakete erheblich vereinfachen. Ich habe diesen Prozess erst kürzlich durchlaufen und es war ziemlich schön.
BobTuckerman
10

Müssen Sie tatsächlich darauf zugreifen?

Oder aktualisieren Sie sie einfach? Weil Sie sie selbst aktualisieren lassen können, ähnlich wie treffende Updates von sich aus unbeaufsichtigt.

Wenn Sie sich anmelden müssen

Warum lauscht kein OpenSSH-Dämon über die Portweiterleitung? Jeder Kunde kann einen eigenen Sicherheitsschlüssel haben und wird nur bei Bedarf verbunden.

Bis zu Ihren Kunden

Sie müssen berücksichtigen, was der Kunde auch zu akzeptieren bereit ist. Sie sind möglicherweise nicht mit dem Fernzugriff auf ihr Netzwerk oder nur mit bestimmten Technologien / Konfigurationen vertraut.

Ryan Babchishin
quelle
4
Dies. Mit 1000 unterschiedlichen Kundenanforderungen möchten zumindest einige keine permanente OpenVPN-Verbindung zu Ihren Büros. Im Idealfall würde versuchen Sie , um sie selbst zu machen aktualisieren , wenn / wie / wann sie (aus einer Datei in einer AWS S3 Eimer eine neue Version verfügbar ist erkennen, sagen , das ist , was wir tun..
Sirex
@Sirex - Ein Nachteil der Verwendung eines S3-Buckets ist, dass es keine einfache IP-Whitelist gibt, mit der der Kunde diesen Server sperren kann, sodass er nur den Bucket erreichen kann, der das Update enthält. Wir mussten schließlich einen Aktualisierungsserver mit einer statischen öffentlichen IP-Adresse einrichten, damit Kunden mithilfe von IP-Filtern steuern konnten, mit was dieser Server kommunizieren kann. (AWS veröffentlicht alle ihre IP-Blöcke, daher ist es theoretisch möglich, einen Filter einzurichten, der den Zugriff auf nur AWS-Ressourcen ermöglicht, der jedoch für diesen Anwendungsfall zu umfangreich ist.)
Johnny,
Wir haben keine Updates für S3, aber wir haben eine Textdatei, in der die neueste Version angegeben ist. Diese wird von der App verwendet, um die Bannermeldungen "Update verfügbar" bereitzustellen. Kunden können dann (in unserem Fall manuell) den Download der neuesten Version auslösen, in unserem Fall von einem Dienst namens fetchapp.
Sirex
9

Ich schlage ein Orchestrierungswerkzeug wie Marionette oder Salz vor .

Salt ist eine Nachrichtenwarteschlange und kann eine dauerhafte ausgehende Verbindung von Ihrer Appliance zu einem Masterserver herstellen. Sie können dies verwenden, um beliebige Befehle auf den Appliances auszuführen ... wie z apt-get.

Die andere Option ist Puppet, wo Sie noch einen Master-Server haben und die Clients ausgehende Verbindungen von ihren Standorten aus herstellen.

Ich verwende beide Tools für einen ähnlichen Zweck, bei dem ich möglicherweise keine administrative Kontrolle über die Firewall habe.

ewwhite
quelle