Überwachung des DHCP-Servers konfigurieren und auswerten mit PowerShell

    DHCP ServerDer DHCP-Dienst von Windows Server er­laubt es, wesent­liche Aktivi­täten wie das Zu­weisen oder Er­neuern einer IP-Adresse, das Löschen einer Lease oder dabei auf­tretende Fehler zu proto­kollieren. Dafür ver­wendet er eine eigene Log-Datei. Ihre Konfi­guration und die Aus­wertung kann PowerShell über­nehmen.

    Eine Protokollierung der wichtigsten DHCP-Ereignisse auf dem Server hilft nicht nur beim Trouble­shooting, wenn Netzwerk­probleme bei den Clients auftreten. Über das DHCP-Logging ließe sich dann etwa feststellen, dass ein Adress-Pool erschöpft oder eine IP im Netz schon vergeben ist.

    Aktivierung des Audit-Logs

    Eine weitere Anwendung von Audit-Logs besteht darin, Rechner zu iden­tifizieren, von denen aus uner­wünschte oder böswillige Aktionen ausgeführt wurden. Wenn diese schon ein paar Tage zurück­liegen, dann wird man für die Recherche die Log-Files bemühen.

    Standard­mäßig ist das Logging für den DHCP-Dienst aktiviert und er schreibt seine Protokolle unter %SystemRoot%\system32\dhcp. Der Status für die Proto­kollierung lässt sich über die GUI der DHCP-Konsole einsehen, und zwar in den Eigen­schaften von IPv4 bzw. IPv6 unterhalb des betreffenden Servers.

    In den Eigenschaften von IPv4 sieht man auf Anhieb, ob das Audit-Log aktiviert ist.

    Auf der Registerkarte Allgemein kann man dann sofort erkennen, ob die DHCP-Über­wachungs­proto­kollierung aktiviert ist und gegebenen­falls gleich einschalten. Hinter dem Reiter Erweitert lässt sich der Pfad für die Log-Files ändern, wenn man mit der Vorgabe nicht zufrieden ist.

    Standardmäßig speichert der DHCP-Server seine Logs unter %SystemRoot%\system32\dhcp

    Aufbewahrung für eine Woche

    Für die Namen der Log-Dateien verwendet Windows das Schema DhcpSrvLog-<Tag>.log, wobei <Tag> für die ersten 3 Buchstaben des Wochentags steht. Bei IPv6 fügt der Server ein "V6" direkt nach Dhcp ein und verwendet nur die ersten beiden Buchstaben des Wochentags.

    Das Schema für die Dateinamen ist darauf ausgelegt, dass die Logs nach einer Woche überschrieben werden.

    Aufgrund dieser Konvention lässt sich absehen, dass der DHCP-Server die Logs immer nach einer Woche über­schreibt. Wenn man eine längere Historie benötigt, dann müsste man die Log-Files sichern und am neuen Ort sinn­voller­weise nach einem anderen Schema benennen.

    Es existiert keine Möglichkeit, das Muster für die Dateinamen zu ändern. Allerdings gibt es einen Trick, wenn man das Überschreiben nach 7 Tagen verhindern will. Wenn eine Log-Datei in den letzten 24 Stunden geändert wurde, dann hängt der DNS-Dienst die neuen Einträge an jene der Vorwoche an.

    Konfiguration mit PowerShell auslesen und ändern

    Wenn man die Konfiguration über PowerShell auslesen möchte, dann erfüllt das Cmdlet Get-DhcpServerAuditLog diese Aufgabe. Der Gegenspieler Set-DhcpServerAuditLog dient erwartungs­gemäß dazu, die Einstellungen zu ändern. Dabei kann man zusätzlich auch die maximale Größe der Logs festlegen oder das Intervall für die Prüfung des verfüg­baren Speicher­platzes:

    Set-DhcpServerAuditLog -ComputerName dnssrv -Enable $true `
    -Path \\server\share -MaxMBFileSize 100

    Dieses Kommando würde das Logging aktivieren, für den Pfad ein Netz­laufwerk nehmen und die maximale Größe aller Log-Dateien auf 100 MB erhöhen. Beide Cmdlets unterstützen den Parameter ComputerName für das Remote-Management eines DHCP-Servers.

    Log-Dateien auswerten

    Der DHCP-Server protokolliert wichtige Ereignisse im CSV-Format, das allerdings einen nicht mit CSV konformen Header enthält. Dort findet man eine Liste aller Ereignis-IDs und ihre Bedeutung.

    Für eine schnelle Suche würde ein grep über die Log-Files reichen, im Falle von PowerShell bietet sich dafür Select-String an. Die Ausgabe gliche dann aber einer schwer leserlichen Buch­staben­suppe mit zahl­reichen leeren Feldern und Komma-Serien.

    Das Filtern der Logs mit Select-String führt zu unübersichtlichen Ergebnissen.

    Da PowerShell jedoch über die Mittel zur struktu­rierten Auswertung von CSV-Dateien verfügt, liegt es nahe, diese zu nutzen. Dadurch ergeben sich elegantere Möglich­keiten der Analyse und Darstellung. Allerdings muss man sich dafür erst des erwähnten Headers entledigen.

    Die eigentliche CSV-Datei beginnt erst nach einem längeren Header

    Nachdem dieser immer gleich lang ist und derzeit bei Server 2012 (R2) 32 Zeilen umfasst, kann man diesen Abschnitt einfach so verwerfen:

    $DNSLog = Get-Content -Path .\DhcpSrvLog-Mon.log
    $DNSLog = $DNSLog[32 .. $DNSLog.Count]

    Get-Content speichert die eingelesene Datei in einem Array, in dem jede Zeile ein Element darstellt. Daher könnte man den Header nicht so leicht durch ein replace entfernen. In der zweiten Zeile des obigen Beispiels verwerfen wir einfach die ersten 32 Zeilen vor den CSV-Spalten­über­schriften.

    Einträge nach ID filtern

    Nun kann man die Einträge gezielt anhand einzelner Felder filtern. Um beispiels­weise heraus­zufinden, welchen Rechnern an einem bestimmten Tag eine neue IP-Adresse zugewiesen bzw. bei welchen sie erneuert wurde, benötigt man die Ereignisse mit der ID 10 oder 11:

    Dieses kurze Script liest die Log-Datei ein, entfernt den Header und konvertiert es in ein CSV-Objekt. Anschließend ist es recht einfach, dieses anhand der ID zu filtern. Der CSV-Zugriff auf die Log-Daten hat zudem den Vorteil, dass man einzelne Felder auswählen und ansprechend darstellen kann, unter anderem auch mit Out-GridView in einer GUI-Tabelle.

    Ausgabe der Log-Informationen über Out-GridView

    Die Calculated Property für Datum sorgt dafür, dass das amerikanische Datums­format aus der Log-Datei in die bei uns gebräuchliche Form gebracht wird.

    Abfragen über Hostname oder IP-Adresse

    Denkbar wären hier alle möglichen Abfragevarianten. Möchte man etwa alle Ereignisse anzeigen, die einen bestimmten Rechner betreffen, dann könnte der Filter so aussehen:

    $csv | Where Hostname -like "<Name-des-Rechners>"

    Fahndet man hingegen nach einer bestimmten IP-Adresse, dann könnte man alle dazu gehörenden Ereignisse so ermitteln:

    $csv | Where-Object IP-Adresse -eq "192.168.0.59"

    Alle Beispiele beziehen sich hier auf die Auswertung einer einzelnen Datei. Grundsätzlich könnte man die CSV-Dateien einer ganzen Woche aber ohne weiteres in einer Schleife nacheinander einlesen und die CSV-Objekte mit dem Operator '+' aneinander hängen.

    Keine Kommentare