Unveränderliche Infrastruktur: Netzwerke
17. April 2015
0 Min. LesezeitAnmerkung der Redaktion
Dieser Blogbeitrag erschien ursprünglich auf fugue.co. Fugue wurde 2022 Teil von Snyk und ist ein wichtiger Bestandteil von Snyk IaC.
Wenn Sie mit Netzwerkinfrastruktur arbeiten, wissen Sie, dass sie dazu neigt, sich von ihrer ursprünglichen Konfiguration zu entfernen und dabei „Macken“ zu entwickeln. Eines unserer Ziele bei der Entwicklung von Fugue als Betriebssystem (OS) für die Cloud und als einzige Quelle der Wahrheit und des Vertrauens für Ihre Infrastruktur ist es, diese Abweichungen zu verhindern, indem wir den bekannten, ordnungsgemäßen Zustand Ihrer Infrastruktur aufrechterhalten. Schließlich gilt: „Ein vertrauenswürdiges System tut nur das, was seine Urheber beabsichtigen.“
Bisher haben wir uns auf die „Macken“ konzentriert, die bei Compute-Instanzen entstehen. Dieses Problem tritt jedoch auch bei anderen Infrastrukturkomponenten wie Netzwerken auf. Konfigurationsabweichungen in Netzwerken entstehen häufig, wenn sie manuell bereitgestellt und gewartet werden. Ich habe Netzwerkkonfigurationen gesehen, die Hunderte von Tabellenzeilen umfassten und von Hand, Zeile für Zeile, bereitgestellt wurden. Wenn die Anwendung nicht ordnungsgemäß funktioniert, besteht die übliche Lösung darin, manuell Ports und IP-Adressbereiche freizugeben.
Das bedeutet oft, dass die neue Konfiguration nicht in der ursprünglichen Tabelle nachgetragen wird. Vorübergehende Korrekturen werden dann dauerhaft, weil sie in Vergessenheit geraten. Wird der Anwendung ein neuer Dienst hinzugefügt, sind weitere manuelle Eingriffe erforderlich. Diese manuellen Eingriffe setzen Anwendungen nicht nur potenziellen Sicherheitsrisiken aus – etwa durch versehentlich freigegebene Regeln für Sicherheitsgruppen –, sondern können auch erhebliche Anwendungsausfälle verursachen, wenn Regeln oder Routen versehentlich gelöscht werden.
Die Herausforderungen bei der Netzwerkkonfiguration wurden teilweise durch DevOps-Tools und -Dienste wie AWS CloudFormation gelöst, die manuelle Implementierungen durch die Automatisierung der Infrastruktur ersetzen. In diesem Umfeld können Netzwerkkonfigurationen in einer kontrollierten domänenspezifischen Sprache (DSL) oder Vorlage festgehalten werden, die wiederholbar, auditierbar und testbar ist.
Viele dieser Tools greifen jedoch zu kurz. Sie stellen Netzwerkkonfigurationen lediglich bereit, setzen den gewünschten Zustand aber nach der ursprünglichen Bereitstellung nicht durch. Das zeigt sich, wenn nach der Bereitstellung mit diesen Tools manuelle Änderungen am Netzwerk vorgenommen werden. Im schlimmsten Fall bleiben die Änderungen bestehen. Im besten Fall werden nur die ursprünglich bereitgestellten Regeln durchgesetzt.
Fugue geht bei der Automatisierung und Steuerung von Netzwerken einen Schritt weiter. Fugue sorgt dafür, dass Netzwerke stets in den Zustand zurückgeführt werden, den sie bei der Bereitstellung hatten. Werden in einer Komposition ursprünglich definierte Regeln gelöscht, stellt Fugue sie wieder her. Gelangen neue, nicht in der Komposition definierte Regeln in Ihr Netzwerk, entfernt Fugue sie.
Sehen wir uns dazu ein kurzes, aber aussagekräftiges Beispiel mit AWS-Sicherheitsgruppen an:
Im obigen Ludwig-Code haben wir die Sicherheitsgruppe web-server-sg definiert. Sie lässt eingehenden Datenverkehr über Port 80 zu, der von web-elb-sg stammt. Wenn dieser Code kompiliert und ausgeführt wird, stellt der Fugue Conductor sicher, dass die in Ihrer Komposition definierten Sicherheitsgruppen und Regeln in Ihrem AWS-Konto bereitgestellt werden.
Doch damit ist die Arbeit des Conductors nicht getan. Wie bei EC2-Instanzen vergleicht der Conductor Ihre laufende Komposition regelmäßig (derzeit alle 10 Sekunden) mit der ursprünglich definierten und kompilierten Version. Stimmt die Netzwerkinfrastruktur nicht mit der Komposition überein, die der Conductor vorfindet, nimmt er die erforderlichen Änderungen an Ihrer Infrastruktur vor, um die Übereinstimmung mit dem Original sicherzustellen.
Stellen wir Fugue auf die Probe und lassen unser Netzwerk ein paar Macken entwickeln. Dazu schlüpfe ich in die Rolle eines wohlmeinenden, aber unerfahrenen Systemadministrators, der sich während des laufenden Betriebs der Webserver einige Serverprotokolle ansehen möchte (wir gehen davon aus, dass er von dem gerade eingeführten Protokollverwaltungssystem nichts wusste).
Ich melde mich bei der AWS-Verwaltungskonsole an und füge eine Sicherheitsgruppenregel hinzu, die SSH-Verbindungen von 0.0.0.0/0 zulässt. Wie im folgenden Video zu sehen ist, wird die Regel innerhalb weniger Sekunden nach dem Hinzufügen entfernt und die Sicherheitsgruppe in ihre ursprüngliche Konfiguration zurückversetzt.

Betrachten wir die Situation nun aus einem anderen Blickwinkel. Nehmen wir an, es ist Freitagnachmittag und unser wohlmeinender Systemadministrator möchte vor dem Wochenende noch die Sicherheitsregeln im AWS-Konto überprüfen. In diesem Fall simulieren wir ein Szenario, in dem er versehentlich die Sicherheitsgruppenregel löscht, die eingehenden Datenverkehr über Port 80 zu den Webservern zulässt. Ohne zu merken, was er getan hat, klappt er seinen Laptop zu und macht sich auf den Weg in die Kneipe.
Unter normalen Umständen könnte dieses Szenario zu einem erheblichen Ausfall der Website führen. Wie wir sehen, wäre die Website in diesem Fall höchstens 10 Sekunden lang nicht erreichbar. Der Conductor führt seine Prüfung durch und erstellt die Sicherheitsgruppenregel rasch neu – genau so, wie sie in der Ludwig-Komposition definiert war.

Das gilt nicht nur für Sicherheitsgruppen und ihre Regeln. Der Conductor gewährleistet auch die Übereinstimmung anderer Netzwerkkonfigurationen, etwa von VPC-Routen, Netzwerk-ACLs, Internet-Gateways und Subnetzen.
Was aber, wenn ich etwas an meiner Komposition ändern möchte?
Änderungen an einer laufenden Komposition sind ganz einfach. Nehmen wir an, Sie möchten der ELB-Sicherheitsgruppe eine Regel hinzufügen, die Datenverkehr aus dem Internet über Port 443 zulässt. Ändern Sie zunächst Ihre Ludwig-Komposition entsprechend.
Wenn Sie mit der Bearbeitung fertig sind, wechseln Sie zur Fugue CLI und führen Sie die folgenden Befehle aus:
Mit Fugues Befehl load wird die geänderte Komposition kompiliert und in S3 hochgeladen. Fugues Befehl update weist den Conductor anschließend an, die aktualisierte Version aus S3 abzurufen und die Änderungen auf die bestehende laufende Komposition anzuwenden.
Warum ist das wichtig?
Sie können jede Woche Stunden damit verbringen, Netzwerkkonfigurationen manuell zu warten und zu ändern – und trotzdem entwickeln sich weiterhin Macken. Das ist keine sinnvolle Nutzung der Arbeitszeit Ihrer Mitarbeitenden. Fugue bietet eine automatisierte und deterministische Möglichkeit, Infrastrukturkomponenten bereitzustellen, zu warten und zu aktualisieren. Teilen Sie dem Conductor mit, was Sie möchten: Er setzt es um und sorgt dafür, dass es so bleibt.
Mit Fugue können Sie die Übereinstimmung Ihrer Netzwerke mit der beabsichtigten Konfiguration sicherstellen und gleichzeitig Bereitstellungszeiten und laufenden Wartungsaufwand reduzieren. Da die Ludwig DSL absichtsbasiert, wiederholbar, durchsetzbar und auditierbar ist, können Sie Ihre Anwendungen mit der Gewissheit betreiben, dass Ihre Netzwerkkonfigurationen kontinuierlich im vorgesehenen Zustand gehalten werden.
Mit unveränderlicher Netzwerkinfrastruktur erfüllen Sie strenge interne und externe Sicherheits- und Compliance-Anforderungen für Ihre Anwendungen mit nur wenigen Zeilen Code.
