Tämä on monen sivun tulostettava näkymä osiosta Paina tulostaaksesi.

Palaa tavalliseen näkymään.

Käyttöesimerkit

Täältä löydät käytännön esimerkkejä siitä, miten moduulia voi käyttää oikeissa tilanteissa. Nämä esimerkit on suunniteltu auttamaan sinua ymmärtämään, miten moduulin toiminnallisuutta sovelletaan.

Nämä ovat esimerkkejä, joissa on hieman enemmän syvyyttä ja kontekstia. Jos haluat vain moduulin komentojen käytön, katso komentoviite.

1 - Ajoitetun tehtävän esimerkki

Tämä esimerkki näyttää, miten luodaan Windowsin ajoitettu tehtävä, joka suorittaa PowerShell-skriptin DNS-vianmäärityslokien käsittelemiseksi päivittäin.

Tämä skripti luo Windowsin ajoitetun tehtävän, joka suoritetaan päivittäin klo 2:00. Se tuo moduulin ja käsittelee kaikki lokitiedostot kansiossa, jossa skripti suoritetaan (tässä esimerkissä “C:\Administration\Logs\DNS”). Prosessi pakkaa tuloksen ZIP-tiedostoiksi ja poistaa alkuperäiset tiedostot siisteyden ylläpitämiseksi.

$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"

2 - Käytännön käyttö Domain-ympäristössä (GPO-ohjattu keräys ja muunnos)

Tämä esimerkki havainnollistaa, miten toteuttaa GPO-ohjattu työnkulku DNS-debug-lokien keräämiseksi ja muuntamiseksi toimialueen ohjaimilla.

Tässä dokumentissa esitellään käytännön, kokonaisvaltainen esimerkki DNSServer.DebugLogParserin suorittamisesta Active Directory -toimialueympäristössä, keskittyen Windows DNS Serverin debug-lokien muuntamiseen toimialueen ohjaimilla.

Tämän esimerkin mukana tulee ZIP-arkisto, joka sisältää politiikan artefaktit työnkulun toteuttamiseksi.
Merkittävimmät artefaktit ovat varmuuskopion manifesti, GPO-raportti, Files.xml, Set-DNSServerDebugLogging.ps1 ja ScheduledTasks.xml.

Tilannekuvaus

  • Useat toimialueen ohjaimet (DC:t) isännöivät DNS Server -roolia.
  • DNS-debug-lokitus on otettu käyttöön ja konfiguroitu johdonmukaisesti jokaisella DC:llä ajastetun tehtävän avulla (lokitiedostot tallennetaan polkuun C:\Administration\Logs\DNSServer).
  • Keskitetysti hallittu prosessi muuntaa lokit CSV-muotoon seuraaviin käyttötarkoituksiin:
    • tietoturva-analytiikka
    • operatiivinen raportointi
    • vianmääritys
    • vaatimustenmukaisuus ja säilytys

Tavoitellut tulokset

  • Johdonmukaiset muunnosasetukset kaikilla DC:illä
  • Ennustettava tulostiedostojen sijainti ja nimeäminen
  • Valinnainen pakkaus tallennustilan säästämiseksi
  • Valinnaiset tilastotulosteet nopeisiin päivittäisiin yhteenvedonäkymiin
  • Minimissään isäntäkoneen riski, selkeät uudelleensuoritus- ja siivouskäytännöt

Ehdotettu arkkitehtuuri

Keräysmalli: paikallinen muunnos + keskitetty haku

  1. Jokainen DC kirjoittaa DNS-debug-lokit levyelle rollover-ominaisuus päällä.
  2. Jokainen DC muuntaa kiertävät *.log-tiedostot data-CSV:ksi ja tilastojen CSV:ksi, minkä jälkeen pakkaa tulokset *.zip-muotoon ajastetusti (Task Scheduler).
  3. Tulosteet kirjoitetaan samalle kansiolle lokien viereen, jotta putki pysyy yksinkertaisena.
  4. Keskitetty palvelin kerää *.zip-tulosteet esimerkiksi tiedostojakojen kautta, ajastetulla kopioinnilla, SIEM-välityksellä tai agenttipohjaisella kerääjällä.

Tämä malli minimoi suurten raakalukujen lukemisen verkon yli ja pitää jäsentämisen lähellä dataa.

GPO-työnkulku

Työnkulku toteutetaan Group Policyllä (tietokoneen konfiguraatio) varmistaakseen johdonmukaiset asetukset kaikilla toimialueen ohjaimilla.

Tämän repositorion mukana tuleva viiteimplementaatio (GPO-raportti):

  • Arkisto/raportin nimi: T0-C-Analytics-DNSDebugLogging
  • Varmuuskopion tunniste: {2B6F16BC-0E7C-4787-83D7-2854FED882EE}
  • GPO-linkin kohde: corp.company.com/Domain Controllers
  • Kohdesuodatin (käytetään sekä tiedostojen jakeluun että ajastettuihin tehtäviin): soveltuu vain, jos C:\Windows\System32\dns.exe on olemassa

1) Esivaatimukset (kansiot + moduuli)

Toimitettu varmuuskopio olettaa, että seuraavat kansiot ovat jo olemassa. Lisää erilliset GPP-kohteet, jos haluat, että käyttöönotto luo ne automaattisesti:

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

Varmuuskopio olettaa myös, että Convert-DNSDebugLogFile on jo saatavilla DC:illä. Muunnostehtävä käynnistää Windows PowerShell 5.1:n -NoProfile-asetuksella eikä tuo moduulia eksplisiittisesti, joten moduulin on oltava asennettuna konekohtaisessa Windows PowerShell -moduulipolussa, joka on näkyvissä LocalSystem-tilille. Suositellut tavat:

  • Asenna DNSServer.DebugLogParser DC:ille, esimerkiksi PowerShell Gallerystä (jos politiikka sallii).
  • Ota moduuli käyttöön sisäisen repositorion tai tiedostojakopalvelun kautta, jotta se löytyy $env:PSModulePath-polusta.
  • Lisää eksplisiittinen Import-Module tehtävän toimintaan, jos haluat varman latauskäytöksen.

2) Debug-lokituksen konfigurointiskriptin käyttöönotto (GPP Files)

GPO ottaa käyttöön skriptin:

  • Lähde (SYSVOLin kautta GPP): %GptPath%\Preferences\Files\Set-DNSServerDebugLogging.ps1
  • Kohde (jokaisella DC:llä): C:\Administration\Scripts\Set-DNSServerDebugLogging.ps1

Tämä on toteutettu GPP Files -asetuskohteena Files.xml-tiedostossa.

3) Ajastettu tehtävä: DNS-debug-lokituksen konfigurointi

GPO luo ajastetun tehtävän nimeltä Set-DNSServerDebugLogging.

  • Käyttöoikeus kontekstissa toimitetussa varmuuskopiossa: SYSTEM kirjautumistyyppi S4U
  • Laukaisin toimitetussa varmuuskopiossa: päivittäin (aloitusraja 2025-03-01T00:00:01)
  • Toiminto ScheduledTasks.xml-tiedostossa:
    • powershell.exe -ExecutionPolicy RemoteSigned -command " & { C:\Administration\Scripts\Set-DNSServerDebugLogging.ps1 }"
    • Työhakemisto: C:\Administration\Scripts

Linkitetty Set-DNSServerDebugLogging.ps1-skripti konfiguroi DNS-debug-lokituksen Get-DnsServerDiagnostics / Set-DnsServerDiagnostics -komentojen avulla ja erityisesti:

  • Ottaa käyttöön tiedostoon lokituksen + rolloverin
  • Kirjoittaa tiedostoon: C:\Administration\Logs\DNSServer\DnsDebugLog_<COMPUTERNAME>.<Domain>_.log
  • Käyttää 10 Mt:n rollover-kokoa per tiedosto
  • Tallentaa pääasiassa kyselyihin liittyvää toimintaa (kyselyt + ilmoitukset + päivitykset + kyselytapahtumat) ja sulkee pois koko pakettien lokituksen

4) Ajastettu tehtävä: kiertävien debug-lokien muuntaminen pakatuiksi CSV-tiedostoiksi

GPO luo ajastetun tehtävän nimeltä Convert-DNSDebugLogs.

  • Käyttöoikeus kontekstissa toimitetussa varmuuskopiossa: SYSTEM kirjautumistyyppi InteractiveToken
  • Laukaisin toimitetussa varmuuskopiossa: päivittäin (aloitusraja 2026-01-01T00:30:00)
  • Työhakemisto: C:\Administration\Logs\DNSServer
  • Toiminto ScheduledTasks.xml-tiedostossa (muotoiltu luettavuuden vuoksi):
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

Suunnittelumuistiinpanot:

  • Select-Object -Skip 1 jättää tarkoituksella käsittelemättä uusimman (aktiivisen) lokitiedoston.
  • Tämä tarkoittaa, että nykyiset tiedot viedään vain rolloverin jälkeen; matalan volyymin DC:illä aktiivinen loki voi jäädä käsittelemättä yli päivän.
  • Koska Convert-DNSDebugLogFile oletuksena asettaa -OutputFile arvoksi ”sama kansio, sama nimi, .csv”, tulosteet sijoittuvat *.log-tiedostojen viereen.
  • -CompressOutput-asetuksella jokainen käsitelty loki tuottaa *.zip-tiedoston ja väliaikaiset CSV:t poistetaan.
  • Ellet arkistoi tai poista käsiteltyjä *.log-tiedostoja, myöhemmät ajot käsittelevät kaikki ei-aktiiviset lokit uudelleen.
  • Tehtävä heittää virheen, jos $Error.Count -gt 0, merkiksi epäonnistuneesta suorituksesta.

5) Keskitetty keräys

Vaihtoehdot (valitse yksi):

  • Tiedostojakojen keräys: DC kirjoittaa (tai kopioi) C:\Administration\Logs\DNSServer\*.zip polkuun \\fileserver\share\dns\$env:COMPUTERNAME\... (myönnä jakamisoikeudet ja NTFS-oikeudet DC:n tietokoneen tileille tai Domain Controllers -ryhmälle, jos tehtävä ajetaan SYSTEM-tilillä)
  • Haku-malli: keskitetty työ lukee \\dc\C$\Administration\Logs\DNSServer\*.zip (vähiten suositeltu; vaatii hallintajakamiset)
  • Agentin välitys: SIEM / lokiputki, joka lähettää *.zip-tulosteet

Käyttöönottokäytännöt

  • Vähimmän oikeuden periaate: tehtävät ajetaan SYSTEM-tilillä; varmista, että paikalliset kansiot ovat kirjoitettavissa ja että UNC-kohteet myöntävät pääsyn tietokoneen tilille, jos niitä käytetään.
  • Allekirjoituspolitiikka: molemmat tehtävät käyttävät -ExecutionPolicy RemoteSigned; allekirjoita tai poista estot käyttöön otetusta skriptistä ja moduulista politiikkasi mukaisesti.
  • Levyn käyttö: -CompressOutput auttaa merkittävästi, mutta tämä työnkulku ei poista lähdelokeja; suunnittele säilytys ja siivous.
  • Uudelleenkäsittelykäytös: ellet arkistoi tai poista käsiteltyjä lokitiedostoja, muunnostehtävä käsittelee jokaisen ei-aktiivisen *.log-tiedoston uudelleen myöhemmillä ajoilla. Tämä on yksinkertaista ja luotettavaa, mutta voi ylikirjoittaa tulosteita ja aiheuttaa kaksoiskirjauksia, jos kerääjä ei poista duplikaatteja.
  • Usean DC:n yhdistäminen: -ComputerName $env:COMPUTERNAME sisältyy, jotta yhdistetyistä aineistoista säilyy jäljitettävyys.
  • Validointi: otsikkotarkistus on edelleen käytössä, koska tehtävä ei käytä -SkipHeaderValidation (suositeltavaa).

Vahvista ja mukauta (ZIP-arkiston avulla)

Käytä ZIP-arkistoa viiteimplementaationa ja sovita seuraavat asiat ympäristöösi:

  • Kohdealue: mitkä DC:t / OU:t saavat politiikan
  • Suoritusidentiteetti: varmista, että molemmat ajastetut tehtävät käyttävät tarkoitettua kirjautumistyyppiä (S4U vs InteractiveToken) tai yhdenmukaista ne standardiisi
  • Kansioiden luonti: päätä, luodaanko C:\Administration\Scripts ja C:\Administration\Logs\DNSServer muualla valmiiksi vai luodaanko ne lisä-GPP-kohteilla
  • Polut: varmista, että C:\Administration\Scripts ja C:\Administration\Logs\DNSServer vastaavat käytäntöjäsi
  • Säilytys: päätä, säilytetäänkö raakalokitus ja kuinka pitkään (erityisesti jos otat käyttöön siivousvaihtoehdot)
  • Keräys: varmista, minne CSV/ZIP-tulosteet kirjoitetaan ja miten ne kerätään keskitetysti

Jos haluat vahvistaa tarkan GPO-konfiguraation ilman tuontia, tämän repositorion auktoritatiiviset lähteet ovat:

3 - SQL Server -tietokannan turvallisuusanalyysityönkulku

Muunna DNS-vianmäärityslokit CSV-muotoon DNSServer.DebugLogParserilla, tuo tulos SQL Serveriin ja suorita yksinkertainen havaitsemiskysely epäilyttävälle TXT-tietueiden toiminnalle.

Tässä esimerkissä näytetään käytännön työnkulku turvallisuusanalytiikkaan: jäsennä DNS-vianmääritysloki Convert-DNSDebugLogFile-komennolla, tuo luotu CSV SQL Serveriin ja suorita kysely, joka korostaa epätavallisen suuria TXT-tietueiden hakumääriä.

Parhaan yhteensopivuuden varmistamiseksi tämä esimerkki kirjoittaa aikaleimat ISO-tyyppisessä muodossa käyttämällä -OutputCulture 'sv-SE'.

Tarvittavat moduulit

Tämä esimerkki käyttää seuraavia PowerShell-moduuleja:

  • DNSServer.DebugLogParser
  • SqlServer

Asenna ne tarvittaessa:

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

Tilanne

Käytä tätä työnkulkua, kun haluat siirtää jäsenneltyjä DNS-vianmäärityslokitietoja SQL Serveriin, jotta voit:

  • hakea suuria tietoaineistoja tehokkaasti
  • rakentaa toistettavia havaitsemiskyselyjä
  • korreloida toimintaa useiden DNS-palvelimien välillä
  • säilyttää normalisoidut tiedot myöhempää tutkimusta varten

Muunnosvaiheen tulos

Convert-DNSDebugLogFile ei kirjoita suoraan SQL Serveriin. Se luo ensin CSV-tiedoston. Tämä CSV-tiedosto on tietoaineisto, joka tuodaan tietokantaan.

Tässä esimerkissä:

  • syöttöloki: C:\Administration\Logs\DNS\dns.log
  • luotu CSV: C:\Administration\Logs\DNS\dns.csv
  • kohdetaulu: dbo.DNSQueries

Luo kohdetietokanta

Suorita seuraava lause SQL Serverissä kerran luodaksesi kohdetietokannan.

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;

Muunna loki ja tuo CSV

Seuraava PowerShell-esimerkki suorittaa koko työnkulun:

  1. tuo tarvittavat moduulit
  2. muuntaa DNS-vianmäärityslokin CSV-muotoon
  3. lataa luodun CSV:n
  4. tuo rivit eräajona SQL Serveriin
# 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 "The generated CSV file '$csvPath' does not contain any rows."
}

$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()
}

Kysely epäilyttävälle TXT-tietueiden toiminnalle

Kun tiedot ovat SQL Serverissä, voit hakea asiakkaita, jotka tekevät epätavallisen suuren määrän TXT-tietuehakukyselyjä.

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;

Jos haluat suorittaa kyselyn PowerShellistä, käytä Invoke-Sqlcmd-komentoa SqlServer-moduulista:

$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

Miksi TXT-kyselyt ovat kiinnostavia

TXT-tietueiden hakujen suuri määrä voi olla tarkastelun arvoista, koska se voi viitata:

  • DNS-tunnelointiin
  • tietojen ulosvuotoon DNS:n kautta
  • TXT-tietueiden väärinkäyttöön haittaohjelmien tai työkalujen toimesta
  • epätavallisen meluisiin tai virheellisesti konfiguroituihin asiakkaisiin

Tämä kysely on vain lähtökohta. Tuotantoympäristössä sinun tulisi säätää kynnysarvoa ja lisätä suodattimia, jotka sopivat omaan ympäristöösi.

Käyttöhuomautuksia

  • Import-Csv lukee koko tiedoston muistiin. Erittäin suurten lokitiedostojen kanssa kannattaa harkita virtaavaa käsittelyä täyden DataTablen rakentamisen sijaan.
  • Säilytä -ComputerName muunnosvaiheessa, jotta tietueet voidaan edelleen yhdistää lähteeseen keskitetyn tuonnin jälkeen.
  • Käytä yhtenäistä erotinta ja kulttuuria vienti- ja tuontivaiheissa.
  • Varmista säilytys, indeksointi ja käyttöoikeudet SQL Serverissä ennen tämän työnkulun käyttämistä pitkäaikaiseen tallennukseen.