Freigeben über


Verwenden eines PowerShell-Skripts zum Durchsuchen des Überwachungsprotokolls

Sicherheit, Compliance und Überwachung haben für IT-Administratoren oberste Priorität. Microsoft 365 umfasst mehrere integrierte Funktionen, die Organisationen in den Bereichen Sicherheit, Compliance und Überwachung unterstützen. Insbesondere die vereinheitlichte Überwachungsprotokollierung kann Ihnen dabei helfen, Sicherheitsvorfälle und Complianceprobleme zu untersuchen. Sie können Überwachungsprotokolle mithilfe der folgenden Methoden abrufen:

Wenn Sie regelmäßig Überwachungsprotokolle abrufen müssen, sollten Sie eine Lösung in Betracht ziehen, die die Office 365-Verwaltungsaktivitäts-API verwendet. Es bietet großen Organisationen die Skalierbarkeit und Leistung, um Millionen von Überwachungsdatensätzen kontinuierlich abzurufen. Die Verwendung des Überwachungsprotokoll-Suchtools im Microsoft Purview-Portal ist eine gute Möglichkeit, Überwachungsdatensätze für bestimmte Vorgänge, die in einem kürzeren Zeitraum auftreten, schnell zu finden. Bei Verwendung längerer Zeiträume im Überwachungsprotokoll-Suchtool werden insbesondere bei großen Organisationen u. U. zu viele Datensätze für eine einfache Verwaltung oder den Export zurückgegeben.

Wenn Sie Überwachungsdaten für eine bestimmte Untersuchung oder einen Vorfall manuell abrufen müssen, insbesondere für längere Datumsbereiche in größeren Organisationen, ist die Verwendung des Cmdlets Search-UnifiedAuditLog möglicherweise die beste Option. Dieser Artikel enthält ein PowerShell-Skript, das das Cmdlet verwendet. Das Skript kann bei jeder Ausführung des Cmdlets 50.000 Überwachungsdatensätze abrufen und dann in eine CSV-Datei exportieren. Sie können die Datei formatieren, indem Sie Power Query in Excel verwenden, um Ihre Überprüfung zu unterstützen. Die Verwendung des Skripts in diesem Artikel minimiert auch das Risiko, dass große Überwachungsprotokollsuchen im Dienst ein Timeout haben.

Vor dem Ausführen des Skripts

  • Die Überwachungsprotokollierung muss aktiviert sein, damit Ihr organization das Skript erfolgreich verwenden kann, um Überwachungsdatensätze zurückzugeben. Die Überwachungsprotokollierung ist für Microsoft 365- und Office 365 Enterprise-Organisationen standardmäßig aktiviert. Um zu überprüfen, ob die Überwachungsprotokollsuche für Ihre organization aktiviert ist, führen Sie den folgenden Befehl in Exchange Online PowerShell aus:

    Get-AdminAuditLogConfig | FL UnifiedAuditLogIngestionEnabled
    

    Der Wert True für die Eigenschaft UnifiedAuditLogIngestionEnabled gibt an, dass die Überwachungsprotokollsuche aktiviert ist.

  • Ihnen muss die Rolle Nur anzeigende Überwachungsprotokolle oder Überwachungsprotokolle in Exchange Online zugewiesen sein, um das Skript erfolgreich ausführen zu können. Standardmäßig werden diese Rollen den Rollengruppen Complianceverwaltung und Organisationsverwaltung auf der Seite Berechtigungen im Exchange Admin Center zugewiesen.

  • Es kann lange dauern, bis das Skript abgeschlossen ist. Wie lange es dauert, hängt vom Datumsbereich und von der Größe des Intervalls ab, für die das Skript Überwachungsdatensätze abrufen soll. Größere Datumsbereiche und kleinere Intervalle führen zu einer langen Laufzeit. Weitere Informationen zum Datumsbereich und zu den Intervallen finden Sie in der Tabelle in Schritt 2.

  • Das in diesem Artikel bereitgestellte Beispielskript wird unter keinem standardmäßigen Supportprogramm oder Dienst von Microsoft unterstützt. Das Beispielskript wird unverändert ohne jegliche Garantie bereitgestellt. Microsoft schließt ferner alle konkludenten Gewährleistungen, einschließlich, aber nicht beschränkt auf konkludente Gewährleistungen der Marktgängigkeit oder Eignung für einen bestimmten Zweck aus. Das gesamte Risiko, das mit der Verwendung oder Leistung des Beispielskripts und der Dokumentation einhergeht, liegt bei Ihnen. In keinem Fall sind Microsoft, seine Autoren oder an der Erstellung, Produktion oder Übermittlung des Skripts beteiligte Personen für Schäden jeglicher Art (einschließlich und ohne Einschränkung Schäden durch Verlust entgangener Gewinne, Geschäftsunterbrechungen, Verlust von Geschäftsinformationen oder andere geldliche Verluste) haftbar, die aus der Nutzung bzw. Unfähigkeit zur Nutzung des Beispielskripts oder der Dokumentation entstehen, auch wenn Microsoft auf die Möglichkeit solcher Schäden hingewiesen wurde.

Schritt 1: Herstellen einer Verbindung mit Exchange Online PowerShell

Stellen Sie zunächst eine Verbindung mit Exchange Online PowerShell her. Sie können eine Verbindung mithilfe der modernen Authentifizierung oder der mehrstufigen Authentifizierung (Multi-Factor Authentication, MFA) herstellen. Schrittweise Anleitungen finden Sie unter Herstellen einer Verbindung mit Exchange Online PowerShell.

Schritt 2: Anpassen und Ausführen des Skripts zum Abrufen von Überwachungsdatensätzen

Nachdem Sie eine Verbindung mit Exchange Online PowerShell hergestellt haben, erstellen, ändern und führen Sie das Skript aus, um die Überwachungsdaten abzurufen. Die ersten sieben Zeilen im Skript für die Überwachungsprotokollsuche enthalten die folgenden Variablen, die Sie zum Konfigurieren der Suche ändern können. Eine Beschreibung dieser Variablen finden Sie in der Tabelle in Schritt 2.

  1. Speichern Sie den nachstehenden Text in einer Windows PowerShell-Skriptdatei mit dem Dateinamensuffix ".ps1". Beispiel: SearchAuditLog.ps1.

    #Modify the values for the following variables to configure the audit log search.
    $logFile = "d:\AuditLogSearch\AuditLogSearchLog.txt"
    $outputFile = "d:\AuditLogSearch\AuditLogRecords.csv"
    [DateTime]$start = [DateTime]::UtcNow.AddDays(-1)
    [DateTime]$end = [DateTime]::UtcNow
    $record = "AzureActiveDirectory"
    $resultSize = 5000
    $intervalMinutes = 60
    
    #Start script
    [DateTime]$currentStart = $start
    [DateTime]$currentEnd = $end
    
    Function Write-LogFile ([String]$Message)
    {
        $final = [DateTime]::Now.ToUniversalTime().ToString("s") + ":" + $Message
        $final | Out-File $logFile -Append
    }
    
    Write-LogFile "BEGIN: Retrieving audit records between $($start) and $($end), RecordType=$record, PageSize=$resultSize."
    Write-Host "Retrieving audit records for the date range between $($start) and $($end), RecordType=$record, ResultsSize=$resultSize"
    
    $totalCount = 0
    while ($true)
    {
        $currentEnd = $currentStart.AddMinutes($intervalMinutes)
        if ($currentEnd -gt $end)
        {
            $currentEnd = $end
        }
    
        if ($currentStart -eq $currentEnd)
        {
            break
        }
    
        $sessionID = [Guid]::NewGuid().ToString() + "_" +  "ExtractLogs" + (Get-Date).ToString("yyyyMMddHHmmssfff")
        Write-LogFile "INFO: Retrieving audit records for activities performed between $($currentStart) and $($currentEnd)"
        Write-Host "Retrieving audit records for activities performed between $($currentStart) and $($currentEnd)"
        $currentCount = 0
    
        $sw = [Diagnostics.StopWatch]::StartNew()
        do
        {
            $results = Search-UnifiedAuditLog -StartDate $currentStart -EndDate $currentEnd -RecordType $record -SessionId $sessionID -SessionCommand ReturnLargeSet -ResultSize $resultSize
    
            if (($results | Measure-Object).Count -ne 0)
            {
                $results | export-csv -Path $outputFile -Append -NoTypeInformation
    
                $currentTotal = $results[0].ResultCount
                $totalCount += $results.Count
                $currentCount += $results.Count
                Write-LogFile "INFO: Retrieved $($currentCount) audit records out of the total $($currentTotal)"
    
                if ($currentTotal -eq $results[$results.Count - 1].ResultIndex)
                {
                    $message = "INFO: Successfully retrieved $($currentTotal) audit records for the current time range. Moving on!"
                    Write-LogFile $message
                    Write-Host "Successfully retrieved $($currentTotal) audit records for the current time range. Moving on to the next interval." -foregroundColor Yellow
                    ""
                    break
                }
            }
        }
        while (($results | Measure-Object).Count -ne 0)
    
        $currentStart = $currentEnd
    }
    
    Write-LogFile "END: Retrieving audit records between $($start) and $($end), RecordType=$record, PageSize=$resultSize, total count: $totalCount."
    Write-Host "Script complete! Finished retrieving audit records for the date range between $($start) and $($end). Total count: $totalCount" -foregroundColor Green
    
  2. Ändern Sie die in der folgenden Tabelle aufgeführten Variablen, um die Suchkriterien zu konfigurieren. Das Skript enthält Beispielwerte für diese Variablen, ändert sie jedoch (sofern nicht anders angegeben), um Ihre spezifischen Anforderungen zu erfüllen.



Variable Beispielwert Beschreibung
$logFile "d:\temp\AuditSearchLog.txt" Gibt den Namen und Speicherort für die Protokolldatei an, die Informationen über den Fortschritt der vom Skript ausgeführten Überwachungsprotokollsuche enthält. Das Skript schreibt UTC-Zeitstempel in die Protokolldatei.
$outputFile "d:\temp\AuditRecords.csv" Gibt den Namen und Speicherort der CSV-Datei an, die die vom Skript zurückgegebenen Überwachungsdatensätze enthält.
[DateTime]$start und [DateTime]$end [DateTime]::UtcNow.AddDays(-1)
[DateTime]::UtcNow
Gibt den Datumsbereich für die Überwachungsprotokollsuche an. Das Skript gibt Datensätze für Überwachungsaktivitäten zurück, die innerhalb des angegebenen Datumsbereichs aufgetreten sind. Wenn beispielsweise Aktivitäten zurückgeben werden sollen, die im Januar 2021 ausgeführt wurden, können Sie als Startdatum "2021-01-01" und als Enddatum "2021-01-31" angeben (achten Sie darauf, die Werte in doppelte Anführungszeichen zu setzen). Der Beispielwert im Skript gibt Datensätze für Aktivitäten zurück, die innerhalb der letzten 24 Stunden ausgeführt wurden. Wenn der Wert keinen Zeitstempel enthält, wird der standardmäßige Zeitstempel "00:00 Uhr" (Mitternacht) für das angegebene Datum verwendet.
$record "AzureActiveDirectory" Gibt den Datensatztyp der Überwachungsaktivitäten (auch als Überwachungsvorgänge bezeichnet) an, nach dem gesucht werden soll. Diese Eigenschaft gibt den Dienst oder das Feature an, in dem eine Aktivität ausgelöst wurde. Eine Liste der Datensatztypen, die Sie für diese Variable verwenden können, finden Sie unter Überwachungsprotokolle: Datensatztypen. Sie können den Datensatztypnamen oder den ENUM-Wert verwenden.

Tipp: Verwenden Sie den Wert $null (ohne doppelte Anführungszeichen), wenn Überwachungsdatensätze für alle Datensatztypen zurückgegeben werden sollen.
$resultSize 5000 Gibt die Anzahl von Ergebnissen an, die jedes Mal zurückgegeben werden, wenn das Cmdlet Search-UnifiedAuditLog durch das Skript aufgerufen wird (auch als Resultset bezeichnet). Der Wert 5.000 ist die vom Cmdlet unterstützte Höchstanzahl. Lassen Sie diesen Wert unverändert.
$intervalMinutes 60 Um das Limit von 5.000 zurückgegebenen Datensätzen zu überwinden, nimmt diese Variable den von Ihnen angegebenen Datenbereich in kleinere Zeitintervalle auf. Das Ausgabelimit des Befehls von 5 000 Datensätzen gilt dann für jedes Intervall, nicht für den gesamten Datumsbereich. Der Standardwert von 5.000 Datensätzen pro 60-Minuten-Intervall innerhalb des Datumsbereichs sollte für die meisten Organisationen ausreichen. Sollte das Skript aber eine Fehlermeldung zurückgeben, die besagt „maximum results limitation reached“, verringern Sie das Zeitintervall (z. B.auf 30 Minuten oder sogar 15 Minuten), und führen Sie das Skript erneut aus.

Die meisten der in der vorherigen Tabelle aufgeführten Variablen entsprechen Parametern für das Cmdlet Search-UnifiedAuditLog. Weitere Informationen zu diesen Parametern finden Sie unter Search-UnifiedAuditLog.

  1. Öffnen Sie auf dem lokalen Computer Windows PowerShell, und wechseln Sie zu dem Ordner, in dem Sie das geänderte Skript gespeichert haben.

  2. Führen Sie das Skript in Exchange Online PowerShell aus. Zum Beispiel:

    .\SearchAuditLog.ps1
    

Während der Ausführung des Skripts werden Statusmeldungen angezeigt. Nachdem die Ausführung des Skripts abgeschlossen ist, erstellt es die Protokolldatei und die .csv Datei, die die Überwachungsdatensätze enthält, und speichert sie in den Ordnern, die durch die $logFile Variablen und $outputFile definiert sind.

Wichtig

Es gibt einen Grenzwert von 50.000 für die maximale Anzahl von Überwachungsdatensätzen, die bei jeder Ausführung des Cmdlets im Skript zurückgegeben werden. Wenn Sie dieses Skript ausführen und 50.000 Ergebnisse zurückgibt, wurden Überwachungsdatensätze für Aktivitäten, die innerhalb des Datumsbereichs aufgetreten sind, wahrscheinlich nicht eingeschlossen. In diesem Fall teilen Sie den Datumsbereich in kleinere Daueren auf, und führen Sie dann das Skript für jeden Datumsbereich erneut aus. Wenn beispielsweise bei einem Datumsbereich von 90 Tagen 50.000 Ergebnisse zurückgegeben werden, können Sie das Skript zweimal ausführen, einmal für die ersten 45 Tage und dann erneut für die anderen 45 Tage des Datumsbereichs.

Schritt 3: Formatieren und Anzeigen der Überwachungsdatensätze

Nachdem Sie das Skript ausgeführt und die Überwachungsdatensätze in eine .csv Datei exportiert haben, können Sie die .csv formatieren, um die Überprüfung und Analyse der Überwachungsdatensätze zu vereinfachen. Eine Möglichkeit besteht darin, die Power Query JSON-Transformationsfunktion in Excel zu verwenden, um jede Eigenschaft im JSON-Objekt in der Spalte AuditData in eine eigene Spalte aufzuteilen. Schrittweise Anleitungen finden Sie unter "Schritt 2: Formatieren von exportierten Überwachungsprotokollen mithilfe des Power Query-Editors" in Exportieren, Konfigurieren und Anzeigen von Überwachungsprotokoll-Datensätzen.