Teil 3 der Artikelserie über die Automatisierung mit Ansible.
Vorwort
In Teil 3 der Artikelserie über die Automatisierung mit Ansible anhand des Beispiels “Patch Deployment auf Windows” implementieren wir WinRM über https.
Warum?
Nun, der Ansible-Host ist eine eigenständige, unabhängige Linux-Büchse. Um zu verhindern, dass Ansible sensitive Daten (bsp. Kennwörter) via WinRM unverschlüsselt überträgt, haben wir eine Zertifizierungsstelle und das automatische Beziehen von Zertifikaten umgesetzt und implementieren nun WinRM über https.
Standardmässig hat liefert Windows nur einen unverschlüsselten http-Endpunkt:
Die Endpunkte können mit folgendem Befehl aufgelistet werden:
C:\> winrm enumerate winrm/config/Listener
Wir orientieren uns an der offiziellen Dokumentation.
Das PowerShell-Script
Wir möchten erreichen, dass der https-Endpunkt automatisch erstellt wird, wenn er nicht existiert. Wenn er existiert, soll überprüft werden, ob das Zertifikat korrekt und noch gültig ist. Wenn ja, soll nichts getan werden, wenn nein soll der Endpunkt entfernt und neu erstellt werden.
So können wir sicherstellen dass der Endpunkt beim automatischen Erneuern der Zertifikate erhalten und funktional bleibt.
Da das Script unmöglich darzustellen ist, habe ich es Dir als Textdatei hochgeladen. Speichere es bitte an einer geeigneten Stelle.
Lass es uns kurz Zeile für Zeile besprechen:
- Erstellen einer neuen EventLog-Quelle namens “AnsibleWinrmHttpsScript”.
- Auslesen der Zertifikate in “Cert:\LocalMachine\My”, filtern nach dem Datum (das aktuelle Datum soll zwischen “NotBefore” und “NotAfter” liegen) und dem Hostnamen. Die folgenden Zeilen pro Zertifikat ausführen:
- Auslesen der nach “TRANSPORT=HTTPS” gefilterten Endpunkte in eine Variable.
- Entscheiden anhand des Inhalts der Variable. Wenn die Variable nicht leer ist, dann:
- Entscheiden, ob mehr als ein Endpunkt existiert (was niemals vorkommen darf). Wenn ja:
- Den Daumenabdruck des im Endpunkt konfigurierten Zertifikates auslesen und mit dem Abdruck des aktuellem Zertifikates vergleichen. Wenn gleich, dann:
- Einen Eintrag ins Windows-Protokoll schreiben. Script wird beendet
- Falls Entscheidung auf Zeile 6 nicht gleich:
- Den Endpunkt entfernen.
- Einen neuen Endpunkt mit dem DNS-Hostnamen, dem Daumenabdruck des Zertifikates, dem Protokoll HTTPS und der Adresse * erstellen.
- Einen Eintrag ins Windows-Protokoll schreiben. Script wird beendet.
- (Ende der Entscheidung.)
- Falls Entscheidung auf Zeile 5 “nein” ergibt:
- Einen Eintrag ins Windows-Protokoll schreiben. Script wird beendet.
- (Ende der Entscheidung.)
- Falls Entscheidung auf Zeile 4 “Variable ist leer” ergibt:
- Einen neuen Endpunkt mit dem DNS-Hostnamen, dem Daumenabdruck des Zertifikates, dem Protokoll HTTPS und der Adresse * erstellen.
- Einen Eintrag ins Windows-Protokoll schreiben.
- (Ende der Entscheidung.)
- Die Variable entfernen
- Ende des auf Zeile 2 gestarteten Loops. Falls weitere Zeilen existieren, wird wieder bei Zeile 3 begonnen.
Das Script berücksichtigt keine weiteren Faktoren wie beispielsweise den Verwendungszweck, die Zertifizierungsstelle etc. Solltest Du dies benötigen, musst Du das Script unbedingt erweitern.
Die Verteilung
Für die Verteilung bedienen wir uns wieder den Gruppenrichtlinien. Erstelle bitte eine neue Gruppenrichtlinie, bearbeite sie und deaktiviere die Benutzer-Einstellungen.
In den Eigenschaften der Gruppenrichtlinie kopierst Du bitte den “Unique name”:Nun navigierst Du im Explorer zum Pfad …
\\{{ DOMAIN_NAME }}\SYSVOL\{{ DOMAIN_NAME }}\Policies\{{Unique_name}}
… und erstellst darin einen Ordner namens “Payload”:
In diesen Ordner legst Du nun Dein Script als ps1-Datei ab. Bitte kopiere den Pfad in die Zwischenablage!
In der Gruppenrichtlinie navigierst Du nach Computer Settings\Preferences\Control Panel Settings\Scheduled Tasks und erstellst einen neuen “Immediate Task (At least Windows 7)”:
Gib dem Task einen sinnvollen Namen, setzen den user account auf SYSTEM, und setze die Häckchen bei “Run with highest privileges” und “Hidden”.
Im Tab “Actions” fügst Du eine Action mit folgendem Inhalt ein:
Program/Script:
powershell.exe
Add arguments (optional):
-NoProfile -NonInteractive -NoLogo -ExecutionPolicy ByPass -File \\{{ DOMAIN_NAME }}\SYSVOL\{{ DOMAIN_NAME }}\Policies\{{Unique name}}\Payload\{{ Script_name }}.ps1
Die anderen Einstellungen kannst Du wie voreingestellt belassen.
Die Gruppenrichtlinie verknüpfst Du nun mit allen Organisationseinheiten, welche Server enthalten:
Die Paketfilter-Regel
Damit auf den Endpunkt zugegriffen werden kann ist eine Paketfilter-Regel notwendig. Der Paketfilter von Windows heisst “Windows Firewall”
Ob Du nun eine separate Gruppenrichtlinie für alle Paketfilter-Regeln Deiner Server pflegst oder die Regel jeweils in die Gruppenrichtlinie einfügst, zu welcher sie gehört, ist unerheblich. Beides ist gangbar.
Ich ziehe es vor, separate Gruppenrichtlinien für den Paketfilter zu erstellen, da ich in den meisten Organisationen meistens neben Produkte-spezifischen (Ansible, Zabbix Agent) auch einige vorkonfigurierte Regeln entweder ein- oder ausschalten muss. So habe ich alle Regeln zentral in einer Richtlinie abgelegt…
Erstelle oder öffne bitte die gewünschte Gruppenrichtlinie und navigiere zu “Comptuer Configuration\Policies\Windows Settings\Security Settings\Windows Firewall with Advanced Securtiy\Windows Firewall with Advanced Securtiy – LDAP://[…]\Inbound Rules” und erstelle einen neue Regel:
- Type: Port
- Protocol: TCP
- LocalPort: 5986
- Decision: Allow
- Scope: Domain
- Name: Windows Remote Management (HTTPS-In)
- Description: Inbound rule for Windows Remote Management via WS-Management. [TCP 5986]
Vergiss nicht, die Gruppenrichtlinie, falls sie neu, ist, zu verknüpfen.
In 90 Minuten sollte nun alle Server uber einen https-Endpunkt für WinRM verfügen.
Damit sind wir am Ende des 3. Teil. Weiter geht’s demnächst mit dem Ansible-Host.