Tags: PowerShell, Log-Management, Sicherheit
Um dem Missbrauch von PowerShell auf die Schliche zu kommen, kann man sämtliche ausgeführte Kommandos und Scripts mitschneiden. Dafür existieren zwei Mechanismen, einer davon schreibt alle Ein- und Ausgaben in eine Datei. Es empfiehlt sich, die gesammelten Daten an zentraler Stelle zusammenzuführen.
Die Form der Aufzeichnung, bei der PowerShell alle verarbeiteten Eingaben sowie den daraus resultierenden Output in einer Datei speichert, beschreibt Microsoft mit "Over-the-shoulder-Transcription". Was dabei mitgeschnitten wird, entspricht nämlich dem, was ein Beobachter sieht, wenn er dem Benutzer während seiner PowerShell-Session über die Schulter schaut.
Aktivierung über Cmdlet
Diese Variante gibt es bereits seit den Anfängen von PowerShell und ließ sich in der Vergangenheit nur explizit über die Cmdlets Start-Transcript und Stop-Transcript steuern. Um das Mitschneiden der Befehle automatisch zu aktivieren, musste man den Aufruf von Start-Transcript in das Profil von PowerShell aufnehmen.
Das ist nicht nur umständlich, wenn man viele Rechner auf diese Weise konfigurieren muss, sondern dieses Verfahren lässt sich von einem Angreifer auch relativ leicht aushebeln. Nützlich kann der explizite Start und Stopp mittels Cmdlet für die Aufzeichnung aber sein, wenn man sie in eigene Scripts aufnimmt, um beobachten zu können, welche Ausgabe diese produzieren.
Transcripts über GPO aktivieren
Seit PowerShell 5 besteht die Möglichkeit, Transcripts mittels Gruppenrichtlinien einzuschalten. Die entsprechende Einstellung heißt PowerShell-Aufzeichnung aktivieren und findet sich unter Richtlinien => Administrative Vorlagen => Windows-Komponenten => Windows PowerShell.
Aktiviert man sie unter den beiden Zweigen (Computer- und Benutzerkonfiguration), dann setzt sich die Einstellung auf Computer-Ebene durch.
Eigene Log-Datei für jede Session
Standardmäßig legt das Feature für jeden Tag ein Verzeichnis im Profil des Benutzers an und schreibt dort die Einträge für jede Session in eine eigene Textdatei, deren Name aus "PowerShell_transcript" plus dem Hostname des Rechners sowie einer Zufallszahl besteht.
Es liegt natürlich nahe, die Aufzeichnungen zentral auf einem freigegebenen Verzeichnis im Netz abzulegen. Das Cmdlet Start-Transcript bietet den Parameter OutputDirectory, um die Ausgabe vom Default-Verzeichnis auf ein anderes umzulenken. In der GPO-Einstellung für das Aktivieren der Transcripts findet sich für diesen Zweck ein eigenes Eingabefeld.
Log-Verzeichnis schützen
In der Regel wird man vermeiden wollen, dass Benutzer den Inhalt dieser Log-Dateien lesen oder gar verändern. Zum einen können sich darin sensible Informationen wie Passwörter befinden, zum anderen würde es das notwendige Schreibrecht einem Angreifer einfach machen, seine Spuren zu verwischen. Daher muss man verhindern, dass Benutzer sich die Dateien und ihren Inhalt anzeigen lassen.
Zu diesem Zweck empfiehlt Microsoft, die NTFS-Rechte auf dem Fileshare restriktiv zu setzen.
Konkret sollte man so vorgehen:
- Vererbung für das konfigurierte Log-Verzeichnis deaktivieren, alle vorhandenen Berechtigungen entfernen
- Administratoren erhalten vollen Zugriff
- Jeder bekommt das Recht Schreiben
- Ersteller-Besitzer werden alle Rechte entzogen
Eine weitere Option sowohl bei Start-Transcript als auch bei der GPO-Einstellung besteht darin, für jeden Aufruf einen Header mitzuschreiben. Dieser enthält einen Zeitstempel für den jeweiligen Befehl.
Nimmt man diese Möglichkeit in Anspruch, dann erhöht sich das Volumen der aufgezeichneten Daten erheblich. Nachdem der Header in jeder Datei ohnehin detaillierte Angaben zur jeweiligen Session enthält, wird man normalerweise ohne die zusätzliche Zeitangabe für jede Aktion auskommen.
GPO wirkt nicht für PowerShell 6.x und 7
Die administrative Vorlage PowerShellExecutionPolicy.admx schreibt nur die Registry-Werte für Windows PowerShell, so dass EnableTranscripting keine Auswirkung auf PowerShell Core bzw. PowerShell 7 hat.
PowerShell 7 bringt jedoch eine eigene ADMX-Vorlage mit, die man nach %systemroot%\policydefinitions oder in den Central Store kopiert.
Anschließend stehen die gleichen Einstellungen für das Logging zur Verfügung wie unter Windows Powershell, und zwar direkt unter Administrative Vorlagen (für Computer und Benutzer).
Für die Version 6.x muss man dagegen den erforderlichen Schlüssel in der Registrierdatenbank selbst setzen.
Der folgende Inhalt für eine .reg-Datei zeigt die Namen der beiden DWORD sowie den Pfad, in dem man sie erstellen muss.
Will man diese Einstellungen auf einer größeren Zahl von Rechnern setzen, dann empfiehlt sich die Anpassung der Registry mit den Group Policy Preferences.
Die Log-Einträge für PowerShell Core befinden sich direkt unter den Anwendungs- und Dienstprotokollen. Die Ereignis-IDs für die Aufzeichnung sind gleich wie bei Windows PowerShell.
Täglich Know-how für IT-Pros mit unserem Newsletter
Ähnliche Beiträge
- Deep Scriptblock Logging: PowerShell-Kommandos im Eventlog aufzeichnen
- Gartner-Quadrant zu SIEM: 5 Hersteller führend (u.a. Microsoft, Splunk, IBM)
- Azure Sentinel: Microsofts SIEM für On-Premises und Cloud
- Verdächtige Aktivitäten und unsichere Systeme entdecken mit EventSentry
- PowerShell als Hacking-Tool: Missbrauch von Scripts verhindern
Weitere Links
5 Kommentare
Vielen Dank für diesen Artikel. Mir stellt sich nur die Frage, warum "Jeder" auf dem Share Schreibrechte erhält, sollten Leserechte nicht ausreichen und stattdessen "System" Schreibrechte erhalten?
Falls PowerShell die Transcripts nicht unter dem User-, sondern dem Systemkonto schreibt, dann käme beim Zugriff auf das Fileshare über das Netzwerk der Computer-Account zum Einsatz. In diesem Fall würde statt "Jeder" die Gruppe "Domänencomputer" ausreichen.
Vielen Dank! Bei "Jeder" erhält Schreibrechte kräuselt sich mir immer alles, selbst wenn es keine Sicherheitslücke darstellt.
Hallo, vielen dank für die Anleitung, in der GPO steht auch ein Eintrag Skriptausführung aktivieren, wenn ich diesen auf deaktiviert setze, sollte die Gefahr eines Skript Trojaners doch gebannt sein oder ?
Grundsätzlich unterbindet man damit das Ausführen aller Scripts, auch der eigenen. Aber eine hundertprozentige Sicherheit erreicht man dadurch nicht. Siehe dazu meinen Beitrag zur Execution Policy.