Введение: зачем нужен аудит безопасности рабочих станций
Рабочая станция с правами локального администратора, отключенным антивирусом или устаревшими обновлениями - это готовая точка входа для атаки. Злоумышленник, скомпрометировавший одну машину, получает плацдарм для бокового перемещения по домену, доступа к файловым ресурсам и попыток повышения привилегий до уровня администратора домена. Аудит безопасности рабочих станций в Active Directory выявляет такие машины до того, как ими воспользуются.
Полный аудит включает четыре ключевые области: анализ действующих GPO-политик, оценку локальных привилегий пользователей и групп, контроль состояния антивирусной защиты и проверку актуальности системных обновлений. Дополнительно проверяются брандмауэр, шифрование диска BitLocker и настройки UAC. В этой статье вы получите чек-лист проверок, готовые PowerShell-скрипты для автоматизации сбора данных и методику интерпретации результатов.
Материал ориентирован на системных администраторов и DevOps-инженеров, которые управляют доменной инфраструктурой на Windows Server 2016/2019/2022 и рабочими станциями Windows 10/11. Все скрипты проверены в реальных средах и не требуют сторонних коммерческих инструментов.
Подготовка к аудиту: необходимые права и инструменты
Перед запуском проверок убедитесь, что у вас есть доступ к домену и целевым машинам. От этого зависит, какие данные вы сможете собрать и насколько полным будет отчет.
Необходимые права и разрешения
Для чтения GPO и объектов компьютеров в Active Directory достаточно учетной записи с правами обычного пользователя домена. Чтение SYSVOL, где хранятся файлы групповых политик, доступно всем аутентифицированным пользователям. Для удаленного сбора данных с рабочих станций через WinRM или WMI потребуются права локального администратора на целевых машинах. На практике используют два подхода:
- Делегированная учетная запись, добавленная в локальную группу «Администраторы» на всех рабочих станциях через GPO Restricted Groups.
- Учетная запись администратора домена, если политика безопасности это допускает.
Проверьте, что служба WinRM запущена на целевых машинах. В доменной среде она часто включается через GPO: Computer Configuration → Policies → Administrative Templates → Windows Components → Windows Remote Management (WinRM) → WinRM Service → Allow remote server management through WinRM.
Инструменты автоматизации: PowerShell и не только
Основной инструмент - PowerShell 5.1 или 7.x с модулем ActiveDirectory. На управляющей машине установите RSAT (Remote Server Administration Tools). Для расширенного анализа путей атак можно использовать PingCastle и BloodHound, но базовый аудит полностью закрывается встроенными средствами.
Ключевые командлеты, которые понадобятся:
Get-GPO -All
Get-GPOReport -All -ReportType Xml
Get-ADComputer -Filter * -Properties OperatingSystem, LastLogonDate
Invoke-Command -ComputerName $computer -ScriptBlock { ... }
Get-CimInstance -ClassName Win32_ComputerSystemДля массового сбора данных используйте Invoke-Command с параллельным выполнением. В PowerShell 7 доступен параметр -Parallel в ForEach-Object, который сокращает время обхода сотен машин с десятков минут до нескольких.
Чек-лист аудита безопасности рабочих станций
Используйте эту таблицу как план проверки. Каждая строка - отдельный этап аудита с указанием, что именно проверять и каким инструментом.
| Область проверки | Что проверяем | Инструмент | Критичность |
|---|---|---|---|
| GPO-политики | Политики паролей, блокировка учетных записей, User Rights Assignment, настройки Windows Defender, брандмауэр, политики аудита | Get-GPOReport, gpresult | Высокая |
| Локальные привилегии | Члены групп Administrators, Remote Desktop Users, Power Users на каждой рабочей станции | Get-LocalGroupMember, Invoke-Command | Высокая |
| Антивирусная защита | Статус Windows Defender, версия сигнатур, наличие сторонних антивирусов, актуальность баз | Get-MpComputerStatus, WMI AntiVirusProduct | Высокая |
| Системные обновления | Установленные обновления, наличие критических патчей, статус WSUS | Get-HotFix, Windows Update Agent API | Высокая |
| Брандмауэр | Включен ли для доменного, частного и публичного профилей | Get-NetFirewallProfile | Средняя |
| BitLocker | Статус шифрования системного диска | Get-BitLockerVolume | Средняя |
| UAC | Уровень контроля учетных записей | Реестр HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System | Средняя |
| Неиспользуемые учетные записи | Локальные пользователи с неактивностью более 90 дней | Get-LocalUser, LastLogon | Низкая |
Порядок проверок в чек-листе соответствует разделам ниже. Начинайте с GPO, так как они определяют базовый уровень безопасности для всех машин домена.
Анализ действующих GPO-политик
Групповые политики - фундамент безопасности домена. Ошибка в GPO распространяется на сотни машин одновременно, поэтому аудит начинается именно с них.
Ключевые параметры безопасности в GPO
Проверьте следующие настройки в объектах групповой политики, примененных к OU с рабочими станциями:
- Политики паролей: минимальная длина не менее 12 символов, сложность включена, максимальный срок действия не более 90 дней, история паролей не менее 10.
- Блокировка учетных записей: порог блокировки 5-10 попыток, длительность блокировки не менее 15 минут.
- User Rights Assignment: кто может входить локально, кто может завершать работу системы, кто имеет право на отладку программ. Проверьте, что группа Domain Admins не входит в локальную группу Administrators через GPO.
- Windows Defender: включена защита в реальном времени, облачная защита, автоматическая отправка образцов, обновление сигнатур по расписанию.
- Брандмауэр Windows: включен для всех трех профилей, входящие подключения блокируются по умолчанию.
- Политики аудита: включен аудит входа в систему, доступа к объектам, изменения политик.
Для быстрой проверки примененных политик на конкретной машине используйте gpresult:
gpresult /S workstation01 /SCOPE COMPUTER /R /VЭта команда покажет, какие GPO применены, и выведет результирующие настройки безопасности.
Автоматизация проверки GPO с помощью PowerShell
Для массового анализа всех GPO используйте Get-GPOReport с экспортом в XML и последующим парсингом. Следующий скрипт выводит сводку по ключевым параметрам безопасности:
$GPOs = Get-GPO -All
$Report = foreach ($gpo in $GPOs) {
$xml = [xml](Get-GPOReport -Guid $gpo.Id -ReportType Xml)
$settings = $xml.GPO.Computer.ExtensionData.Extension
[PSCustomObject]@{
Name = $gpo.DisplayName
PasswordLength = ($settings | Where-Object {$_.Name -eq 'Security'} | Select-Xml -XPath "//MinimumPasswordLength").Node.InnerText
LockoutThreshold = ($settings | Where-Object {$_.Name -eq 'Security'} | Select-Xml -XPath "//LockoutBadCount").Node.InnerText
DefenderEnabled = ($settings | Where-Object {$_.Name -eq 'Windows Defender'} | Select-Xml -XPath "//DisableRealtimeMonitoring").Node.InnerText
FirewallEnabled = ($settings | Where-Object {$_.Name -eq 'Windows Firewall'} | Select-Xml -XPath "//EnableFirewall").Node.InnerText
}
}
$Report | Export-Csv -Path "C:\Audit\GPO_Security_Report.csv" -NoTypeInformation -Encoding UTF8Скрипт создает CSV-файл с результатами по всем GPO. Машины, на которых результирующие настройки отличаются от эталонных, попадут в отчет об отклонениях.
Оценка локальных привилегий пользователей и групп
Избыточные локальные администраторы - одна из самых частых находок аудита. Каждый лишний пользователь с правами администратора увеличивает поверхность атаки: если его учетная запись скомпрометирована, злоумышленник получает полный контроль над машиной.
Поиск компьютеров с избыточными локальными администраторами
Следующий скрипт обходит все компьютеры домена, подключается к каждому через WinRM и выводит членов локальной группы Administrators:
$Computers = Get-ADComputer -Filter * -Properties OperatingSystem | Where-Object {$_.OperatingSystem -like '*Windows 10*' -or $_.OperatingSystem -like '*Windows 11*'}
$Results = foreach ($computer in $Computers) {
try {
$admins = Invoke-Command -ComputerName $computer.Name -ScriptBlock {
Get-LocalGroupMember -Group 'Administrators' | Select-Object -ExpandProperty Name
} -ErrorAction Stop
[PSCustomObject]@{
Computer = $computer.Name
Admins = ($admins -join '; ')
AdminCount = $admins.Count
}
} catch {
[PSCustomObject]@{
Computer = $computer.Name
Admins = 'OFFLINE_OR_ACCESS_DENIED'
AdminCount = -1
}
}
}
$Results | Export-Csv -Path "C:\Audit\LocalAdmins_Report.csv" -NoTypeInformation -Encoding UTF8Сравните полученный список с эталонным. В эталон обычно входят: локальная учетная запись Administrator, группа Domain Admins (если это предусмотрено политикой), специализированная группа поддержки. Все остальные - кандидаты на удаление.
Анализ привилегий через групповые политики Restricted Groups
Restricted Groups - механизм GPO, который централизованно управляет членством в локальных группах. Если Restricted Groups настроены, они перезаписывают локальные изменения при каждом обновлении политики. Проверьте их настройки:
Get-GPO -All | ForEach-Object {
$gpo = $_
$xml = [xml](Get-GPOReport -Guid $gpo.Id -ReportType Xml)
$restrictedGroups = $xml.GPO.Computer.ExtensionData.Extension | Where-Object {$_.Name -eq 'Restricted Groups'}
if ($restrictedGroups) {
Write-Output "GPO: $($gpo.DisplayName)"
$restrictedGroups.InnerXml
}
}Если Restricted Groups не используются, локальные администраторы управляются вручную или через скрипты. Это повышает риск расхождений между машинами. Рекомендация - внедрить Restricted Groups для групп Administrators и Remote Desktop Users, чтобы гарантировать единый состав на всех рабочих станциях.
Контроль состояния антивирусной защиты
Антивирус - последний рубеж защиты при попытке запуска вредоносного кода. Проверка должна подтвердить, что он включен, базы актуальны, а защита в реальном времени работает.
Проверка статуса Windows Defender на рабочих станциях
Командлет Get-MpComputerStatus возвращает полный статус встроенного антивируса. Для массовой проверки используйте:
$Computers = Get-ADComputer -Filter * -Properties OperatingSystem | Where-Object {$_.OperatingSystem -like '*Windows 10*' -or $_.OperatingSystem -like '*Windows 11*'}
$Results = foreach ($computer in $Computers) {
try {
$status = Invoke-Command -ComputerName $computer.Name -ScriptBlock {
Get-MpComputerStatus | Select-Object AntivirusEnabled, RealTimeProtectionEnabled, AntivirusSignatureVersion, AntivirusSignatureLastUpdated, QuickScanEndTime
} -ErrorAction Stop
[PSCustomObject]@{
Computer = $computer.Name
AntivirusEnabled = $status.AntivirusEnabled
RealTimeProtection = $status.RealTimeProtectionEnabled
SignatureVersion = $status.AntivirusSignatureVersion
SignatureUpdated = $status.AntivirusSignatureLastUpdated
LastScan = $status.QuickScanEndTime
}
} catch {
[PSCustomObject]@{
Computer = $computer.Name
AntivirusEnabled = 'ERROR'
RealTimeProtection = 'ERROR'
SignatureVersion = 'ERROR'
SignatureUpdated = 'ERROR'
LastScan = 'ERROR'
}
}
}
$Results | Export-Csv -Path "C:\Audit\Defender_Status.csv" -NoTypeInformation -Encoding UTF8Критичные отклонения: AntivirusEnabled = False, RealTimeProtection = False, SignatureUpdated старше 7 дней. Машины с такими значениями требуют немедленного вмешательства.
Обнаружение сторонних антивирусов и их актуальности
Если в организации используются сторонние антивирусы (Kaspersky, ESET, CrowdStrike), проверьте их наличие и состояние через WMI:
Get-CimInstance -Namespace root/SecurityCenter2 -ClassName AntiVirusProduct | Select-Object displayName, productState, timestampПоле productState содержит закодированный статус. Значение 397568 означает «включен и обновлен», 393472 - «включен, но базы устарели», 262144 - «отключен». Для массовой проверки оберните команду в Invoke-Command аналогично предыдущему скрипту.
Обратите внимание на машины, где установлено несколько антивирусов одновременно. Конфликт между ними может привести к отключению защиты обоих.
Проверка актуальности системных обновлений
Устаревшие обновления - прямой путь к эксплуатации известных уязвимостей. Аудит должен выявить машины, которые не получают патчи вовремя.
Автоматизация проверки обновлений с помощью PowerShell
Командлет Get-HotFix выводит установленные обновления. Для проверки наличия конкретного критического патча используйте:
$RequiredKB = 'KB5034441' # Пример критического обновления
$Computers = Get-ADComputer -Filter * -Properties OperatingSystem | Where-Object {$_.OperatingSystem -like '*Windows 10*' -or $_.OperatingSystem -like '*Windows 11*'}
$Results = foreach ($computer in $Computers) {
try {
$hotfix = Invoke-Command -ComputerName $computer.Name -ScriptBlock {
Get-HotFix -Id $using:RequiredKB -ErrorAction SilentlyContinue
} -ErrorAction Stop
[PSCustomObject]@{
Computer = $computer.Name
KBInstalled = if ($hotfix) {$true} else {$false}
LastHotFix = (Invoke-Command -ComputerName $computer.Name -ScriptBlock { Get-HotFix | Sort-Object InstalledOn -Descending | Select-Object -First 1 -ExpandProperty InstalledOn } -ErrorAction SilentlyContinue)
}
} catch {
[PSCustomObject]@{
Computer = $computer.Name
KBInstalled = 'ERROR'
LastHotFix = 'ERROR'
}
}
}
$Results | Export-Csv -Path "C:\Audit\Updates_Report.csv" -NoTypeInformation -Encoding UTF8Интеграция с WSUS или другими системами управления обновлениями
Если в организации развернут WSUS, получите отчет о статусе обновлений из него. PowerShell-командлеты для WSUS доступны после установки роли на сервере:
Get-WsusComputer -ComputerTargetGroups 'All Computers' | Select-Object FullDomainName, LastReportedStatusTime, LastSyncTimeМашины, которые не синхронизировались с WSUS более 30 дней, не получают обновления и требуют проверки агента Windows Update. Альтернативы WSUS - SCCM или сторонние решения вроде Patch Manager Plus, но принцип аудита тот же: сравнение фактического состояния с эталонным списком обязательных обновлений.
Дополнительные проверки безопасности рабочих станций
Четыре основные области закрывают большую часть рисков, но полный аудит включает и дополнительные проверки.
Проверка состояния брандмауэра
Брандмауэр должен быть включен для всех профилей. Проверьте одной командой:
Invoke-Command -ComputerName workstation01 -ScriptBlock {
Get-NetFirewallProfile | Select-Object Name, Enabled
}Ожидаемый результат: Enabled = True для Domain, Private и Public. Если публичный профиль отключен, машина уязвима при подключении к внешним сетям.
Проверка шифрования диска BitLocker
Шифрование защищает данные при физической краже устройства. Проверьте статус:
Invoke-Command -ComputerName workstation01 -ScriptBlock {
Get-BitLockerVolume -MountPoint 'C:' | Select-Object ProtectionStatus, EncryptionPercentage, KeyProtector
}ProtectionStatus = On означает, что шифрование активно. EncryptionPercentage должно быть 100. Если BitLocker не используется, рассмотрите внедрение через GPO с хранением ключей восстановления в Active Directory.
Анализ результатов и выявление отклонений
Собранные данные бесполезны без сравнения с эталоном. Определите целевые значения для каждой проверки и выявите машины, которые от них отклоняются.
Создание сводного отчета по аудиту
Объедините результаты всех проверок в один HTML-отчет. Следующий скрипт собирает данные из CSV-файлов и выделяет проблемные машины:
$GPOReport = Import-Csv "C:\Audit\GPO_Security_Report.csv"
$AdminsReport = Import-Csv "C:\Audit\LocalAdmins_Report.csv"
$DefenderReport = Import-Csv "C:\Audit\Defender_Status.csv"
$UpdatesReport = Import-Csv "C:\Audit\Updates_Report.csv"
$Summary = foreach ($computer in $AdminsReport) {
$defender = $DefenderReport | Where-Object {$_.Computer -eq $computer.Computer}
$updates = $UpdatesReport | Where-Object {$_.Computer -eq $computer.Computer}
[PSCustomObject]@{
Computer = $computer.Computer
AdminCount = $computer.AdminCount
DefenderEnabled = $defender.AntivirusEnabled
SignatureAge = if ($defender.SignatureUpdated) { (Get-Date) - [datetime]$defender.SignatureUpdated } else { $null }
LastHotFix = $updates.LastHotFix
Compliant = if ($computer.AdminCount -le 3 -and $defender.AntivirusEnabled -eq 'True' -and $defender.SignatureUpdated -gt (Get-Date).AddDays(-7)) { $true } else { $false }
}
}
$Summary | ConvertTo-Html -Title 'Audit Report' | Out-File "C:\Audit\Audit_Summary.html"Критичные отклонения требуют немедленного устранения: отключенный антивирус, отсутствующие критические обновления, неожиданные локальные администраторы. Средние отклонения - устаревшие сигнатуры, отключенный брандмауэр в публичном профиле, отсутствие BitLocker - планируются к исправлению в течение недели.
Рекомендации по устранению выявленных уязвимостей
Каждая типичная проблема имеет стандартное решение. Применяйте исправления через GPO, чтобы они распространялись на все машины автоматически.
Исправление проблем с GPO
Если аудит выявил слабые политики паролей или отключенный Defender, исправьте их в GPO, примененном к OU с рабочими станциями:
- Включение Defender: Computer Configuration → Policies → Administrative Templates → Windows Components → Microsoft Defender Antivirus → Turn off Microsoft Defender Antivirus → Not Configured или Disabled.
- Политики паролей: Computer Configuration → Policies → Windows Settings → Security Settings → Account Policies → Password Policy. Установите минимальную длину 12, включите сложность.
- Брандмауэр: Computer Configuration → Policies → Windows Settings → Security Settings → Windows Firewall with Advanced Security. Включите для всех профилей.
После изменения GPO принудительно обновите политики на целевых машинах: Invoke-GPUpdate -Computer workstation01 -Force.
Управление локальными привилегиями
Для удаления лишних администраторов используйте Restricted Groups. Создайте GPO, который задает точный состав группы Administrators:
Computer Configuration → Policies → Windows Settings → Security Settings → Restricted Groups
Add Group: Administrators
Members: DOMAIN\Workstation_Admins, DOMAIN\Domain_AdminsПри следующем обновлении политики все локальные пользователи, не входящие в указанный список, будут удалены из группы Administrators. Для разового исправления используйте:
Invoke-Command -ComputerName workstation01 -ScriptBlock {
Remove-LocalGroupMember -Group 'Administrators' -Member 'DOMAIN\user01'
}Автоматизация регулярного аудита и мониторинга
Разовый аудит выявляет текущие проблемы, но безопасность требует постоянного контроля. Автоматизируйте запуск скриптов по расписанию.
Настройка запланированных задач для аудита
Создайте задачу в Task Scheduler на управляющей машине для еженедельного запуска скриптов:
$Action = New-ScheduledTaskAction -Execute 'powershell.exe' -Argument '-File C:\Audit\RunAllAuditScripts.ps1'
$Trigger = New-ScheduledTaskTrigger -Weekly -DaysOfWeek Monday -At 6am
$Principal = New-ScheduledTaskPrincipal -UserId 'DOMAIN\AuditAccount' -LogonType ServiceAccount -RunLevel Highest
Register-ScheduledTask -TaskName 'Weekly Workstation Audit' -Action $Action -Trigger $Trigger -Principal $PrincipalСкрипт RunAllAuditScripts.ps1 должен последовательно запускать все проверки из этой статьи и сохранять результаты в папку с датой. Добавьте отправку уведомлений по email при обнаружении критичных отклонений:
if ($Summary | Where-Object {$_.Compliant -eq $false}) {
Send-MailMessage -From 'audit@domain.local' -To 'admin@domain.local' -Subject 'Critical audit findings' -Body ($Summary | Where-Object {$_.Compliant -eq $false} | Out-String) -SmtpServer 'smtp.domain.local'
}Интеграция с системами мониторинга (Zabbix, Prometheus) возможна через экспорт результатов в формат, который они умеют забирать. Минимальный вариант - запись в лог-файл и настройка агента на его чтение.
Заключение
Регулярный аудит безопасности рабочих станций в Active Directory - это процесс, который выявляет проблемы до того, как они превратятся в инциденты. Начните с чек-листа из этой статьи, автоматизируйте сбор данных с помощью приведенных скриптов и внедрите еженедельный запуск проверок. Ключевые шаги: анализ GPO, контроль локальных привилегий, проверка антивируса и обновлений, дополнительные проверки брандмауэра и BitLocker. Результаты сравнивайте с эталоном и устраняйте отклонения через групповые политики. Такой подход снижает риск компрометации домена и поддерживает безопасность на приемлемом уровне без ручного обхода каждой машины.
Для более широкого контекста по аудиту инфраструктуры изучите полное руководство по аудиту безопасности IT-инфраструктуры и аудит политик и прав доступа IAM. Если вы управляете смешанной средой, обратите внимание на комплексный аудит для DevOps и администраторов.