Website-Suche

Durchsuchen von Active Directory-Protokollen mit PowerShell


Die letzten Wochen habe ich viel Zeit mit Active Directory und der Automatisierung von Verwaltungsaufgaben mit PowerShell verbracht. Wenn Sie eine oder zwei Seiten der Beiträge zurückblättern, sehen Sie einige der Skripte und Funktionen, die ich geteilt habe. Heute möchte ich auf etwas eingehen, das in den letzten Kommentaren im Zusammenhang mit der Nachverfolgung von Änderungen in Active Directory aufgetaucht ist. Eine logische Frage lautet: „Wer hat die Änderung vorgenommen?“. Ich würde auch gerne wissen: „Was haben sie geändert?“ PowerShell allein kann nicht alle diese Antworten erhalten. Und wenn Sie eine Active Directory-Infrastruktur angemessener Größe betreiben, würde ich mir wünschen, dass Sie in Verwaltungstools der Enterprise-Klasse investieren. Der Code, den ich teile, eignet sich gut für kleine Geschäfte, die keine andere Wahl haben, als ihr eigenes Ding zu machen. Oder für Situationen, in denen Sie eine Lücke schließen und ein kurzfristiges Problem angehen müssen.

Durchsuchen des Ereignisprotokolls

Um die gewünschten Informationen darüber zu erhalten, wer Änderungen in Active Directory vornimmt, müssen Sie in Ereignisprotokollen stöbern. Insbesondere müssen Sie das Sicherheitsereignisprotokoll abfragen. Und um noch genauer zu sein: Sie müssen das Sicherheitsereignisprotokoll auf einem Domänencontroller abfragen, der in Active Directory schreiben kann. Wenn ein Administrator ein Benutzerkonto auf DOM1 aktiviert, wird ein Eintrag im Sicherheitsereignisprotokoll erstellt. Offensichtlich werden Sie die Änderung nicht im Sicherheitsereignisprotokoll auf DOM2 sehen.

Meine Prämisse und der Code, den ich Ihnen zeigen werde, gehen von den Standardeinstellungen für das Ereignisprotokoll auf Windows-Servern aus. Wenn Sie Protokolle weiterleiten oder mit einer Drittanbieterlösung verwalten, müssen Sie dies bei der Betrachtung meines Codes berücksichtigen. Die Informationen, die ich Ihnen zeigen werde, befinden sich im Sicherheitsereignisprotokoll und sind serverspezifisch. Wie Sie diese Protokolle verwalten, bleibt Ihnen überlassen.

Bevor ich näher darauf eingehe, ein kurzer Vorbehalt. Jede Organisation verfügt über eigene Richtlinien und Verfahren für die Verwaltung von Ereignisprotokollen. Sie können Active Directory-bezogene Änderungen nur dann abfragen, wenn die Informationen nicht aus dem Sicherheitsereignisprotokoll gelöscht wurden. Das bedeutet, dass Sie möglicherweise sicherstellen müssen, dass Ihre Protokolldateien groß genug sind, um Ihren Anforderungen gerecht zu werden. In meiner Testdomäne habe ich diesen Befehl ausgeführt, um die Größe auf 1 GB zu erhöhen.

limit-eventlog -LogName security -ComputerName dom2,dom1 -MaximumSize 1024MB

Benutzerverwaltungsereignisse

Ich werde mich auf Benutzerverwaltungsereignisse konzentrieren. Jede Art von Ereignis ist mit einer Ereignis-ID verbunden. Hier ist eine Cheater-Hashtabelle, die ich verwende.

# a hashtable of user management event IDs for the Security event log
$ADEvent = @{
   UserChanged  = 4738
   UserCreated  = 4720
   UserDeleted  = 4726
   UserEnabled  = 4722
   UserDisabled = 4725
}

Wenn Sie ein AD-Benutzerkonto verwalten, erhalten Sie möglicherweise mehrere Protokolleinträge für dieselbe Aktivität. Wenn Sie beispielsweise ein Benutzerkonto erstellen und es aktivieren, werden höchstwahrscheinlich die Ereignisse „UserCreated“ und „UserEnabled“ angezeigt. Wahrscheinlich auch ein UserChanged. Behalt das im Kopf.

Um das Ereignisprotokoll abzufragen, schlage ich vor, dass Sie lernen, wie Sie Get-WinEvent verwenden. Es bietet mehr Abfrageflexibilität, ist (glaube ich) etwas schneller und wenn Sie PowerShell 7 verwenden, ist es das einzige Tool, das Ihnen zur Verfügung steht. Ich zähle darauf, dass Sie Hilfe und Beispiele lesen. In der Zwischenzeit finden Sie hier ein Beispiel.

Get-WinEvent -FilterHashtable @{Logname = 'Security';ID=4720;Starttime="2/1/2021"} -ComputerName dom1

Dabei werden alle Benutzererstellungsereignisse auf DOM1 abgefragt, die seit dem 1. Februar 2021 aufgezeichnet wurden.

Lassen Sie uns in die Nachrichtendetails eintauchen.

Der Ereignisprotokolleintrag zeigt den Betreff, das Konto, das für die Aktivität verantwortlich ist, und das Ziel. In diesem Fall sieht es so aus, als hätte „Firma\Administrator“ „Firma\L.Kuja“ erstellt. Ich habe keine Ahnung, wo dieses Konto erstellt wurde, aber ich kann es jederzeit mit Get-ADUser nachschlagen.

Während ich dies schreibe, möchte ich auch auf die Attributliste hinweisen. Wenn ein Benutzerkonto geändert wird, sind dies die einzigen Attribute, die im Ereignisprotokoll erfasst werden. Wenn ich die Abteilung oder den Titel eines Benutzers ändere, wird dies nicht im Sicherheitsereignisprotokoll erfasst. Wenn Ihnen diese Art von Audit-Trail wichtig ist, sollten Sie auf Verwaltungsprodukte von Drittanbietern zurückgreifen.

Get-ADUserAudit

Unter Berücksichtigung dieser Einschränkungen habe ich eine PowerShell-Funktion namens Get-ADUserAudit geschrieben. Es verfügt über Parameter zum Erstellen einer Suche auf einem oder mehreren Domänencontrollern nach verschiedenen Arten von Benutzerverwaltungsereignissen, die seit einem bestimmten Zeitpunkt protokolliert wurden.

Get-ADUserAudit -event created,deleted -since "2/1/2021"

Das Standardverhalten besteht darin, alle Replikatdomänencontroller zu durchsuchen.

Die Funktion schreibt ein benutzerdefiniertes Objekt in die Pipeline, das über eine standardmäßige benutzerdefinierte Formatansicht verfügt. Lassen Sie mich die Ausgabe kurz erläutern. Die Eigenschaften DomainController, Since und EventType sollten selbstverständlich sein. Die Targets-Eigenschaft ist eine Sammlung aller Benutzerkonten, die für ein bestimmtes Ereignis identifiziert wurden. Mit TargetCount können Sie schnell sehen, wie viele Benutzerkonten vorhanden sind. Mit anderen Worten: Seit dem 1. Februar wurden 5 Benutzerkonten auf DOM1 erstellt (oder zumindest protokolliert). „Administratoren“ zeigt alle mit den Ereignissen verknüpften Administratorkonten an. Im gleichen Zeitraum erstellten Administrator, AprilS und ArtD die Konten. Das Ergebnis verrät Ihnen nicht, welcher Administrator welches Benutzerkonto erstellt hat. Um diese Informationen zu erhalten, müssten Sie erneut im Ereignisprotokoll nachsehen.

Natürlich können Sie die Ergebnisse nach Ihren Wünschen anpassen.

Get-ADUserAudit -event created,deleted,enabled,disabled -outvariable a | sort-object eventtype | format-table -GroupBy eventtype -Property since,domaincontroller,targetcount

Oder hier ist eine Möglichkeit, Ereignisse zusammenzufassen.

$a | group-object eventtype -ov b | select-object @{Name="Since";Expression={$a[0].Since}},Name,@{Name="Total";Expression = { ($_.group.targetcount | measure-object -sum).sum}}

$A ist das gespeicherte Ergebnis meines vorherigen Befehls.

Wenn ich das häufig ausführen wollte, würde ich ein Steuerskript erstellen, um etwas Tipparbeit zu sparen. Da ich nicht anders kann, könnte ich es sogar noch weiter ausbauen und es als geplanten Job einrichten, um eine HTML-Version zu erstellen und per E-Mail zu versenden.

Wo ist der Kodex?

Wenn Sie sehen möchten, wie ich das alles gemacht habe, oder sich den Code holen möchten, damit Sie ihn selbst ausprobieren können, können Sie die Dateien von dieser Github-Liste herunterladen. In diesem Zusammenhang könnte Sie auch der Befehl Convert-EventLogRecord interessieren, der Teil des PSScriptTools-Moduls ist. Dieser Befehl erleichtert das Parsen von Informationen aus Ereignisprotokolldatensätzen.

Get-WinEvent -FilterHashtable @{Logname = 'Security';ID=4720;Starttime="2/1/2021"} -ComputerName dom2 | 
Convert-EventLogRecord |  
Format-table -GroupBy Computername -Property ID,TimeCreated,
@{Name="Admin";Expression={"$($_.SubjectDomainName)\$($_.SubjectUsername)"}},
@{Name="Account";Expression = { (Get-ADuser $_.samaccountname).DistinguishedName }}

Jetzt kann ich deutlich erkennen, welcher Administrator welches Konto erstellt hat.

Lassen Sie mich wissen, was Sie denken oder ob etwas davon hilfreich ist.

Verwandte Artikel