Аудит попыток аутентификации в Windows по IP адресам запросов

Оглавление
  1. 1. Введение
  2. 2. Раздел для обычного пользователя
  3. 3. Раздел для разработчика
  4. 4. Раздел для администратора
  5. 5. Глоссарий терминов

1. Введение

1.1. Назначение документа

Данное руководство предоставляет исчерпывающую информацию о PowerShell-скрипте Get-Windows-Security-Events-By-IP, предназначенном для анализа событий безопасности Windows по IP-адресам. Документ разделен на три целевые аудитории с соответствующими уровнями сложности.

1.2. Целевые аудитории

  • Обычные пользователи — базовое использование для личных нужд
  • Разработчики — интеграция и расширение функциональности
  • Администраторы — развертывание в корпоративной среде

1.3. Структура документа

Каждый раздел содержит постепенное погружение в тему, начиная с основ и заканчивая экспертными методиками. Все разделы пронумерованы для удобства навигации и перекрестных ссылок.


2. Раздел для обычного пользователя

2.1. Базовые понятия и терминология

2.1.1. Что такое события безопасности Windows?

События безопасности Windows — это записи в системном журнале, которые фиксируют различные действия, происходящие в операционной системе. Каждое событие содержит информацию о том, что произошло, когда это случилось, и какие учетные данные были использованы.

2.1.2. Для чего нужно анализировать события по IP?

Анализ событий по IP-адресам позволяет:

  • Выявлять попытки несанкционированного доступа
  • Отслеживать подозрительную активность в сети
  • Формировать доказательную базу для жалоб провайдерам
  • Понимать источники угроз для вашей системы

2.1.3. Основные типы событий безопасности

  • 4624 — Успешный вход в систему
  • 4625 — Неудачная попытка входа
  • 4648 — Вход с явно указанными учетными данными
  • 4672 — Присвоение специальных привилегий

2.2. Установка и настройка

2.2.1. Системные требования

# Проверка совместимости системы
$systemInfo = Get-ComputerInfo
$requiredPSVersion = "5.1"
$currentPSVersion = $PSVersionTable.PSVersion

Write-Host "Текущая версия PowerShell: $currentPSVersion"
Write-Host "Требуемая версия: $requiredPSVersion"

2.2.2. Скачивание скрипта

# Метод 1: Прямое скачивание
Invoke-WebRequest -Uri "https://raw.githubusercontent.com/paulmann/Get-Windows-Security-Events-By-IP/main/Get-SecurityEventsByIP.ps1" -OutFile "Get-SecurityEventsByIP.ps1"

# Метод 2: Клонирование репозитория
git clone https://github.com/paulmann/Get-Windows-Security-Events-By-IP.git
cd Get-Windows-Security-Events-By-IP

2.2.3. Настройка политики выполнения

# Проверка текущей политики
Get-ExecutionPolicy

# Временное разрешение выполнения
Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process

# Или постоянное изменение (требует прав администратора)
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

2.3. Базовое использование

2.3.1. Первый запуск скрипта

# Простейший вызов для одного IP-адреса
.\Get-SecurityEventsByIP.ps1 -IPAddress "192.168.1.100"

# Пример вывода
# TimeCreated     : 2024-01-15 14:30:22
# EventID        : 4625
# IPAddress      : 192.168.1.100
# Computer       : DESKTOP-USER123
# Message        : Неудачная попытка входа

2.3.2. Понимание выходных данных

Скрипт возвращает таблицу со следующими колонками:

  • TimeCreated — Время создания события
  • EventID — Идентификатор события
  • IPAddress — IP-адрес источника
  • Computer — Имя компьютера
  • Message — Текст сообщения события

2.3.3. Фильтрация по времени

# Поиск событий за последние 24 часа
.\Get-SecurityEventsByIP.ps1 -IPAddress "10.0.0.5" -LastHours 24

# Поиск за конкретный период
.\Get-SecurityEventsByIP.ps1 -IPAddress "10.0.0.5" -StartTime "2024-01-01" -EndTime "2024-01-15"

2.4. Практические сценарии использования

2.4.1. Мониторинг подозрительных IP-адресов

# Ежедневная проверка известных подозрительных IP
$suspiciousIPs = @("203.0.113.45", "198.51.100.23", "192.0.2.156")
foreach ($ip in $suspiciousIPs) {
    .\Get-SecurityEventsByIP.ps1 -IPAddress $ip -LastHours 24
}

2.4.2. Создание простых отчетов

# Экспорт результатов в CSV
.\Get-SecurityEventsByIP.ps1 -IPAddress "192.168.1.100" -LastDays 7 -OutputFormat CSV -OutputPath "C:\Reports\security_report.csv"

# Просмотр отчета
Import-Csv "C:\Reports\security_report.csv" | Format-Table

2.4.3. Автоматизация регулярных проверок

# Создание планировщика задач для ежедневной проверки
$Action = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-File `"C:\Scripts\Get-SecurityEventsByIP.ps1`" -IPAddress `"192.168.1.0/24`" -OutputPath `"C:\Reports\DailyCheck.csv`""
$Trigger = New-ScheduledTaskTrigger -Daily -At "08:00"
Register-ScheduledTask -TaskName "Daily Security Check" -Action $Action -Trigger $Trigger

2.5. Решение проблем

2.5.1. Ошибки доступа

# Проверка прав администратора
if (-NOT ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) {
    Write-Host "Запустите скрипт от имени администратора" -ForegroundColor Red
    exit
}

2.5.2. Проблемы с выводом

# Включение подробного вывода для диагностики
.\Get-SecurityEventsByIP.ps1 -IPAddress "192.168.1.100" -Verbose

# Сохранение лога выполнения
Start-Transcript -Path "C:\Logs\script_log.txt"
.\Get-SecurityEventsByIP.ps1 -IPAddress "192.168.1.100"
Stop-Transcript

3. Раздел для разработчика

3.1. Архитектура скрипта

3.1.1. Обзор структуры кода

# Основные функциональные блоки скрипта
# 1. Блок параметров и валидации
# 2. Функции логирования и обработки ошибок
# 3. Основная логика запроса событий
# 4. Функции форматирования вывода
# 5. Вспомогательные утилиты

3.1.2. Ключевые функции и модули

  • Get-SecurityEvents — Основная функция запроса событий
  • ConvertTo-ReportFormat — Преобразование в различные форматы
  • Send-AbuseReport — Отправка отчетов о нарушении
  • New-EventFilter — Создание фильтров для событий

3.2. Расширение функциональности

3.2.1. Добавление новых форматов вывода

function Export-ToHTML {
    param(
        [Parameter(Mandatory=$true)]
        [PSCustomObject[]]$Events,

        [Parameter(Mandatory=$true)]
        [string]$OutputPath
    )

    $htmlHeader = @"
<!DOCTYPE html>
<html>
<head>
    <title>Security Events Report</title>
    <style>
        table { border-collapse: collapse; width: 100%; }
        th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
        th { background-color: #f2f2f2; }
        tr:nth-child(even) { background-color: #f9f9f9; }
    </style>
</head>
<body>
    <h1>Security Events Report</h1>
    <table>
        <tr>
            <th>Time</th>
            <th>Event ID</th>
            <th>IP Address</th>
            <th>Computer</th>
            <th>Message</th>
        </tr>
"@

    $htmlRows = $Events | ForEach-Object {
        @"
        <tr>
            <td>$($_.TimeCreated)</td>
            <td>$($_.EventID)</td>
            <td>$($_.IPAddress)</td>
            <td>$($_.Computer)</td>
            <td>$($_.Message)</td>
        </tr>
"@
    }

    $htmlFooter = @"
    </table>
    <p>Report generated on: $(Get-Date)</p>
</body>
</html>
"@

    $htmlHeader + ($htmlRows -join "`n") + $htmlFooter | Out-File -FilePath $OutputPath -Encoding UTF8
}

3.2.2. Интеграция с внешними API

# Интеграция с VirusTotal для проверки IP
function Get-VirusTotalIPReport {
    param([string]$IPAddress, [string]$ApiKey)

    $uri = "https://www.virustotal.com/api/v3/ip_addresses/$IPAddress"
    $headers = @{ "x-apikey" = $ApiKey }

    try {
        $response = Invoke-RestMethod -Uri $uri -Headers $headers
        return [PSCustomObject]@{
            IPAddress = $IPAddress
            Malicious = $response.data.attributes.last_analysis_stats.malicious
            Suspicious = $response.data.attributes.last_analysis_stats.suspicious
            Reputation = $response.data.attributes.reputation
        }
    }
    catch {
        Write-Warning "Ошибка запроса к VirusTotal: $($_.Exception.Message)"
        return $null
    }
}

# Использование в основном скрипте
$events = .\Get-SecurityEventsByIP.ps1 -IPAddress "192.168.1.100" -LastHours 24
$vtReport = Get-VirusTotalIPReport -IPAddress "192.168.1.100" -ApiKey $env:VT_API_KEY

3.2.3. Создание пользовательских фильтров

# Расширенный фильтр для обнаружения атак brute force
function Get-BruteForceAttempts {
    param(
        [string]$IPAddress,
        [int]$FailedAttemptThreshold = 10,
        [int]$TimeWindowMinutes = 60
    )

    $startTime = (Get-Date).AddMinutes(-$TimeWindowMinutes)

    $events = Get-SecurityEventsByIP -IPAddress $IPAddress -StartTime $startTime

    $failedLogons = $events | Where-Object { 
        $_.EventID -eq 4625 -and 
        $_.LogonType -in @(2, 3, 10)  # Interactive, Network, RemoteInteractive
    }

    if ($failedLogons.Count -ge $FailedAttemptThreshold) {
        return [PSCustomObject]@{
            IPAddress = $IPAddress
            FailedAttempts = $failedLogons.Count
            TimeWindow = "$TimeWindowMinutes minutes"
            FirstAttempt = ($failedLogons | Sort-Object TimeCreated | Select-Object -First 1).TimeCreated
            LastAttempt = ($failedLogons | Sort-Object TimeCreated | Select-Object -Last 1).TimeCreated
            Status = "BRUTE_FORCE_DETECTED"
        }
    }

    return $null
}

3.3. Тестирование и отладка

3.3.1. Создание unit-тестов

# Pester тесты для функций скрипта
Describe "Get-SecurityEventsByIP Unit Tests" {
    BeforeAll {
        . .\Get-SecurityEventsByIP.ps1
    }

    It "Should validate IP address format" {
        { Get-SecurityEventsByIP -IPAddress "invalid" } | Should -Throw
    }

    It "Should accept valid IP addresses" {
        { Get-SecurityEventsByIP -IPAddress "192.168.1.1" } | Should -Not -Throw
    }

    It "Should process CIDR notation" {
        $results = Get-SecurityEventsByIP -IPAddress "192.168.1.0/30" -WhatIf
        $results | Should -Not -BeNullOrEmpty
    }
}

3.3.2. Профилирование производительности

# Измерение времени выполнения различных операций
function Measure-ScriptPerformance {
    param([string]$IPAddress)

    $timeMeasurements = @()

    # Тест базового запроса
    $stopwatch = [System.Diagnostics.Stopwatch]::StartNew()
    $events = Get-SecurityEventsByIP -IPAddress $IPAddress -LastHours 1
    $stopwatch.Stop()
    $timeMeasurements += [PSCustomObject]@{
        Operation = "BasicQuery-1h"
        Duration = $stopwatch.Elapsed
        EventsCount = $events.Count
    }

    # Тест расширенного запроса
    $stopwatch.Restart()
    $events = Get-SecurityEventsByIP -IPAddress $IPAddress -LastDays 7 -Detailed
    $stopwatch.Stop()
    $timeMeasurements += [PSCustomObject]@{
        Operation = "DetailedQuery-7d"
        Duration = $stopwatch.Elapsed
        EventsCount = $events.Count
    }

    return $timeMeasurements
}

3.4. Интеграция с другими системами

3.4.1. REST API интерфейс

# Создание простого REST API для скрипта
function Start-SecurityEventsAPI {
    param([int]$Port = 8080)

    $listener = New-Object System.Net.HttpListener
    $listener.Prefixes.Add("http://localhost:$Port/")
    $listener.Start()

    Write-Host "Security Events API listening on port $Port"

    while ($listener.IsListening) {
        $context = $listener.GetContext()
        $request = $context.Request
        $response = $context.Response

        try {
            if ($request.HttpMethod -eq "GET" -and $request.Url.LocalPath -eq "/events") {
                $ip = $request.QueryString["ip"]
                $hours = [int]($request.QueryString["hours"] ?? "24")

                $events = Get-SecurityEventsByIP -IPAddress $ip -LastHours $hours -OutputFormat JSON

                $buffer = [System.Text.Encoding]::UTF8.GetBytes($events)
                $response.ContentLength64 = $buffer.Length
                $response.OutputStream.Write($buffer, 0, $buffer.Length)
            }
        }
        catch {
            $errorBuffer = [System.Text.Encoding]::UTF8.GetBytes("{ 'error': '$($_.Exception.Message)' }")
            $response.ContentLength64 = $errorBuffer.Length
            $response.OutputStream.Write($errorBuffer, 0, $errorBuffer.Length)
        }
        finally {
            $response.Close()
        }
    }
}

3.4.2. База данных для хранения результатов

# Сохранение результатов в SQLite базу данных
function Save-EventsToDatabase {
    param(
        [PSCustomObject[]]$Events,
        [string]$DatabasePath = "C:\Data\SecurityEvents.db"
    )

    # Создание подключения к SQLite
    Add-Type -Path "System.Data.SQLite.dll"
    $connection = New-Object System.Data.SQLite.SQLiteConnection("Data Source=$DatabasePath")
    $connection.Open()

    # Создание таблицы если не существует
    $createTableCommand = $connection.CreateCommand()
    $createTableCommand.CommandText = @"
CREATE TABLE IF NOT EXISTS SecurityEvents (
    Id INTEGER PRIMARY KEY AUTOINCREMENT,
    TimeCreated DATETIME,
    EventID INTEGER,
    IPAddress TEXT,
    ComputerName TEXT,
    LogonType INTEGER,
    SubjectUserName TEXT,
    CreatedAt DATETIME DEFAULT CURRENT_TIMESTAMP
)
"@
    $createTableCommand.ExecuteNonQuery()

    # Вставка событий
    foreach ($event in $Events) {
        $insertCommand = $connection.CreateCommand()
        $insertCommand.CommandText = @"
INSERT INTO SecurityEvents (TimeCreated, EventID, IPAddress, ComputerName, LogonType, SubjectUserName)
VALUES (@time, @eventId, @ip, @computer, @logonType, @user)
"@
        $insertCommand.Parameters.AddWithValue("@time", $event.TimeCreated)
        $insertCommand.Parameters.AddWithValue("@eventId", $event.EventID)
        $insertCommand.Parameters.AddWithValue("@ip", $event.IPAddress)
        $insertCommand.Parameters.AddWithValue("@computer", $event.Computer)
        $insertCommand.Parameters.AddWithValue("@logonType", $event.LogonType)
        $insertCommand.Parameters.AddWithValue("@user", $event.SubjectUserName)

        $insertCommand.ExecuteNonQuery()
    }

    $connection.Close()
}

4. Раздел для администратора

4.1. Корпоративное развертывание

4.1.1. Требования к инфраструктуре

# Скрипт проверки системных требований для предприятия
function Test-EnterpriseRequirements {
    $requirements = @()

    # Проверка версии PowerShell
    $psVersion = $PSVersionTable.PSVersion
    $requirements += [PSCustomObject]@{
        Component = "PowerShell"
        Required = "5.1+"
        Current = $psVersion.ToString()
        Status = if ($psVersion -ge [version]"5.1") { "PASS" } else { "FAIL" }
    }

    # Проверка доступности журналов событий
    $eventLogs = Get-WinEvent -ListLog "Security" -ErrorAction SilentlyContinue
    $requirements += [PSCustomObject]@{
        Component = "Security Event Log"
        Required = "Available"
        Current = if ($eventLogs) { "Available" } else { "Not Available" }
        Status = if ($eventLogs) { "PASS" } else { "FAIL" }
    }

    # Проверка прав администратора
    $isAdmin = ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")
    $requirements += [PSCustomObject]@{
        Component = "Administrator Rights"
        Required = "True"
        Current = $isAdmin.ToString()
        Status = if ($isAdmin) { "PASS" } else { "FAIL" }
    }

    return $requirements
}

4.1.2. Массовое развертывание через Group Policy

# Скрипт развертывания для доменной среды
function Deploy-SecurityScriptViaGPO {
    param(
        [string[]]$ComputerNames,
        [string]$ScriptSourcePath,
        [string]$DomainController = "DC01"
    )

    $deploymentResults = @()

    foreach ($computer in $ComputerNames) {
        try {
            # Проверка доступности компьютера
            if (Test-Connection -ComputerName $computer -Count 1 -Quiet) {
                # Копирование скрипта в общую сетевую папку
                $destPath = "\\$computer\C$\Program Files\SecurityTools\"
                New-Item -Path $destPath -ItemType Directory -Force | Out-Null
                Copy-Item -Path $ScriptSourcePath -Destination $destPath -Force

                # Создание планировщика задач
                $schTaskScript = @"
schtasks /create /tn "Enterprise Security Scan" /tr "powershell.exe -File `"C:\Program Files\SecurityTools\Get-SecurityEventsByIP.ps1`" -IPAddress `"10.0.0.0/8`" -OutputPath `"C:\Reports\SecurityScan.csv`"" /sc daily /st 02:00 /ru "SYSTEM" /f
"@
                Invoke-Command -ComputerName $computer -ScriptBlock {
                    param($TaskScript)
                    cmd.exe /c $TaskScript
                } -ArgumentList $schTaskScript

                $deploymentResults += [PSCustomObject]@{
                    Computer = $computer
                    Status = "SUCCESS"
                    Message = "Script deployed successfully"
                }
            }
            else {
                $deploymentResults += [PSCustomObject]@{
                    Computer = $computer
                    Status = "FAILED"
                    Message = "Computer unreachable"
                }
            }
        }
        catch {
            $deploymentResults += [PSCustomObject]@{
                Computer = $computer
                Status = "FAILED"
                Message = $_.Exception.Message
            }
        }
    }

    return $deploymentResults
}

4.2. Мониторинг и отчетность

4.2.1. Интеграция с SIEM системами

# Экспорт событий в формат совместимый с Splunk
function Export-ToSplunk {
    param(
        [PSCustomObject[]]$Events,
        [string]$SplunkHost,
        [int]$SplunkPort = 8088,
        [string]$Token
    )

    $splunkEvents = $Events | ForEach-Object {
        @{
            time = [math]::Round((Get-Date $_.TimeCreated -UFormat %s) * 1000)
            host = $_.Computer
            source = "Get-SecurityEventsByIP"
            sourcetype = "windows:security:events"
            event = $_
        }
    }

    $uri = "https://$SplunkHost`:$SplunkPort/services/collector"
    $headers = @{
        "Authorization" = "Splunk $Token"
        "Content-Type" = "application/json"
    }

    # Отправка пачками по 100 событий
    for ($i = 0; $i -lt $splunkEvents.Count; $i += 100) {
        $batch = $splunkEvents[$i..($i + 99)] | Where-Object { $_ }
        $body = ($batch | ForEach-Object { @{ event = $_ } | ConvertTo-Json -Depth 5 }) -join "`n"

        try {
            Invoke-RestMethod -Uri $uri -Method Post -Headers $headers -Body $body
            Write-Host "Sent batch $($i/100 + 1) of $( [math]::Ceiling($splunkEvents.Count/100) )" -ForegroundColor Green
        }
        catch {
            Write-Error "Failed to send batch: $($_.Exception.Message)"
        }
    }
}

4.2.2. Создание дашбордов для мониторинга

# Генерация HTML дашборда с статистикой безопасности
function New-SecurityDashboard {
    param(
        [string[]]$IPAddresses,
        [int]$Days = 30,
        [string]$OutputPath = "C:\Dashboards\SecurityDashboard.html"
    )

    $events = @()
    foreach ($ip in $IPAddresses) {
        $events += Get-SecurityEventsByIP -IPAddress $ip -LastDays $Days
    }

    # Статистика по типам событий
    $eventStats = $events | Group-Object EventID | ForEach-Object {
        [PSCustomObject]@{
            EventID = $_.Name
            Count = $_.Count
            Description = (Get-EventDescription -EventID $_.Name)
        }
    }

    # Статистика по IP-адресам
    $ipStats = $events | Group-Object IPAddress | ForEach-Object {
        [PSCustomObject]@{
            IPAddress = $_.Name
            EventCount = $_.Count
            FirstSeen = ($_.Group | Sort-Object TimeCreated | Select-Object -First 1).TimeCreated
            LastSeen = ($_.Group | Sort-Object TimeCreated | Select-Object -Last 1).TimeCreated
        }
    }

    # Генерация HTML
    $dashboardHTML = @"
<!DOCTYPE html>
<html>
<head>
    <title>Enterprise Security Dashboard</title>
    <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
    <style>
        .dashboard { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; }
        .card { border: 1px solid #ddd; padding: 15px; border-radius: 5px; }
        .critical { border-left: 5px solid #dc3545; }
        .warning { border-left: 5px solid #ffc107; }
    </style>
</head>
<body>
    <h1>Security Events Dashboard</h1>
    <div class="dashboard">
        <div class="card">
            <h3>Event Statistics</h3>
            <canvas id="eventChart" width="400" height="200"></canvas>
        </div>
        <div class="card">
            <h3>Top IP Addresses</h3>
            <canvas id="ipChart" width="400" height="200"></canvas>
        </div>
    </div>

    <script>
        const eventCtx = document.getElementById('eventChart').getContext('2d');
        new Chart(eventCtx, {
            type: 'pie',
            data: {
                labels: [$(($eventStats | ForEach-Object { "'$($_.EventID): $($_.Description)'" }) -join ',')],
                datasets: [{
                    data: [$(($eventStats | ForEach-Object { $_.Count }) -join ',')],
                    backgroundColor: ['#ff6384', '#36a2eb', '#cc65fe', '#ffce56']
                }]
            }
        });
    </script>
</body>
</html>
"@

    $dashboardHTML | Out-File -FilePath $OutputPath -Encoding UTF8
    Write-Host "Dashboard generated: $OutputPath"
}

4.3. Безопасность и соответствие требованиям

4.3.1. Настройка аудита в соответствии с стандартами

# Конфигурация политик аудита для соответствия NIST/ISO 27001
function Set-NISTComplianceAuditing {
    # Включение необходимых подкатегорий аудита
    $auditSubcategories = @(
        "Audit Logon",
        "Audit Logoff", 
        "Audit Account Lockout",
        "Audit IPsec Extended Mode",
        "Audit IPsec Main Mode",
        "Audit Other Logon/Logoff Events",
        "Audit Special Logon"
    )

    foreach ($subcategory in $auditSubcategories) {
        try {
            auditpol /set /subcategory:"$subcategory" /success:enable /failure:enable
            Write-Host "Enabled auditing for: $subcategory" -ForegroundColor Green
        }
        catch {
            Write-Warning "Failed to enable auditing for: $subcategory"
        }
    }

    # Проверка текущих настроек
    $currentAuditSettings = auditpol /get /category:* | Out-String
    return $currentAuditSettings
}

4.3.2. Создание отчетов для compliance

# Генерация отчетов для PCI-DSS, SOX, GDPR
function New-ComplianceReport {
    param(
        [string]$ComplianceStandard,
        [datetime]$StartDate,
        [datetime]$EndDate
    )

    switch ($ComplianceStandard) {
        "PCI-DSS" {
            # Требование 10: Трек и мониторинг доступа
            $events = Get-SecurityEventsByIP -StartTime $StartDate -EndTime $EndDate -EventID @(4624, 4625, 4634, 4647)
            $report = [PSCustomObject]@{
                Standard = "PCI-DSS"
                Requirement = "10.2.1"
                Description = "Audit trails for all system components"
                EventsAnalyzed = $events.Count
                UniqueIPs = ($events | Group-Object IPAddress).Count
                FailedLogons = ($events | Where-Object EventID -eq 4625).Count
                ComplianceStatus = if ($events.Count -gt 0) { "COMPLIANT" } else { "NON-COMPLIANT" }
            }
        }
        "GDPR" {
            # Статья 32: Безопасность обработки
            $events = Get-SecurityEventsByIP -StartTime $StartDate -EndTime $EndDate -EventID @(4625, 4672, 4720, 4732)
            $report = [PSCustomObject]@{
                Standard = "GDPR"
                Article = "32"
                Description = "Security of processing"
                UnauthorizedAccessAttempts = ($events | Where-Object EventID -eq 4625).Count
                PrivilegeChanges = ($events | Where-Object EventID -in @(4672, 4720, 4732)).Count
                ComplianceStatus = "REVIEW_REQUIRED"
            }
        }
    }

    return $report
}

4.4. Расширенные сценарии реагирования на инциденты

4.4.1. Автоматическое блокирование IP-адресов

# Интеграция с Windows Firewall для автоматического блокирования
function Add-FirewallBlock {
    param(
        [string[]]$IPAddresses,
        [string]$RuleName = "AutoBlocked_$(Get-Date -Format 'yyyyMMdd_HHmmss')",
        [string]$Duration = "24:00:00"  # 24 hours
    )

    foreach ($ip in $IPAddresses) {
        # Создание правила блокировки входящего трафика
        $blockRule = @"
netsh advfirewall firewall add rule name="$RuleName" dir=in action=block remoteip="$ip" protocol=any enable=yes
"@
        Invoke-Expression $blockRule

        # Запланированное удаление правила через указанное время
        $removeScript = @"
Remove-NetFirewallRule -Name "$RuleName" -ErrorAction SilentlyContinue
"@
        $removeScript | Out-File "C:\Scripts\RemoveBlock_$RuleName.ps1"

        $triggerTime = (Get-Date).AddHours(24)
        Register-ScheduledTask -TaskName "RemoveBlock_$RuleName" `
            -Action (New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-File `"C:\Scripts\RemoveBlock_$RuleName.ps1`"") `
            -Trigger (New-ScheduledTaskTrigger -Once -At $triggerTime) `
            -RunLevel Highest
    }

    Write-Host "Blocked $($IPAddresses.Count) IP addresses for $Duration" -ForegroundColor Yellow
}

4.4.2. Создание плейбуков для инцидентов

# Автоматизированный плейбук реагирования на инциденты
function Start-IncidentResponsePlaybook {
    param(
        [string]$IncidentIP,
        [string]$Severity = "Medium"
    )

    Write-Host "Starting incident response for IP: $IncidentIP" -ForegroundColor Red

    # Фаза 1: Сбор информации
    $events = Get-SecurityEventsByIP -IPAddress $IncidentIP -LastDays 7 -Detailed
    $affectedSystems = $events | Group-Object Computer | Select-Object -ExpandProperty Name

    # Фаза 2: Содержание
    if ($Severity -in @("High", "Critical")) {
        Add-FirewallBlock -IPAddresses @($IncidentIP) -Duration "168:00:00"  # 1 week
    }

    # Фаза 3: Анализ
    $analysisReport = [PSCustomObject]@{
        IncidentIP = $IncidentIP
        FirstSeen = ($events | Sort-Object TimeCreated | Select-Object -First 1).TimeCreated
        LastSeen = ($events | Sort-Object TimeCreated | Select-Object -Last 1).TimeCreated
        TotalEvents = $events.Count
        AffectedSystems = $affectedSystems
        EventTypes = ($events | Group-Object EventID | ForEach-Object { "$($_.Name) ($($_.Count))" }) -join ", "
        RecommendedActions = @()
    }

    # Определение рекомендуемых действий на основе шаблонов атак
    if (($events | Where-Object EventID -eq 4625).Count -gt 10) {
        $analysisReport.RecommendedActions += "Reset passwords for accounts targeted by brute force"
    }

    if ($events | Where-Object EventID -in @(4720, 4722, 4728)) {
        $analysisReport.RecommendedActions += "Review account and group membership changes"
    }

    return $analysisReport
}

5. Глоссарий терминов

5.1. Термины безопасности

Event ID
Уникальный числовой идентификатор, присваиваемый каждому событию в журнале Windows. Например, Event ID 4625 указывает на неудачную попытку входа в систему.

IP Address
Уникальный числовой идентификатор устройства в компьютерной сети. В контексте безопасности используется для отслеживания источника подозрительной активности.

Brute Force Attack
Атака методом грубой силы, при которой злоумышленник пытается подобрать учетные данные путем многократных попыток входа.

SIEM
(Security Information and Event Management) — система для сбора, анализа и корреляции событий безопасности из различных источников в организации.

5.2. Технические термины

PowerShell Cmdlet
Специальная команда в PowerShell, выполняющая определенную функцию. Cmdlets следуют соглашению об именовании «Verb-Noun».

WinRM
(Windows Remote Management) — протокол управления, позволяющий выполнять команды PowerShell на удаленных системах.

XPath Filter
Язык запросов для выбора узлов из XML-документа. Используется в Windows для фильтрации событий в журнале.

CIDR Notation
(Classless Inter-Domain Routing) — метод указания IP-адресов и их подсетей. Например, 192.168.1.0/24 представляет диапазон из 256 адресов.

5.3. Термины соответствия

PCI DSS
(Payment Card Industry Data Security Standard) — стандарт безопасности данных индустрии платежных карт, требующий строгого контроля доступа и мониторинга.

GDPR
(General Data Protection Regulation) — Общий регламент по защите данных, регулирующий обработку персональных данных в ЕС.

NIST Framework
Фреймворк кибербезопасности Национального института стандартов и технологий США, предоставляющий лучшие практики для управления киберрисками.

Compliance Audit
Процесс проверки соответствия системы или организации установленным стандартам и регуляторным требованиям.


Последнее обновление документа: 20 Октября 2025
Версия документа: 3.0

Добавить комментарий

Разработка и продвижение сайтов webseed.ru
Прокрутить вверх