Bedrohungspotential minimieren durch automatisierte Härtungsmaßnahmen mit Puppet - Teil 2

Um Angriffsvektoren durch Cyberkriminalität für uns und unsere Kunden zu minimieren, setzen wir beispielsweise auf die Härtung von Systemen. Wie im letzten Beitrag (Teil 1) bereits erwähnt, kann man Puppet als Administrationsprogramm für das Configuration-Management einsetzen. In diesem Beitrag möchten wir einen Einblick geben wie Puppet in diesem Anwendungsfall sehr einfach eingesetzt werden kann.

Wie kann Puppet eingesetzt werden?

Als Puppet Master kann beispielsweise eine virtuelle Maschine (VM) eingesetzt werden, auf der die Open Source Software Foreman installiert ist. Dabei handelt es sich eigentlich um ein Lifecycle Management Tool, das Systeme installiert, konfiguriert und Patches verwalten kann. Für den Einsatzzweck System-Hardening eignet sich das Tool auch bestens als Frontend für Puppet Code Management.

Um die Anbindung an Puppet sicherzustellen, ist es sinnvoll, bei der Bereitstellung von IT-Systemen automatisch den Puppet Agenten mit auszurollen. Beispielsweise lässt sich dies im Image-Prozess der Bereitstellungs-Images berücksichtigen. Beim initialen Start eines neuen Systems muss dann der Agent mit dem zugehörigen Puppet-Master konfiguriert werden.

Um sicherzustellen, dass Konfigurationsanpassungen valide sind und um diese vorab testen zu können, ist es sinnvoll, den Puppet-Code über verschiedene Stages zu verwalten. Um den Code in Entwicklungs-, Test- und Produktions-Stages zu verwalten, kann jeweils ein eigenes Environment pro Stage genutzt werden. Der Anpassungs- und Staging-Prozess sollte dabei in bestehende Change-Prozesse voll integriert sein.

Unabhängig davon können die Puppet-Module und Klassen genutzt werden, um verschiedenen Systemen passende Konfigurationen zuzuweisen. So kann beispielsweise ein Datenbankserver eine andere Konfiguration bekommen als ein Webserver. Die Zuweisung von Modulen bzw. Klassen zu den Systemen (Hosts) findet schließlich im Foreman statt. Dieser dient als ENC (external node classifier), sodass der Agent weiß, welchen Katalog er ausführen soll.

Wie funktioniert das technisch?

Als technisches Setup werden die folgenden Komponenten benötigt:

  • Puppet Master mit r10k
  • ein GitLab Server mit
    • einem Control Repository (git) für dynamische Environments
    • git Repositories für Puppet Module

Alle Puppet Module, also der gesamte Code, muss auf dem Puppet Master zur Verfügung stehen. Dabei ist es unpraktisch, die gesamte Verwaltung des Codes und die Verteilung auf die einzelnen Environments per Hand auf dieser Maschine durchzuführen. Zu diesem Zweck kann auf dem Puppet Master das Tool r10k genutzt werden. Dieses Tool liest git Repositories aus und erstellt automatisch Puppet Environments inklusive der Puppet Module.

Empfehlenswert ist es ein Control Repository zu etablieren, in dem jeder Branch dazu führt, dass ein r10k daraus ein Environment erzeugt. In diesem Szenario liegt zusätzlich in jedem Branch ein so genanntes Puppetfile. Dieses definiert, welche Module in welcher Version in diesem Environment ausgerollt werden sollen.

Das bringt folgende Vorteile:

  • zentrales Code-Management und Nachvollziehbarkeit der Änderungen
  • hohe Reproduzierbarkeit von Environments
  • Schutz der Environments vor ungewollten Änderungen (Merge Requests und Approvals)
  • einfache Wiederverwendung von bereits geschriebenen Modulen

Wie kommt CI/CD ins Spiel?

Empfehlenswert ist es, das GitOps-Prinzip zu etablieren. Dabei wird jede Änderung erst im Code prozessiert, bevor es auf die Systeme ausgerollt wird. Mit jeder Änderung am Control Repository in diesem Szenario wird eine Pipeline gestartet, die den gewünschten Zustand des Environments mittels r10k auf dem Puppet-Master ausrollt. Dabei ist darauf zu achten, dass das jeweils nur für den angepassten Branch passiert und nicht für das gesamte Repository und somit alle Environments.

Im Puppetfile referenziert man auf die anderen Repositories, die die Puppet­-Module enthalten. Dabei setzt man auf ein Version-Pinning, sodass eine Änderung am Puppet-Modul-Repository nicht automatisch bewirkt, dass diese auch direkt auf die Umgebungen ausgerollt wird. Durch diesen Mechanismus kann man das erwähnte Staging gewährleisten.

Zusammenfassung

Zusammenfassend kann man festhalten, dass es mit den genannten Tools möglich ist, eine effektive Systemhärtung umzusetzen. Dabei weist man mittels Foreman den Hosts Environments und Puppet-Klassen zu und steuert mit r10k, welches Environment welche Puppet-Module erhalten soll. Dies sollte GitOps-basiert geschehen mittels eines Control Repositories. Die Puppet Module selbst entwickelt man dabei in eigenen Repositories. Diese werden versioniert und später im Puppetfile referenziert.

Kontaktieren Sie uns gerne, falls Sie genauere Informationen zu unseren Angeboten und Leistungen erhalten möchten. Kontaktinformationen finden Sie unter: https://cloudopserve.de/#kontakt.


Bedrohungspotential minimieren durch automatisierte Härtungsmaßnahmen mit Puppet - Teil 1

Bedrohungen durch Cyberkriminalität können in Unternehmen großen Schaden anrichten. In der Praxis steigt die Anzahl der Schadensereignisse seit vielen Jahren signifikant an. Laut BSI spitzt sich die Sicherheitslage immer weiter zu. Cyberkriminelle nutzen dabei permanent neue Sicherheitslücken in Systemen aus, um beispielsweise Daten auszuspähen, Gelder zu erpressen oder Systeme zu blockieren. Um für ständig wachsende Bedrohungen gerüstet zu sein, setzen wir bei cloudopserve im Rahmen unserer Leistung OS-Management von IT-Systemen eine Reihe von Maßnahmen um.

Eine dieser Maßnahmen ist beispielsweise die automatisierte Härtung von IT-Systemen gegen Angriffe. Mit den Härtungsmaßnahmen werden Angriffsvektoren deutlich reduziert.

Dabei richten wir unser Härtungskonzept u.a. nach dem CIS (Center for Internet Security) Standard aus. Die CIS-Benchmarks sind Konfigurationsempfehlungen für eine Vielzahl an Produktfamilien von Anbietern. Sie repräsentieren die konsensbasierten Bemühungen von Cybersicherheitsexperten weltweit, Systeme zuverlässiger vor Bedrohungen zu schützen.

Konfigurationsmanagement mit Puppet

Um diese Empfehlungen automatisiert und auditfähig umzusetzen, setzen wir Puppet ein. Puppet ist ein Administrationsprogramm, welches sich gut eignet, um automatisiert Konfigurationen bei einer Vielzahl von IT-Systemen gleichzeitig auszurollen.

Beispiel: In einer Umgebung, in der verschiedene Betriebssysteme eingesetzt werden und verschiedene Derivate, müsste man für die Automatisierung von Konfigurationen verschiedene Scripte bereitstellen, die für die verschiedenen Systeme optimiert sind. Da der Puppet-Code unabhängig von Betriebssystem o.ä. ist, besitzt dieser die Flexibilität auf den verschiedenen Systemen ausgeführt zu werden, um denselben Zielzustand zu konfigurieren.

Wie funktioniert Puppet?

Jedes System, das konfiguriert werden soll, wird mit einem Puppet Agenten bestückt. Diese Agenten holen sich in regelmäßigen Abständen vom Puppet Master ihren Katalog, der die Konfigurationen beinhaltet und führt diese auf dem System aus.

Puppet arbeitet dabei idempotent, das heißt, dass der Code kontinuierlich auf den Systemen anwendet wird, um den gewünschten Zustand des Systemen sicherzustellen (desired state configuration). Ist dieser Zustand bereits erreicht, wird Puppet keine Änderung vornehmen. Wird in der Zwischenzeit z.B. der Inhalt einer Datei verändert, die von Puppet verwaltet wird, wird Puppet im nächsten Agenten-Lauf wieder den gewünschten Zustand herstellen und die Datei überschreiben.

In Teil 2 des Beitrags gehen wir näher auf die Funktionsweise und technische Details ein.