ADMIN

2023

06

2023-05-30T12:00:00

Automatisierung

SCHWERPUNKT

074

Automatisierung

Client

Puppet

Windows mit Puppet administrieren

Aus der Ferne

von Jan Kappen

Veröffentlicht in Ausgabe 06/2023 - SCHWERPUNKT

Wer schon einmal von Puppet gehört hat oder wer aktiv damit arbeitet, denkt wahrscheinlich an eine Administration von Linux-Systemen. Das muss aber nicht zwingend so sein, da sich auch Windows-Rechner damit hervorragend verwalten lassen. Dieser Artikel zeigt, wie die Windows-Administration mit Puppet gelingt und welchen Mehrwert diese bietet.

Puppet ist eine Software zur zentralen Administration einer Vielzahl an Computern. Es besteht aus mindestens einem Master-Server, auf dem die Konfiguration der angebundenen Clients gespeichert und vorgehalten wird. Zu diesem Master verbinden sich die Clientrechner über einen Agenten und fragen ihre Konfiguration ab. Damit das klappt, muss auf dem Client der Master-Server hinterlegt sein, weiterhin muss die Kommunikation mit dem Client einmalig bestätigt werden.
Der Client generiert bei der Installation ein Zertifikat und meldet sich mit diesem bei seinem Master-Server an. Dieses Zertifikat wird einmalig signiert, danach ist eine verschlüsselte Kommunikation zwischen dem Agenten und dem Puppet-Master möglich. Standardmäßig fragt der Rechner alle 30 Minuten seine Konfiguration ab und setzt die gewünschten Einstellungen um. Gibt es Änderungen oder Erweiterungen der Konfiguration, sind diese also nach spätestens einer halben Stunde aktiv. Weiterhin werden lokale Anpassungen oder Veränderungen an der Konfiguration auf diesem Weg korrigiert und zurück auf die Einstellungen gesetzt, die auf dem Server hinterlegt sind.
Diese Art der Systemadministration kommt primär bei Linux-Systemen zum Einsatz, hat sich aber auch für Windows-Systemebewährt. Ob sich für Letztere eine Administration via Puppet lohnt, hängt allerdings stark davon ab, um was für Systeme es sich handelt. Das Werkzeug ersetzt zum Beispiel die Administration und Verwaltung per Gruppenrichtlinien nicht, denn dafür sind die Möglichkeiten zu begrenzt und der Aufwand wäre zu groß, um all die Möglichkeiten einer GPO-Administration nachzustellen.
Puppet ist eine Software zur zentralen Administration einer Vielzahl an Computern. Es besteht aus mindestens einem Master-Server, auf dem die Konfiguration der angebundenen Clients gespeichert und vorgehalten wird. Zu diesem Master verbinden sich die Clientrechner über einen Agenten und fragen ihre Konfiguration ab. Damit das klappt, muss auf dem Client der Master-Server hinterlegt sein, weiterhin muss die Kommunikation mit dem Client einmalig bestätigt werden.
Der Client generiert bei der Installation ein Zertifikat und meldet sich mit diesem bei seinem Master-Server an. Dieses Zertifikat wird einmalig signiert, danach ist eine verschlüsselte Kommunikation zwischen dem Agenten und dem Puppet-Master möglich. Standardmäßig fragt der Rechner alle 30 Minuten seine Konfiguration ab und setzt die gewünschten Einstellungen um. Gibt es Änderungen oder Erweiterungen der Konfiguration, sind diese also nach spätestens einer halben Stunde aktiv. Weiterhin werden lokale Anpassungen oder Veränderungen an der Konfiguration auf diesem Weg korrigiert und zurück auf die Einstellungen gesetzt, die auf dem Server hinterlegt sind.
Diese Art der Systemadministration kommt primär bei Linux-Systemen zum Einsatz, hat sich aber auch für Windows-Systemebewährt. Ob sich für Letztere eine Administration via Puppet lohnt, hängt allerdings stark davon ab, um was für Systeme es sich handelt. Das Werkzeug ersetzt zum Beispiel die Administration und Verwaltung per Gruppenrichtlinien nicht, denn dafür sind die Möglichkeiten zu begrenzt und der Aufwand wäre zu groß, um all die Möglichkeiten einer GPO-Administration nachzustellen.
Nutzen lässt sich Puppet beispielsweise für die Verwaltung einer großen Anzahl an Windows-Systemen, die an unterschiedlichen Standorten laufen und nicht an ein anderweitiges zentrales Management angebunden sind. Die meisten Systeme hätten in dem Beispiel nichts miteinander zu tun, würden von unterschiedlichen Personen genutzt und sind in nahezu allen Fällen Mitglieder verschiedener Workgroups.
Einmal mit einem Agenten ausgestattet, ist so jederzeit von zentraler Stelle aus eine Administration möglich. Die zugehörige Kommunikation erfolgt über einen einzigen TCP-Port, weshalb die Anforderungen an Firewalls und andere Sicherheitssysteme überschaubar sind. Da auch bekannt ist, mit welchem Zielsystem die Kommunikation stattfindet, lässt sich diese auf genau dieses System beschränken.
Den passenden Agenten auswählen
Um ein Windows-System mit einem Agenten auszustatten, benötigen Sie ein Installationspaket, das Sie über die Puppet-Hauptseite im Download-Bereich vorfinden [1]. Achten Sie bei der Version darauf, dass der Agent mit dem Server kompatibel ist. Weiterhin haben Sie die Wahl zwischen einer x86- und einer x64-Version des Agenten. Ob Sie die Software auf einem Windows-Client-OS oder einem Server-OS installieren, spielt keine Rolle; beide Varianten sind unterstützt und funktionieren. Da Puppet als MSI-Paket daherkommt, lässt sie sich bei einer größeren Menge an Clients problemlos per Softwareverteilung ausrollen.
Die Installation des Agenten starten Sie einfach mit einem Doppelklick. Hier fragt das Setup dann unter anderem den Installationspfad und den Namen des Master-Servers ab. Sie haben im Installer jedoch keine Möglichkeit, den Namen anzugeben, unter dem sich ein Client am Master meldet. Standardmäßig kommt hier der Hostname des Servers zum Einsatz, der unter Umständen nicht eindeutig ist und dann zu Verwirrung oder im schlimmsten Fall zu einer fehlerhaften Administration führt. Um den Master-Server und den Zertifikatnamen des Clients direkt bei der Installation richtig anzugeben, empfiehlt sich die Installation mittels Kommandozeile. Laden Sie den Agenten herunter, speichern Sie den Installer in einem Verzeichnis Ihrer Wahl und führen Sie die Installation über den folgenden Befehl aus:
msiexec /qn /norestart /i C:\install\puppet-agent-x64-latest.msi PUPPET_MASTER_SERVER=puppet.domain.de PUPPET_CA_SERVER=puppet.domain.de PUPPET_AGENT_CERTNAME=host7.domain.de
Die Variablen "PUPPET_MASTER_SERVER" und "PUPPET_CA_SERVER" setzen den FQDN des Servers, zu dem der Agent nach der Installation eine Verbindung aufnimmt. In den meisten Fällen ist dies das gleiche System. "PUPPET_AGENT_CERTNAME" bestimmt den Namen, mit dem der Agent sein lokales Zertifikat erzeugt und unter dem er auf dem Master-Server sichtbar ist. Der Name im Zertifikat muss nicht zwingend vorhanden oder im DNS auflösbar sein, er kann aber in einer großen Umgebung hilfreich sein, um die Systeme voneinander zu unterscheiden. Sie können so etwa den Standort mit einkodieren (etwa "host7.muenchen.it-administrator.de") oder den Kundennamen, ganz nach Bedarf. Soll die Installation nicht auf dem Standardpfad "C:\Program Files\Puppet Labs\Puppet" stattfinden, geben Sie den alternativen Pfad mittels "INSTALLDIR" an.
Nach kurzer Zeit ist die Installation abgeschlossen und Sie sehen in der Diensteverwaltung einen weiteren Service. Bei diesem verhält es sich wie unter Linux auch: Starten Sie den Dienst neu, baut er nach dem Start direkt eine Verbindung zum Master-Server auf und fragt seine aktuelle Konfiguration ab. Dadurch lässt sich eine sofortige Anwendung von Änderungen erzwingen, wenn Sie nicht auf die nächste planmäßige Ausführung warten möchten. Nun muss der neue Agent auf dem Master-Server einmalig signiert werden, danach können Sie mit der Administration der Systeme beginnen.
Eine Fülle an Möglichkeiten
Sind Agent und Master einmal verbunden, stehen Ihnen vielfältige Möglichkeiten zur Administration bereit. Die Fähigkeiten Ihrer Konstellation hängen dabei von den vorhandenen Administrationsmodulen ab. Diese stehen auf der Puppet-Webseite zum Download bereit [2] und lassen sich einbinden, um die Funktionen und Möglichkeiten zu erweitern. Zum Zeitpunkt der Erstellung dieses Artikels existierten 1074 Module mit Unterstützung für Windows. Deren Installation muss einmalig auf dem Puppet-Master stattfinden, wozu Ihnen unterschiedliche Möglichkeiten zur Verfügung stehen – in der Beschreibung der jeweiligen Module ist eine Installationsanleitung enthalten.
Es gibt beispielsweise ein Modul, das einen simplen Neustart des Servers durchführt. Das kann nach komplexen Installationen hilfreich sein, bei definierten Bedingungen oder um Systeme zeitgesteuert in einem gewissen Intervall rebooten zu lassen. Ein anderes, häufig genutztes Modul ermöglicht eine Bearbeitung der Registry. Damit lassen sich Einträge setzen, ändern oder löschen. In den Beschreibungen der jeweiligen Module sind einige hilfreiche Beispiele aufgeführt, die den Einstieg und die Nutzung erleichtern.
Ein ebenfalls populäres Modul dient der Nutzung der Windows PowerShell. Durch die Installation wird "exec" – eine Standardressource, die Skripte und Befehle ausführt – erweitert und ist danach in der Lage, PowerShell- und pwsh-Befehle sowie -Skripte durchlaufen zu lassen. Sie können zwar auch ohne dieses Modul PowerShell-Skripte starten, allerdings gestaltet die Nutzung von "exec" die Handhabung einfacher und flexibler, da sich Abhängigkeiten und Bedingungen an die Ausführung knüpfen lassen.
Möchten Sie beispielsweise den lokalen Administrator-Account umbenennen, wäre dies mit den folgenden Zeilen möglich:
exec { 'rename-local-admin':
 
command => '(Get-WMIObject Win32_UserAccount -Filter "Name=\'administrator\'").Rename ("Morpheus")',
 
unless => 'if (Get-WmiObject Win32_UserAccount -Filter "Name=\'administrator\'") { exit 1 }',
 
provider => powershell,
}
Die Ausführung des Befehls findet nur dann statt, wenn ein lokales Konto namens "Administrator" vorhanden ist. Da dies nach der ersten erfolgreichen Ausführung nicht mehr der Fall ist, findet keine weitere Anpassung statt. Würde jemand den lokalen Account zurück auf "Administrator" benennen, wird dies bei der nächsten Ausführung des Agenten erkannt und der Account bekommt wieder den gewünschten Namen. Da wir hier mit nativen PowerShell-Befehlen arbeiten, sind wir nicht an die Möglichkeiten von Puppet gebunden. Der Befehl kann zum Beispiel so angepasst werden, dass nicht nach einem Account mit dem Namen "Administrator" gesucht wird, sondern nach einer definierten SID oder nach anderen Eigenschaften.
Wird der PowerShell-Code zu lang für den command-Teil, lässt er sich auch in eine Datei auslagern und dann ausführen. Die Datei kann entweder im "files"-Ordner des Moduls (zum Beispiel "scripts/files/rename-administrator.ps1") liegen oder alternativ auf dem Zielsystem selbst. Dadurch lassen sich selbst komplexe Skripte ausführen:
exec { 'rename-local-admin':
 
command => file('scripts/rename-administrator.ps1'),
 
unless => file('scripts/check-administrator.ps1'),
 
provider => powershell,
}
Bild 2: Die Windows-Ereignisanzeige ist eine sehr gute Anlaufstelle für Meldungen und Informationen. Hier lassen sich mögliche Fehler sehr gut einsehen und dann im Backend beheben.
Lücken schließen
Microsoft veröffentlicht mindestens einmal im Monat Updates für seine Betriebssysteme, die auch in den meisten Fällen zeitnah eingespielt werden sollten. Um diese Aufgabe zu erledigen, stehen unzählige Möglichkeiten und Softwareprodukte zur Verfügung. Puppet kann diesen Job ebenfalls übernehmen. Sie binden dies entweder direkt in Ihre Serverkonfiguration ein oder hinterlegen den Task als eigenes Modul auf dem Puppet-Master, um ihn mehrfach zu verwenden.
Um die Update-Installation per PowerShell durchzuführen, empfiehlt sich das PowerShell-Modul "PSWindowsUpdate" von Michal Gajda, das über die PowerShellGallery bereitsteht [3]. Das Modul erweitert die Bordmittel-Funktionen enorm und lässt sich per Puppet online installieren, sofern eine Internetverbindung besteht und das Aufspielen erlaubt ist. Ist dies nicht der Fall, könnte das Modul auch einmalig manuell heruntergeladen und per Puppet verteilt werden. Hierbei sind allerdings die Bedingungen und Abhängigkeiten händisch zu prüfen. Eine Onlineinstallation ist wie folgt möglich:
# Nuget Provider installieren
      pspackageprovider {'Nuget':
           ensure => 'present'
}
 
# PowerShellGallery als trusted Source hinzufügen
      psrepository { 'PSGallery':
           ensure => present, source_location => 'https://www.powershellgallery.com/api/v2/', installation_policy =>'trusted',
}
 
# PSWindowsUpdate Modul installieren
package { 'PSWindowsUpdate':
           ensure => latest,
            provider => 'windowspowershell',
           source => 'PSGallery',
}
Ist das Modul aufgespielt, sorgt Puppet durch das "latest" dafür, dass jeweils die aktuellste Version installiert ist. Benötigen Sie ein bestimmtes Release oder möchten keine automatischen Updates der Module haben, tragen Sie als Bedingung auch die Versionsnummer mit ein. Um nun eine regelmäßige Aktualisierung der Systeme zu konfigurieren, bei der auch ein Logging stattfindet, hat sich die Ausführung eines PowerShell-Skripts bewährt – entweder direkt per Puppet oder über einen geplanten Task. Letzterer bietet den Vorteil, dass auch dann Updates stattfinden, wenn der Puppet-Agent einmal nicht läuft.
Im ersten Schritt erstellen wir nun ein kleines PowerShell-Skript, das den eigentlichen Updatevorgang durchführt. Dies ist nichts Puppet-spezifisches, sondern nutzt das vorab installierte PowerShell-Modul "PSWindowsUpdate":
# Laden des benötigten Moduls
Load-Module PSWindowsUpdate
 
# Installation der Updates und automatischer Neustart
Install-WindowsUpdate -MicrosoftUpdate -AcceptAll -AutoReboot
Bei dem Skript handelt es sich um die minimale Variante, bei der nur das Modul lädt, Updates von Microsoft online gesucht und installiert und final das System (sofern notwendig) automatisch neu gestartet wird. Sie können das Skript noch deutlich erweitern, indem Sie ein Logging (Start-Transcript) einbauen, vorher nach Updates suchen und diese anzeigen, den automatischen Neustart deaktivieren, Dienste oder VMs beenden, einen eigenen WSUS-Server als Updatequelle angeben und vieles mehr. Das Skript lässt sich anschließend per Puppet verteilen und lokal ablegen:
# Skript-Verzeichnis erzeugen
file { 'C:\scripts':
      ensure => 'directory',
}
 
# Ablage von Updateskripten auf lokaler Festplatte
file { 'C:\scripts\update_monthly_reboot_online.ps1':
      ensure => present,
      source => 'puppet:///modules/jk/pswindowsupdate/update_monthly_reboot_online.ps1';
}
Wir stellen im ersten Schritt sicher, dass das lokale Verzeichnis "C:\scripts" existiert und legen im zweiten Schritt die PS1-Datei dort ab.
Damit das Skript nun zu einem definierten Zeitpunkt oder in einem wiederkehrenden Intervall läuft, nutzen wir einen geplanten Windows-Task mittels Aufgabenplanung. Auch hierfür existiert ein Modul [4], das nach einer einmaligen Installation auf dem Puppet-Master nutzbar ist. Der folgende Codeblock erzeugt einen geplanten Task, der am dritten Dienstag des Monats unser vorab erzeugtes und abgelegtes PowerShell-Skript ausführt:
# Update-Task anlegen
scheduled_task { 'Puppet - Windows Updates Monthly Installation':
     ensure => 'present',
command => "$::system32\\Win­dowsPowerShell\\v1.0\\powershell.exe",
arguments => '-File "C:\\scripts\\update_monthly_reboot_online.ps1"',
enabled => 'true',
trigger => [{
'schedule' => 'monthly',
'start_time' => '23:30',
'day_of_week' => 'true',
'which_occurrence' => 'third'
}],
user => 'system',
}
Alle Parameter und Eigenschaften lassen sich hier nach Bedarf anpassen. Beispiele für die unterschiedlichen Zeiten und Möglichkeiten befinden sich auf der bereits verlinkten Projektseite des Moduls, wo Sie die Parameter abschauen und dann nach eigenem Bedarf setzen können. Ein Tipp: Das Wort "occurrence" ist in den Beispielen auf der Projektseite falsch geschrieben, hier fehlt das zweite "r". Eine Übernahme per Copy-and-Paste sorgt dafür, dass die Verarbeitung durch den Puppet-Agenten fehlschlägt. Generell erkennen Sie über das Windows Eventlog sehr gut, ob der Agent fehlerfrei durchläuft oder ob es Probleme gibt.
Bild 3: Auch unter Windows lässt sich der Puppet-Agent per Kommandozeile verwalten und verwenden.
Rollen und Features verwalten
Neben den bereits dargestellten Möglichkeiten können Sie über Puppet auch für die Installation oder Deinstallation von Rollen und Features auf dem System sorgen. Möchten Sie beispielsweise global ein Feature installieren, das zwingend auf allen Systemen vorhanden sein soll, lässt sich dies einfach erledigen. So entfernen Sie beispielsweise das veraltete SMBv1-Feature zeitnah, um die Sicherheit Ihrer Server zu erhöhen. Alternativ können Sie auch eine Liste an Rollen und Diensten erzeugen, die zwingend immer zu installieren sind.
Sie können über das Modul "windows_firewall" in Ihrer Puppet-Konfiguration die lokale Firewall der Geräte steuern und erweitern. Dies beginnt mit dem Status der Firewall, die im besten Fall eingeschaltet ist, und geht weiter über die Verwaltung von Profilen, Regeln und Ausnahmen. So ist sichergestellt, dass alle Server einen definierten Satz an Regeln und Ausnahmen gesetzt haben. Ändert sich einmal eine IP-Adresse, ein Name oder müssen weitere Einträge ergänzt werden, ist dies ebenfalls einfach und zentral möglich.
Das Docker-Modul, das mittlerweile mehr als 34 Millionen Downloads zählt, nimmt Ihnen wiederkehrende Aufgaben beim Management Ihrer Container ab. Das acl-Modul kann wiederum, wie der Name vermuten lässt, die Access Control Lists auf Windows-Systemen bearbeiten und die gewünschten Dateirechte setzen. "Local_security_policy" ist derweil in der Lage, die lokalen Sicherheitsrichtlinien nach Ihren Wünschen und Einstellungen anzupassen.
Dies ist nur eine kleine Auswahl der Möglichkeiten, die durch eine Administration per Puppet möglich sind. Sollte für Ihren Anwendungszweck kein Modul existieren, können Sie sich jederzeit mit einem PowerShell-Skript oder einer Desired State Configuration (DSC) weiterhelfen. Die Möglichkeiten sind hier eigentlich nur durch Ihre Kreativität beschränkt.
Fazit
Betreiben Sie viele Workgroup-Systeme, die auch ohne Active Directory zentral gemanagt werden sollen, bietet sich Puppet hervorragend an. Die Anzahl an vorgefertigten Modulen für Windows-Systeme ist im Vergleich zu Linux noch eingeschränkt, allerdings springt die Administration per Windows PowerShell hier ein und schließt die Lücke zuverlässig.
(dr)
Link-Codes
[2] Administrationsmodule: https://forge.puppet.com/