Logging aktivieren
Da Powershell auch von böswilligen Angreifern genutzt werden kann, hat Microsoft drei Logging-Mechanismen implementiert, die es ermöglichen, alle Aktivitäten in Powershell zu protokollieren.
Unter PowerShell 3.0 hat Microsoft das Modul-Logging eingeführt. Es heißt so, weil es pro PowerShell-Modul aktiviert werden muss, es ist also keine PowerShell-weite Einstellung. Sobald das Logging aktiviert ist, protokolliert der Computer alle (!) Aktivitäten in der Ereignisanzeige in zwei unterschiedlichen Protokollen. Die Logs, die zur Protokollierung verwendet werden, sind das "Windows PowerShell"-Eventlog unter Anwendungs- und Dienstprotokolle sowie das "Operational Log" unter Windows Anwendungsprotokolle > Windows > PowerShell.

Abbildung 26 - Modulprotokollierung aktivieren
Um das Modul-Logging zu starten, verwenden Sie die Richtlinieneinstellung Modulprotokollierung aktivieren in der Computerkonfiguration unter Richtlinien > Administrative Vorlagen > Windows Komponenten > Windows PowerShell. Sie müssen die Gruppenrichtlinie auf Aktiviert setzen und dann unter der Schaltfläche Anzeigen die Module angeben, die überwacht werden sollen. Prinzipiell können Sie hier Gruppen von Modulen angeben. Wenn Sie beispielsweise nur die Core-Module überwachen wollen, die die Basisfunktionalität der PowerShell zur Verfügung stellen, können Sie Microsoft.PowerShell.* eintragen. Sie können in der Liste auch mehrere Module hinterlegen. Um alle Module zu überwachen, tragen Sie wie in der Abbildung einfach einen * ein. Das Ganze hat allerdings einen Haken, denn das Modul-Logging protokolliert nun in der Tat jedes einzelne ausgeführte Kommando. In Abbildung 27 sehen Sie einen kurzen Ausschnitt aus dem "Operational Log" ‒ es wurde die Ausführung des Befehls Get-NetAdapter protokolliert. Es ist nur beispielhaft ein Event geöffnet, da alle Events mit der Ereignis-ID 4103, die zur gleichen Zeit generiert wurden, zur selben Befehlsausführung gehören.

Abbildung 27 - Modul-Logging generiert sehr viele Informationen
Zusätzlich generiert das Modul-Logging noch jede Menge weitere Events mit der Ereignis-ID 800 und der Kategorie "Details zur Pipelineausführung" in der Windows PowerShell-Ereignisanzeige. Das ist auch der Hauptnachteil des Modul-Loggings ‒ es werden schlicht zu viele Events generiert.
Um diesem Problem zu begegnen, hat Microsoft in PowerShell 4.0 mit dem Hotfix KB3000850 die Skriptblock-Protokollierung eingeführt. Skriptblock-Protokollierung arbeitet ähnlich wie das Modul-Logging, führt allerdings eine wesentlich komprimiertere Protokollierung durch. Es wird nicht der Aufruf jedes einzelnen Kommandos im Ereignisprotokoll aufgezeichnet, sondern immer komplette Skriptblöcke.
Wird die maximal zulässige Anzahl an Zeichen für ein Ereignis überschritten, wird der Skriptblock auf mehrere Events verteilt. So kann man genau nachvollziehen, welcher Code ausgeführt wurde, ohne 10000 Eventlog-Einträge lesen zu müssen.
Die Skriptblock-Protokollierung schreibt den tatsächlich ausgeführten Code ins Ereignisprotokoll, nicht den aufgerufenen. Dadurch können auch kodierte Skripte eindeutig nachvollzogen werden. Das Ausführen von Schadcode wird dadurch nicht verhindert, aber der Administrator kann zumindest nachvollziehen, was auf dem System passiert ist.
Das Protokollieren von Skriptblöcken ist in rudimentärer Form standardmäßig aktiviert. Um die komplette Protokollierung einzuschalten, aktivieren Sie die Richtlinieneinstellung Protokollierung von
PowerShell-Skriptblöcken protokollieren in der Computerverwaltung unter Richtlinien > Administrative Vorlagen > Windows Komponenten> Windows PowerShell. Es ist nicht empfohlen (!), das Auswahlfeld Start-/Stoppereignisse für den Aufruf von Skriptblöcken protokollieren zu setzen. Es führt dazu, dass ein Skriptblock bei jeder Ausführung protokolliert wird. In der Standardeinstellung werden Skriptblöcke nur einmal protokolliert, um die Anzahl an protokollierten Ereignissen möglichst klein zu halten. Die protokollierten Ereignisse finden Sie im PowerShell Operational Log unter der Ereignis-ID 4104‒4106, wobei nur die Ereignisse mit der ID 4104 wirklich interessant sind.
Eine weitere Funktion, die Sie mit PowerShell 5.0 aktivieren können, ist die PowerShell-Aufzeichnung (Transcript). Transkripte gibt es bei PowerShell schon länger. Es handelt sich um von PowerShell automatisch generierte Ausgabeprotokolle, die in einer Textdatei die Ausgabe der PowerShell-Konsole mitschreiben ‒ daher Transkript. Normalerweise muss man ein Transkript durch das Cmdlet Start-Transcript aktivieren. Außerdem muss ein Pfad angegeben werden, in dem das Transkript abgelegt wird. Das funktioniert bis PowerShell 5.0 allerdings nicht in der ISE.
Mit PowerShell 5.0 hat Microsoft die Transkripte deutlich überarbeitet. Zum einen funktioniert Start-Transkript jetzt immer, zum anderen kann man den Befehl über eine Gruppenrichtlinie nun für jede PowerShell-Konsole automatisch aktivieren. Dadurch ist es möglich, jede PowerShell-Sitzung mitzuschneiden. Microsoft spricht hier auch von "Over-The-Shoulder Transcript", weil man dem Ausführenden quasi über die Schulter schaut, während er seine PowerShell-Befehle eingibt.
Transkripte sind deutlich ausführlicher geworden. Unter anderem wird in jedem Transkript protokolliert, welcher Benutzer das Skript gestartet hat und in welchem Benutzerkontext das Skript ausgeführt wurde. Das ist beim ebenfalls in PowerShell 5.0 eingeführten Feature namens JEA (Just enough Administration) wichtig, bei dem ein Benutzer sich per PowerShell Remoting mit einem Computer verbinden kann, aber nicht mit seinem Benutzerkonto angemeldet wird, sondern mit einem Benutzer, der nur einschränkte Rechte hat, ähnlich einem Run As.
Einschalten können Sie das automatische Transkript über die Richtlinieneinstellung PowerShell-Aufzeichnung aktivieren in der Computerverwaltung unter Richtlinien > Administrative Vorlagen > Windows Komponenten > Windows PowerShell. Geben Sie einen Pfad an, in dem die Transkripte abgelegt werden sollen. Sinnvollerweise sollte dieser Pfad ein UNC-Pfad sein, auf dem die Benutzerkonten nur Lesen-Rechte haben. Ansonsten kann ein böswilliger Benutzer die angelegten Aufzeichnungen hinterher einfach löschen. Der angegebene Pfad muss existieren, ansonsten wird keine Aufzeichnung gestartet.
Innerhalb des Pfades erzeugt Windows einen Ordner mit dem Namen "YYYYMMDD" (also JahrMonatTag), und innerhalb dieses Ordners Dateien mit Namen PowerShell_transcript.<Computername>.Zufallszahl. Durch den Computernamen wird sichergestellt, dass keine zwei Computer denselben Dateinamen erzeugen, die Nummer ist zufällig generiert.
PowerShell generiert für jede Konsole und jedes Skript, das Sie starten, eine neue Aufzeichnung.
Eine genaue Beschreibung aller drei Logging-Features sowie die korrekten Berechtigungseinstellungen für den Transkript-Ordner finden Sie beim Microsoft Blue Team unter PowerShell ♥ the Blue Team.

