To wielostronicowy widok tej sekcji do wydrukowania. Kliknij aby wydrukować.

Wróć do zwykłego widoku tej strony.

Przykłady użycia

Tutaj znajdziesz praktyczne przykłady, jak używać modułu w rzeczywistych sytuacjach. Te przykłady mają pomóc Ci zrozumieć, jak zastosować funkcje modułu.

To są przykłady z nieco większą głębią i kontekstem. Jeśli chcesz poznać tylko użycie poleceń z modułu, sprawdź referencję poleceń.

1 - Przepływ pracy analizy bezpieczeństwa z SQL Server

Konwertuj dzienniki debugowania DNS na CSV za pomocą DNSServer.DebugLogParser, importuj wynik do SQL Server i uruchom proste zapytanie wykrywające podejrzaną aktywność rekordów TXT.

Ten przykład pokazuje praktyczny przepływ pracy dla analityki bezpieczeństwa: analizuje dziennik debugowania DNS za pomocą Convert-DNSDebugLogFile, importuje wygenerowany plik CSV do SQL Server i uruchamia zapytanie, które wyróżnia nietypowo dużą liczbę zapytań o rekordy TXT.

Dla najlepszej interoperacyjności ten przykład zapisuje znaczniki czasu w formacie podobnym do ISO, używając -OutputCulture 'sv-SE'.

Wymagane moduły

Ten przykład korzysta z następujących modułów PowerShell:

  • DNSServer.DebugLogParser
  • SqlServer

Zainstaluj je, jeśli to konieczne:

Install-Module -Name DNSServer.DebugLogParser -Scope CurrentUser
Install-Module -Name SqlServer -Scope CurrentUser

Scenariusz

Użyj tego przepływu pracy, gdy chcesz przenieść przetworzone dane dziennika debugowania DNS do SQL Server, aby móc:

  • efektywnie przeszukiwać duże zbiory danych
  • tworzyć powtarzalne zapytania wykrywające
  • korelować aktywność na wielu serwerach DNS
  • przechowywać znormalizowane dane do późniejszej analizy

Wynik kroku konwersji

Convert-DNSDebugLogFile nie zapisuje bezpośrednio do SQL Server. Najpierw tworzy plik CSV. Ten plik CSV jest zbiorem danych importowanym do bazy danych.

W tym przykładzie:

  • dziennik wejściowy: C:\Administration\Logs\DNS\dns.log
  • wygenerowany CSV: C:\Administration\Logs\DNS\dns.csv
  • docelowa tabela: dbo.DNSQueries

Utwórz tabelę docelową

Uruchom poniższe polecenie raz w SQL Server, aby utworzyć tabelę docelową.

IF OBJECT_ID('dbo.DNSQueries', 'U') IS NULL
BEGIN
    CREATE TABLE dbo.DNSQueries (
        DateTime      datetime2(0)   NOT NULL,
        ThreadId      int            NULL,
        Context       nvarchar(20)   NULL,
        PacketId      int            NULL,
        Protocol      nvarchar(10)   NULL,
        Direction     nvarchar(10)   NULL,
        ClientIP      nvarchar(64)   NULL,
        Xid           nvarchar(16)   NULL,
        Type          nvarchar(16)   NULL,
        Opcode        nvarchar(16)   NULL,
        FlagsHex      nvarchar(16)   NULL,
        FlagsChar     nvarchar(16)   NULL,
        ResponseCode  nvarchar(32)   NULL,
        QuestionType  nvarchar(32)   NULL,
        QuestionName  nvarchar(512)  NULL,
        Information   nvarchar(max)  NULL,
        Details       nvarchar(max)  NULL,
        ComputerName  nvarchar(256)  NULL
    );
END;

Konwersja dziennika i import CSV

Poniższy przykład PowerShell wykonuje cały przepływ pracy:

  1. importuje wymagane moduły
  2. konwertuje dziennik debugowania DNS na CSV
  3. wczytuje wygenerowany CSV
  4. masowo importuje wiersze do SQL Server
# Requires -Modules DNSServer.DebugLogParser, SqlServer

Import-Module -Name DNSServer.DebugLogParser -ErrorAction Stop
Import-Module -Name SqlServer -ErrorAction Stop

$logPath = 'C:\Administration\Logs\DNS\dns.log'
$csvPath = 'C:\Administration\Logs\DNS\dns.csv'
$serverInstance = 'SQLServer'
$databaseName = 'DNSLogs'
$delimiter = ';'

$createTableSql = @'
IF OBJECT_ID('dbo.DNSQueries', 'U') IS NULL
BEGIN
    CREATE TABLE dbo.DNSQueries (
        DateTime      datetime2(0)   NOT NULL,
        ThreadId      int            NULL,
        Context       nvarchar(20)   NULL,
        PacketId      int            NULL,
        Protocol      nvarchar(10)   NULL,
        Direction     nvarchar(10)   NULL,
        ClientIP      nvarchar(64)   NULL,
        Xid           nvarchar(16)   NULL,
        Type          nvarchar(16)   NULL,
        Opcode        nvarchar(16)   NULL,
        FlagsHex      nvarchar(16)   NULL,
        FlagsChar     nvarchar(16)   NULL,
        ResponseCode  nvarchar(32)   NULL,
        QuestionType  nvarchar(32)   NULL,
        QuestionName  nvarchar(512)  NULL,
        Information   nvarchar(max)  NULL,
        Details       nvarchar(max)  NULL,
        ComputerName  nvarchar(256)  NULL
    );
END
'@

Convert-DNSDebugLogFile `
    -InputFile $logPath `
    -ComputerName 'DNS01' `
    -OutputType CSV `
    -OutputFile $csvPath `
    -Delimiter $delimiter `
    -OutputCulture 'sv-SE'

$rows = Import-Csv -Path $csvPath -Delimiter $delimiter

if (-not $rows) {
    throw "Wygenerowany plik CSV '$csvPath' nie zawiera żadnych wierszy."
}

$dataTable = [System.Data.DataTable]::new()
foreach ($columnName in $rows[0].PSObject.Properties.Name) {
    $null = $dataTable.Columns.Add($columnName, [string])
}

foreach ($row in $rows) {
    $dataRow = $dataTable.NewRow()
    foreach ($column in $dataTable.Columns) {
        $columnName = $column.ColumnName
        $dataRow[$columnName] = $row.$columnName
    }

    $null = $dataTable.Rows.Add($dataRow)
}

$connectionString = "Server=$serverInstance;Database=$databaseName;Integrated Security=True"
$connection = [System.Data.SqlClient.SqlConnection]::new($connectionString)

try {
    $connection.Open()

    $command = $connection.CreateCommand()
    $command.CommandText = $createTableSql
    $null = $command.ExecuteNonQuery()

    $bulkCopy = [System.Data.SqlClient.SqlBulkCopy]::new($connection)
    $bulkCopy.DestinationTableName = 'dbo.DNSQueries'

    foreach ($column in $dataTable.Columns) {
        $null = $bulkCopy.ColumnMappings.Add($column.ColumnName, $column.ColumnName)
    }

    $bulkCopy.WriteToServer($dataTable)
}
finally {
    $connection.Dispose()
}

Zapytanie o podejrzaną aktywność rekordów TXT

Gdy dane znajdują się w SQL Server, możesz wyszukać klientów, którzy wykonują nietypowo dużą liczbę zapytań o rekordy TXT.

SELECT
    ComputerName,
    ClientIP,
    QuestionName,
    COUNT(*) AS QueryCount
FROM dbo.DNSQueries
WHERE QuestionType = 'TXT'
GROUP BY
    ComputerName,
    ClientIP,
    QuestionName
HAVING COUNT(*) > 100
ORDER BY QueryCount DESC;

Jeśli wolisz uruchomić zapytanie z poziomu PowerShell, użyj Invoke-Sqlcmd z modułu SqlServer:

$query = @'
SELECT
    ComputerName,
    ClientIP,
    QuestionName,
    COUNT(*) AS QueryCount
FROM dbo.DNSQueries
WHERE QuestionType = 'TXT'
GROUP BY
    ComputerName,
    ClientIP,
    QuestionName
HAVING COUNT(*) > 100
ORDER BY QueryCount DESC;
'@

Invoke-Sqlcmd `
    -ServerInstance 'SQLServer' `
    -Database 'DNSLogs' `
    -Query $query

Dlaczego zapytania TXT są interesujące

Duża liczba zapytań o rekordy TXT może być warta przejrzenia, ponieważ może wskazywać na:

  • tunelowanie DNS
  • wyciek danych przez DNS
  • nadużycie rekordów TXT przez złośliwe oprogramowanie lub narzędzia
  • nietypowo hałaśliwych lub źle skonfigurowanych klientów

To zapytanie to tylko punkt wyjścia. W środowisku produkcyjnym powinieneś dostosować próg i dodać filtry odpowiadające twojej infrastrukturze.

Uwagi operacyjne

  • Import-Csv wczytuje cały plik do pamięci. Przy bardzo dużych eksportach dzienników rozważ podejście strumieniowe zamiast budowania pełnej DataTable.
  • Zachowaj -ComputerName w kroku konwersji, aby rekordy pozostały przypisane po centralnym zaimportowaniu.
  • Używaj spójnego separatora i kultury podczas eksportu i importu.
  • Przed użyciem tego przepływu pracy do długoterminowego przechowywania zweryfikuj retencję, indeksowanie i kontrolę dostępu w SQL Server.

2 - Praktyczne zastosowanie w środowisku domenowym (zbieranie i konwersja sterowana przez GPO)

Ten przykład pokazuje, jak wdrożyć przepływ pracy sterowany przez GPO do zbierania i konwersji dzienników debugowania DNS na kontrolerach domeny.

Ten dokument przedstawia praktyczny, kompleksowy przykład uruchomienia DNSServer.DebugLogParser w środowisku domeny Active Directory, skupiając się na konwersji dzienników debugowania serwera DNS Windows na kontrolerach domeny.

Do tego przykładu dołączony jest archiwum ZIP, które zawiera artefakty polityki używane do wdrożenia opisanego tutaj przepływu pracy.
Najważniejsze artefakty to manifest kopii zapasowej, raport GPO, Files.xml, Set-DNSServerDebugLogging.ps1 oraz ScheduledTasks.xml.

Scenariusz

  • Kilka kontrolerów domeny (DC) pełni rolę serwera DNS.
  • Debugowanie DNS jest włączone i spójnie skonfigurowane na każdym DC za pomocą zadania zaplanowanego (zapisujące pliki dziennika do C:\Administration\Logs\DNSServer).
  • Centralnie zarządzany proces konwertuje dzienniki na CSV do celów:
    • analizy bezpieczeństwa
    • raportowania operacyjnego
    • rozwiązywania problemów
    • zgodności/przechowywania danych

Docelowe rezultaty

  • Spójne ustawienia konwersji na wszystkich DC
  • Przewidywalna lokalizacja i nazewnictwo plików wyjściowych
  • Opcjonalna kompresja zmniejszająca zajętość miejsca
  • Opcjonalne statystyki do szybkich podsumowań dziennych
  • Minimalne ryzyko po stronie hosta, z wyraźnymi zasadami ponownego uruchomienia i czyszczenia

Proponowana architektura

Model zbierania: lokalna konwersja + centralne pobieranie

  1. Każdy DC zapisuje dzienniki debugowania DNS na dysku z włączonym przełączaniem plików.
  2. Każdy DC konwertuje obrócone pliki *.log na dane CSV i statystyki CSV, a następnie kompresuje wyniki do *.zip według harmonogramu (Harmonogram zadań).
  3. Wyniki są zapisywane obok plików dziennika, aby uprościć potok.
  4. Centralny serwer zbiera pliki *.zip, na przykład przez udostępnianie plików, zaplanowane kopiowanie, przekazywanie do SIEM lub kolektor oparty na agencie.

Ten model minimalizuje odczyty sieciowe dużych surowych plików dziennika i utrzymuje analizę blisko danych.

Przepływ pracy GPO

Przepływ pracy jest realizowany przez Politykę Grupową (konfiguracja komputera), aby zapewnić spójne ustawienia na wszystkich kontrolerach domeny.

Referencyjna implementacja zawarta w tym repozytorium (raport GPO):

  • Nazwa archiwum/raportu: T0-C-Analytics-DNSDebugLogging
  • ID kopii zapasowej: {2B6F16BC-0E7C-4787-83D7-2854FED882EE}
  • Cel linku GPO: corp.company.com/Domain Controllers
  • Filtr elementów (używany zarówno do wdrożenia plików, jak i zadań zaplanowanych): stosowany tylko jeśli istnieje C:\Windows\System32\dns.exe

1) Wymagania wstępne (foldery + moduł)

Dostarczona kopia zapasowa zakłada, że te foldery już istnieją. Dodaj osobne elementy GPP, jeśli chcesz, aby wdrożenie tworzyło je automatycznie:

  • C:\Administration\Scripts
  • C:\Administration\Logs\DNSServer

Kopia zapasowa zakłada również, że Convert-DNSDebugLogFile jest już dostępny na DC. Zadanie konwersji uruchamia Windows PowerShell 5.1 z -NoProfile i nie importuje modułu jawnie, więc moduł musi być zainstalowany w ścieżce modułów Windows PowerShell widocznej dla LocalSystem. Zalecane podejścia:

  • Zainstaluj DNSServer.DebugLogParser na DC, np. z PowerShell Gallery (jeśli polityka na to pozwala).
  • Wdróż moduł przez wewnętrzne repozytorium / udział plików, aby był wykrywalny w $env:PSModulePath
  • Dodaj jawny Import-Module do akcji zadania, jeśli chcesz mieć deterministyczne ładowanie

2) Wdrożenie skryptu konfigurującego debugowanie DNS (GPP Files)

GPO wdraża skrypt:

  • Źródło (w SYSVOL przez GPP): %GptPath%\Preferences\Files\Set-DNSServerDebugLogging.ps1
  • Cel (na każdym DC): C:\Administration\Scripts\Set-DNSServerDebugLogging.ps1

Jest to zaimplementowane w elemencie preferencji GPP Files w Files.xml.

3) Zadanie zaplanowane: konfiguracja debugowania DNS

GPO tworzy zadanie zaplanowane o nazwie Set-DNSServerDebugLogging.

  • Kontekst bezpieczeństwa w dostarczonej kopii zapasowej: SYSTEM z typem logowania S4U
  • Wyzwalacz w dostarczonej kopii zapasowej: codziennie (start 2025-03-01T00:00:01)
  • Akcja w ScheduledTasks.xml:
    • powershell.exe -ExecutionPolicy RemoteSigned -command " & { C:\Administration\Scripts\Set-DNSServerDebugLogging.ps1 }"
    • Katalog roboczy: C:\Administration\Scripts

Powiązany skrypt Set-DNSServerDebugLogging.ps1 konfiguruje debugowanie DNS za pomocą Get-DnsServerDiagnostics / Set-DnsServerDiagnostics i (co ważne):

  • Włącza logowanie do pliku + przełączanie plików
  • Zapisuje do: C:\Administration\Logs\DNSServer\DnsDebugLog_<COMPUTERNAME>.<Domain>_.log
  • Ustawia rozmiar przełączania na 10 MB na plik
  • Rejestruje głównie aktywność związaną z zapytaniami (zapytania + powiadomienia + aktualizacje + transakcje zapytań) i wyklucza pełne logowanie pakietów

4) Zadanie zaplanowane: konwersja obróconych dzienników debugowania do skompresowanego CSV

GPO tworzy zadanie zaplanowane o nazwie Convert-DNSDebugLogs.

  • Kontekst bezpieczeństwa w dostarczonej kopii zapasowej: SYSTEM z typem logowania InteractiveToken
  • Wyzwalacz w dostarczonej kopii zapasowej: codziennie (start 2026-01-01T00:30:00)
  • Katalog roboczy: C:\Administration\Logs\DNSServer
  • Akcja w ScheduledTasks.xml (formatowana dla czytelności):
Get-ChildItem .\*.log |
  Sort-Object lastwritetime, Name -Descending |
  Select-Object -Skip 1 |
  Convert-DNSDebugLogFile `
    -ComputerName $env:COMPUTERNAME `
    -Delimiter ';' `
    -OutputType Both `
    -ContextFilter Packet `
    -OutputCulture sv-SE `
    -CompressOutput

Uwagi projektowe:

  • Select-Object -Skip 1 celowo pomija najnowszy (aktywny) plik dziennika.
  • Oznacza to, że bieżące dane są eksportowane dopiero po przełączeniu; na DC o niskim natężeniu ruchu aktywny dziennik może pozostać nieprzetworzony przez ponad dzień.
  • Ponieważ Convert-DNSDebugLogFile domyślnie ustawia -OutputFile na „ten sam folder, ta sama nazwa, .csv”, wyniki trafiają obok plików *.log.
  • Z -CompressOutput każdy przetworzony dziennik generuje *.zip, a pośrednie CSV są usuwane.
  • Jeśli nie archiwizujesz ani nie usuwasz przetworzonych plików *.log, kolejne uruchomienia będą ponownie przetwarzać każdy nieaktywny dziennik.
  • Zadanie zgłasza błąd, jeśli $Error.Count -gt 0, sygnalizując nieudane uruchomienie.

5) Centralne pobieranie

Opcje (wybierz jedną):

  • Pobieranie przez udział plików: DC zapisuje (lub kopiuje) C:\Administration\Logs\DNSServer\*.zip do \\fileserver\share\dns\$env:COMPUTERNAME\... (przyznaj prawa do udziału i NTFS kontom komputerów DC lub grupie Domain Controllers, jeśli zadanie działa jako SYSTEM)
  • Model pull: centralne zadanie odczytuje \\dc\C$\Administration\Logs\DNSServer\*.zip (najmniej preferowane; wymaga udziałów administracyjnych)
  • Agent forwarder: SIEM / potok logów przesyłający pliki *.zip

Rozważania operacyjne

  • Zasada najmniejszych uprawnień: zadania działają jako SYSTEM; upewnij się, że lokalne foldery są zapisywalne i że dowolne cele UNC przyznają dostęp kontu komputera, jeśli są używane.
  • Polityka podpisywania: oba zadania używają -ExecutionPolicy RemoteSigned; podpisz lub odblokuj wdrożony skrypt i moduł zgodnie z polityką.
  • Wykorzystanie dysku: -CompressOutput znacząco pomaga, ale ten przepływ pracy nie usuwa źródłowych dzienników; zaplanuj retencję i czyszczenie.
  • Zachowanie ponownego przetwarzania: jeśli nie archiwizujesz ani nie usuwasz przetworzonych dzienników, zadanie konwersji będzie ponownie przetwarzać każdy nieaktywny plik *.log podczas kolejnych uruchomień. To proste i niezawodne, ale może nadpisać wyniki i tworzyć duplikaty w dalszym przetwarzaniu, jeśli kolektor nie deduplikuje.
  • Konsolidacja wielu DC: -ComputerName $env:COMPUTERNAME jest dołączone, aby zestawy danych pozostały możliwe do śledzenia.
  • Walidacja: walidacja nagłówka pozostaje włączona, ponieważ zadanie nie używa -SkipHeaderValidation (zalecane).

Walidacja i dostosowanie (z użyciem ZIP)

Użyj archiwum ZIP jako implementacji referencyjnej, a następnie dostosuj następujące aspekty do swojego środowiska:

  • Zakres docelowy: które DC / OU otrzymują politykę
  • Tożsamość wykonania: potwierdź, że oba zadania zaplanowane używają zamierzonego typu logowania (S4U vs InteractiveToken) lub ujednolić je do swojego standardu
  • Tworzenie folderów: zdecyduj, czy C:\Administration\Scripts i C:\Administration\Logs\DNSServer są przygotowane gdzie indziej, czy mają być tworzone przez dodatkowe elementy GPP
  • Ścieżki: potwierdź, że C:\Administration\Scripts i C:\Administration\Logs\DNSServer odpowiadają twoim standardom
  • Retencja: zdecyduj, czy zachować surowe dzienniki i na jak długo (szczególnie jeśli włączasz opcje czyszczenia)
  • Pobieranie: potwierdź, gdzie zapisywane są pliki CSV/ZIP i jak są centralnie zbierane

Jeśli chcesz zweryfikować dokładną konfigurację GPO bez importowania, autorytatywne źródła w tym repozytorium to:

3 - Przykład zaplanowanego zadania

Ten przykład pokazuje, jak utworzyć zaplanowane zadanie Windows, które codziennie uruchamia skrypt PowerShell do przetwarzania dzienników debugowania DNS.

Ten skrypt tworzy zaplanowane zadanie Windows, które uruchamia się codziennie o 2:00 rano. Importuje moduł i przetwarza wszystkie pliki dziennika w folderze, w którym jest wykonywany skrypt (w tym przykładzie “C:\Administration\Logs\DNS”). Proces kompresuje wynik do plików ZIP i usuwa oryginały, aby zachować porządek.

$actionParams = @{
    Execute = "powershell.exe"
    Argument = '-ExecutionPolicy RemoteSigned -Command "Import-Module DNSServer.DebugLogParser; Get-ChildItem .\*.log | Sort-Object lastwritetime, Name -Descending | Convert-DNSDebugLogFile -ComputerName $env:COMPUTERNAME -Delimiter \";\" -OutputType Both -ContextFilter Packet -OutputCulture sv-SE -CompressOutput"'
    WorkingDirectory = "C:\Administration\Logs\DNS"
}
$Action = New-ScheduledTaskAction @actionParams

$Trigger = New-ScheduledTaskTrigger -Daily -At "2:00AM"

Register-ScheduledTask -TaskName "Process DNS Logs" -Action $Action -Trigger $Trigger -Description "Convert DNS debug logs to CSV daily"