PowerShell-Logging steigert die Unternehmenssicherheit

PowerShell-Skripting gilt als Risiko für die Unternehmenssicherheit, doch mit aktiviertem PowerShell-Logging können alle maliziösen Skript-Aktivitäten aufgedeckt werden.

PowerShell hat einen ausgeprägt schlechten Ruf, weil viele Malware-Autoren das Werkzeug nutzen. Wegen seiner tiefen Integration mit Windows und dem weitreichenden Zugriff auf das Betriebssystem öffnet die PowerShell Angreifern einige Wege, lokale und Maschinen im Hintergrund zu infiltrieren und zu manipulieren.

Einige Sicherheitsexperten haben deshalb verlangt, PowerShell entweder aus Windows zu entfernen oder aber seine Fähigkeiten abzuspecken. Allerdings ist das unrealistisch. PowerShell ist für viele Systemadministratoren unverzichtbar und seine Funktionen abzuschalten, würde das Management von Windows-Umgebungen sehr erschweren.

Stattdessen sollten Administratoren das PowerShell-Logging aktivieren. Damit können Unternehmen jede verdächtige Skripting-Aktivität in ihrer gesamten Organisation abfangen und alle sicherheitsrelevanten Ereignisse registrieren, die ihren Ursprung in der PowerShell haben.

Arten des PowerShell-Logging

Es gibt drei Arten des PowerShell-Logging: Modul, Skriptblock und Transkription. Die ersten beiden lassen sich als Events im Event-Log von Windows PowerShell konfigurieren. Transkriptionslogs wandern in eine Textdatei.

Modul-Logging registriert für die gewählten Module Befehls- und Skriptausführungen in ihrer Reihenfolge in PowerShell. Die Module selbst loggen in ihrer Standardkonfiguration in PowerShell die Ausführung von Befehlen nicht, wie das folgende Listing zeigt:

Get-Module -ListAvailable | Select-Object Name,LogPipelineExecutionDetails

Name         LogPipelineExecutionDetails

----         ---------------------------

Microsoft.PowerShell.     False
Operation.Validation       

PackageManagement         False

Pester                    False

PowerShellGet             False

PSReadline                False

AppBackgroundTask         False

Um das Modul SmbShare zu loggen, ruft man die folgenden Befehle auf:

Import-Module SmbShare

(Get-Module SmbShare).LogPipelineExecutionDetails = $true

Um zu zeigen, was sich in diesen Logs befindet, ruft man

Get-SmbConnection

von der PowerShell-Konsole aus auf und prüft dann die Event-Logs auf der lokalen Maschine.

Bild 1 zeigt die Eigenschaften des Events mit der ID 4103, das durch diesen Befehl initiiert wurde. Die Details zu dem Event umfassen die Parameter, mit denen der Befehl verwendet wurden, beispielsweise ThrottleLimit und AsJob, den Hostnamen, die PowerShell-Version, die Runspace-ID und den Nutzer, der den Befehl ausführte.

Abbildung 1: Event 4103 zeigt die Parameter des PowerShell-Modules.

Scriptblock-Logging konfigurieren

Microsofts Dokumentation bezeichnet als ScriptBlock eine „Sammlung von Statements oder Ausdrücken, die als eine Einheit betrachtet werden können. Ein ScriptBlock kann Argumente enthalten und Werte zurückgeben.“ Eine einfache Methode um zu zeigen, wie ein Scriptblock funktioniert, besteht darin, den Invoke-Befehl mit den ScriptBlock-Parameter aufzurufen:

Invoke-Command -ScriptBlock {Get-Process explorer}

Das Mitschreiben von ScriptBlocks ist einer der besonders nützlichen Funktionen des PowerShell-Logging. Denn es schreibt manipulierten Code in das Event-Log. Das hilft bei der Erkennung von Angriffen, da sich PowerShell-Malware meist in verändertem Code vor den IT-Teams versteckt.

Abbildung 2: Der Invoke-Befehl die ScriptBlock-Parameter für erweitertes PowerShell-Skripting.

ScriptBlock-Logging erscheint im Event-Log als Event mit der ID 4104. Sogar wenn das ScriptBlock-Logging nicht aktiviert ist, erzeugt Windows immer noch Events, die PowerShell als potentiell bösartig markiert.

Bild 3 zeigt das Ergebnis eines Scrpitblock-Logs, das mit dem folgenden PowerShell-Befehl erzeugt wurde:

Invoke-Command -ScriptBlock {$a = "Variable";"This is a test $a"}

Abbildung 3: Windows Event Log, dass ScripBlock Logging nachverfolgt.

Wie man Transkriptons-Logging verwendet

PowerShell-Transkriptions-Logging schreibt alle PowerShell-Befehle und die Ausgaben der Konsole in eine Textdatei, wo sie analysiert werden. Anwender starten und beenden das Transkriptions-Logging manuell mit den Befehlen Start-Transcript und Stop-Transcript in PowerShell oder durch eine Umkonfiguration der Gruppenregeln beziehungsweise der Registry.

Eine typische Transkriptionsdatei sieht so aus:

**********************

Windows PowerShell transcript start

Start time: 20180704143442

Username: VAGRANT-10\vagrant

RunAs User: VAGRANT-10\vagrant

Configuration Name:

Machine: VAGRANT-10 (Microsoft Windows NT 10.0.16299.0)

Host Application: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe

Process ID: 6028

PSVersion: 5.1.16299.492

PSEdition: Desktop

PSCompatibleVersions: 1.0, 2.0, 3.0, 4.0, 5.0, 5.1.16299.492

BuildVersion: 10.0.16299.492

CLRVersion: 4.0.30319.42000

WSManStackVersion: 3.0

PSRemotingProtocolVersion: 2.3

SerializationVersion: 1.1.0.1

**********************

**********************

Command start time: 20180704143459

**********************

PS C:\Windows\system32> Get-SmbConnection

**********************

PS C:\> exit

**********************

Windows PowerShell transcript end

End time: 20180704151126

**********************

Das Transkript zeigt, wie der Anwender die PowerShell-Sitzung ablaufen lässt und liefert andere nützliche Informationen wie die Prozess-ID, die PowerShell-Version, die ausgeführten Befehle und die Zeitmarken.

PowerShell-Logging mit Gruppenregeln zentralisieren

Gruppenregeln vereinfachen die Konfiguration von PowerShell-Logging auf mehreren Maschinen. Man findet diese Regeln unter der folgenden Adresse im Editor für Gruppenregeln: Computer Configuration > Administrative Templates > Windows Components > Windows PowerShell.

Hier findet man fünf Settings: Module-Logging einschalten, PowerShell Script Logging einschalten, Skript-Ausführung einschalten, PowerShell-Transkription einschalten und Standard-Quellpfad für Update-Help definieren.

Mit dem Editor für Gruppenregeln lässt sich PowerShell-Logging gleichzeitig für mehrere Maschinen starten.

Aktiviert werden können so alle Log-Typen von PowerShell sowie zwei weitere: Script-Ausführung und Standard-Quellverzeichnis für Update-Help.

Abbildung 4: Administratoren können die Group Policies ändern und so das PowerShell-Logging auf mehre-ren Maschinen ausführen.

Das Setting Turn on PowerShell-Transkription ist interessant für Administratoren, die ihre Transkriptions-Logs an einer zentralen Stelle speichern möchten. Diese Konfiguration schreibt alle Logs lokal, von wo man sie in einen Ordner innerhalb der PowerShell kopieren kann.

Hat man zum Beispiel einmal das PowerShell-Skript so aufgesetzt, dass es auf jeder lokalen Maschine läuft, erzeugt es den Ordner C:\Windows\PSLogging und erlaubt der lokalen Nutzergruppe, auf diesen Bereich zu schreiben. Außerdem erzeugt es die Nutzergruppe Security Admins, die vollen Zugriff auf das Management der Logfiles hat.

$registryPath = "HKLM:\SOFTWARE\Wow6432Node\Policies\Microsoft\Windows\PowerShell\Transcription"

$Name = "EnableTranscripting"

$value = "1"

New-ItemProperty -Path $registryPath -Name $name -Value $value -PropertyType DWORD -Force

$Name = "EnableInvocationHeader"

$value = "1"

New-ItemProperty -Path $registryPath -Name $name -Value $value -PropertyType DWORD -Force

#Create directory and set permissions to write only for users

$Name = "OutputDirectory"

$value = "C:\Windows\PSLogging"

New-Item $value -type directory

$acl = Get-Acl $value

$acl.SetAccessRuleProtection($True, $False)

$rule = New-Object System.Security.AccessControl.FileSystemAccessRule("Users","Write,ReadAndExecute,AppendData", "ContainerInherit, ObjectInherit", "None", "Allow")

$rule2 = New-Object System.Security.AccessControl.FileSystemAccessRule("DOMAIN\Security Admins","FullControl", "ContainerInherit, ObjectInherit", "None", "Allow")

$acl.AddAccessRule($rule)

$acl.AddAccessRule($rule2)

Set-Acl $value $acl

New-ItemProperty -Path $registryPath -Name $name -Value $value -PropertyType String -Force

Mit PowerShell lassen sich die Inhalte des Transkript-Log-Ordners jeder Maschine, die im Active Directory auftaucht, in einen zentralen Ordner kopieren. Das kann man als regelmäßig auszuführende Aufgabe konfigurieren, die jeden Morgen ausgeführt wird. Dazu dient das folgende Skript:

$YesterdaysLog = Get-Date -Date (Get-Date).AddDays(-1) -UFormat %Y%m%d

New-Item C:\AllLogs\$YesterdaysLog -ItemType Directory

$Computers = Get-ADComputer -Filter * | Select-Object -ExpandProperty Name

foreach ($Computer in $Computers) {

Copy-Item "\\$Computer\C$\Windows\PSLogging\$YesterdaysLog\*" -Destination "C:\AllLogs\$YesterdaysLog\"

}

Die Vorteile von PowerShell-Logging

PowerShell-Logging lässt sich einfach konfigurieren und ist eine bewährte Methode zum Schutz des Unternehmens. Man braucht nur einige Gruppenregeln zu verändern, und schon werden die Aktivitäten der PowerShell auf allen Maschinen mitgeschrieben.

Wenn dann eine Malware-Infektion über die PowerShell die Organisation trifft, zeigen die Logdateien festzustellen, woher der Angriff kam und helfen weitere Angriffe zu minimieren. Als zusätzliche Schutzmaßnahme sollten Admins über Sicherheits-Tools wie ELK Stack nachdenken, die ebenfalls dabei unterstützen, bösartige Aktivitäten zu erkennen. 

Folgen Sie SearchDataCenter.de auch auf Twitter, Google+, Xing und Facebook!

Nächste Schritte

E-Guide: Tipps und Anleitungen für PowerShell 6

Mit PowerShell Dateiserver steuern

Hyper-V-Snapshots mit PowerShell verwalten

Erfahren Sie mehr über Serverbetriebssysteme