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.