Version 1.2.1.0 of the documentation is no longer actively maintained. The site that you are currently viewing is an archived snapshot.
SQL Server -tietokannan turvallisuusanalyysityönkulku
For AI agents: a documentation index is available at /llms.txt; a markdown version of this page is available at /v1.2.1.0/fi/docs/examples/security-analysis-sql/index.md.
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.DebugLogParserSqlServer
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:
- tuo tarvittavat moduulit
- muuntaa DNS-vianmäärityslokin CSV-muotoon
- lataa luodun CSV:n
- 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-Csvlukee koko tiedoston muistiin. Erittäin suurten lokitiedostojen kanssa kannattaa harkita virtaavaa käsittelyä täydenDataTablen rakentamisen sijaan.- Säilytä
-ComputerNamemuunnosvaiheessa, 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.