Домашняя лаборатория: Active Directory + Windows 7 + сбор логов в ELK
Пошаговое руководство по развёртыванию мини‑стенда в VirtualBox:
Контроллер домена Active Directory (с DNS и DHCP) на Windows Server 2019.
Политика аудита через GPO.
Клиент Windows 7 в домене.
ELK‑стек (Elasticsearch, Logstash, Kibana 9.4.2) и отправка событий Windows через Winlogbeat.
Статья написана по реальному развёртыванию, поэтому в конце есть раздел с проблемами, которые встретились по пути, и их решениями.
⚠️ Важно. Windows 7 снята с поддержки и содержит неисправленные уязвимости. Используйте её только в изолированной лабораторной сети и не давайте ей доступ к рабочим ресурсам. Конфигурации ELK в статье упрощены (в Logstash используется учётная запись
elastic) и подходят только для лаборатории.
Содержание
Архитектура стенда
1. Active Directory
2. DHCP
3. Структура домена
4. Политика аудита (GPO)
5. Ввод Windows 7 в домен
6. Подготовка ELK‑сервера
7. Logstash
8. Winlogbeat на DC и Windows 7
9. Просмотр логов в Kibana
10. Проблемы и решения
11. Что дальше
Архитектура стенда

Машина | ОС | Роль | Адрес |
|---|---|---|---|
| Windows Server 2019 | AD DS, DNS, DHCP |
|
| Windows 7 | Клиент домена | DHCP, диапазон |
| Ubuntu Server | Elasticsearch, Logstash, Kibana |
|
Домен:
corp.lab(NetBIOS:CORP)Сеть:
192.168.100.0/24, в VirtualBox тип подключения «Сеть NAT» с именемAD-Lab. Встроенный DHCP‑сервер этой сети VirtualBox отключён, адреса выдаёт DC.
Ресурсы виртуальных машин (ориентир):
ВМ | CPU | RAM | Диск |
|---|---|---|---|
DC01 | 2 | 4 ГБ | 40 ГБ |
WIN7-PC01 | 1–2 | 2 ГБ | 30 ГБ |
elk | 2 | 4,5 ГБ можно больше | 40 ГБ |
На 3 ГБ RAM Elasticsearch и Kibana работают на пределе, а с Logstash начинают падать из‑за нехватки памяти. Закладывайте не меньше 4–6 ГБ.
Настройка сети VirtualBox
Файл → Инструменты → Сетевой менеджер → Сети NAT → создать сеть
AD-Lab, префикс192.168.100.0/24, снять галочку «Включить DHCP».У всех трёх ВМ: Настройки → Сеть → Адаптер 1 → тип «Сеть NAT», имя
AD-Lab.Для доступа с хоста добавить проброс портов (Свойства сети → Проброс портов), протокол TCP:
Имя | IP хоста | Порт хоста | IP гостя | Порт гостя |
|---|---|---|---|---|
ssh‑elk | 127.0.0.1 | 2222 | 192.168.100.20 | 22 |
kibana | 127.0.0.1 | 5601 | 192.168.100.20 | 5601 |
Тогда на хосте работают ssh -p 2222 elk@127.0.0.1 (удобно, когда в консоли ВМ не работает буфер обмена) и http://localhost:5601.
1. Active Directory
Все команды этого раздела выполняются в PowerShell от администратора на DC01.
1.1. Имя и статический IP
Rename-Computer -NewName "DC01" -Restart
После перезагрузки:
Get-NetAdapter New-NetIPAddress -InterfaceAlias "Ethernet" -IPAddress 192.168.100.10 -PrefixLength 24 -DefaultGateway 192.168.100.1 Set-DnsClientServerAddress -InterfaceAlias "Ethernet" -ServerAddresses 127.0.0.1
(вместо Ethernet подставьте имя адаптера из Get-NetAdapter).
1.2. Установка роли и повышение до контроллера домена
Install-WindowsFeature -Name AD-Domain-Services -IncludeManagementTools Install-ADDSForest -DomainName "corp.lab" -DomainNetbiosName "CORP" -InstallDns:$true -SafeModeAdministratorPassword (Read-Host -AsSecureString "DSRM password") -Force:$true
Сервер перезагрузится. Дальше входите как CORP\Administrator.
1.3. Проверка
Get-ADDomain dcdiag /q Get-Service NTDS, DNS, Netlogon, KDC
dcdiag /q не должна выводить ошибок.
2. DHCP
Install-WindowsFeature -Name DHCP -IncludeManagementTools # Авторизовать сервер в AD Add-DhcpServerInDC -DnsName "dc01.corp.lab" -IPAddress 192.168.100.10 # Область выдачи адресов (команда одной строкой, без обратных кавычек) Add-DhcpServerv4Scope -Name "Lab" -StartRange 192.168.100.100 -EndRange 192.168.100.200 -SubnetMask 255.255.255.0 -State Active # Опции для клиентов: DNS и суффикс Set-DhcpServerv4OptionValue -DnsServer 192.168.100.10 -DnsDomain corp.lab -Router 192.168.100.1 Restart-Service DHCPServer
Проверка:
Get-DhcpServerv4Scope Get-DhcpServerInDC Get-DhcpServerv4OptionValue -ScopeId 192.168.100.0
Если при создании области появляется ошибка
DHCP 20052 / ResourceExists, значит, область уже создана мастером при установке роли. Проверьте её и поправьте черезSet-DhcpServerv4Scope.
3. Структура домена
$base = "DC=corp,DC=lab" New-ADOrganizationalUnit -Name "Lab" -Path $base New-ADOrganizationalUnit -Name "Users" -Path "OU=Lab,$base" New-ADOrganizationalUnit -Name "Computers" -Path "OU=Lab,$base" New-ADOrganizationalUnit -Name "Groups" -Path "OU=Lab,$base" New-ADGroup -Name "IT-Admins" -GroupScope Global -Path "OU=Groups,OU=Lab,$base" New-ADGroup -Name "Employees" -GroupScope Global -Path "OU=Groups,OU=Lab,$base" # Новые компьютеры по умолчанию попадают в OU=Computers redircmp "OU=Computers,OU=Lab,DC=corp,DC=lab"
Пользователи (пароль вводится отдельной командой):
$pwd = Read-Host -AsSecureString "Пароль для тестовых пользователей" New-ADUser -Name "Ivan Petrov" -SamAccountName "ipetrov" -UserPrincipalName "ipetrov@corp.lab" -Path "OU=Users,OU=Lab,DC=corp,DC=lab" -AccountPassword $pwd -Enabled $true New-ADUser -Name "Anna Smirnova" -SamAccountName "asmirnova" -UserPrincipalName "asmirnova@corp.lab" -Path "OU=Users,OU=Lab,DC=corp,DC=lab" -AccountPassword $pwd -Enabled $true Add-ADGroupMember -Identity "Employees" -Members ipetrov, asmirnova Add-ADGroupMember -Identity "IT-Admins" -Members ipetrov
Проверка:
Get-ADOrganizationalUnit -Filter * | Select-Object Name, DistinguishedName Get-ADUser -Filter * -SearchBase "OU=Users,OU=Lab,DC=corp,DC=lab" | Select-Object Name, SamAccountName, Enabled (Get-ADDomain).ComputersContainer
4. Политика аудита (GPO)
Чтобы в журнале «Безопасность» появились события входов, создания учётных записей и запуска процессов, нужно включить расширенный аудит.
4.1. Создание GPO
New-GPO -Name "Lab-Audit-Policy" New-GPLink -Name "Lab-Audit-Policy" -Target "DC=corp,DC=lab" # Командная строка процессов в событии 4688 Set-GPRegistryValue -Name "Lab-Audit-Policy" -Key "HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System\Audit" -ValueName "ProcessCreationIncludeCmdLine_Enabled" -Type DWord -Value 1
4.2. Подкатегории аудита
gpmc.msc → Lab‑Audit‑Policy → Изменить → Конфигурация компьютера → Политики → Конфигурация Windows → Параметры безопасности → Расширенная конфигурация политики аудита → Политики аудита.
Категория | Подкатегория | Успех | Отказ |
|---|---|---|---|
Вход учётной записи | Проверка учётных данных | ✔ | ✔ |
Вход учётной записи | Служба проверки подлинности Kerberos | ✔ | ✔ |
Вход учётной записи | Операции с билетами службы Kerberos | ✔ | ✔ |
Управление учётными записями | Управление учётными записями пользователей | ✔ | ✔ |
Управление учётными записями | Управление группами безопасности | ✔ | ✔ |
Вход/выход | Вход в систему | ✔ | ✔ |
Вход/выход | Выход из системы | ✔ | |
Вход/выход | Специальный вход | ✔ | |
Подробное отслеживание | Создание процесса | ✔ | |
Доступ к службе каталогов | Изменение службы каталогов | ✔ | |
Изменение политики | Изменение политики аудита | ✔ | ✔ |
Дополнительно в той же политике: Параметры безопасности → Локальные политики → Параметры безопасности → «Аудит: принудительно переопределять параметры политики аудита категорий параметрами подкатегорий…» → Включено.
4.3. Проверка
gpupdate /force auditpol /get /category:* | Select-String -NotMatch "Без аудита" reg query HKLM\SYSTEM\CurrentControlSet\Control\Lsa /v SCENoApplyLegacyAuditPolicy
Должны остаться строки «Успех» / «Успех и сбой», а значение реестра равно 0x1.
4.4. Если аудит остаётся «Без аудита»
Это была самая неочевидная проблема стенда. Политика применялась (gpresult показывал Lab-Audit-Policy, событие 1704 сообщало об успехе, файл audit.csv лежал в SYSVOL), но аудит не включался.
Причина: в атрибуте gPCMachineExtensionNames объекта политики не было записи о расширении «Конфигурация расширенной политики аудита» ({F3CCC681-B74C-4060-9F26-CD84525DCA2A}). Клиент запускает только те расширения, которые перечислены в этом атрибуте, поэтому настройки из audit.csv игнорировались. Обычно запись создаёт сам редактор политик, но здесь этого не произошло.
Диагностика:
$gpo = Get-GPO -Name "Lab-Audit-Policy" $dn = "CN={$($gpo.Id)},CN=Policies,CN=System,DC=corp,DC=lab" (Get-ADObject $dn -Properties gPCMachineExtensionNames).gPCMachineExtensionNames
В выводе нужен фрагмент F3CCC681-B74C-4060-9F26-CD84525DCA2A. Если его нет, дописываем запись (один раз):
$entry = "[{F3CCC681-B74C-4060-9F26-CD84525DCA2A}{0F3F3735-573D-9804-99E4-AB2A69BA5FD4}]" $cur = (Get-ADObject $dn -Properties gPCMachineExtensionNames).gPCMachineExtensionNames if ($cur -notlike "*F3CCC681*") { Set-ADObject $dn -Replace @{gPCMachineExtensionNames = $cur + $entry} } gpupdate /force
Если при повторном запуске запись добавилась дважды, уберите дубль: $clean = $cur.Replace($entry, "") + $entry, затем Set-ADObject $dn -Replace @{gPCMachineExtensionNames = $clean}.
Запасной вариант (локально на одной машине, без GPO):
auditpol /set /subcategory:"{0CCE923F-69AE-11D9-BED3-505054503030}" /success:enable /failure:enable
GUID подкатегорий не зависят от языка системы: {0CCE9215-...} вход в систему, {0CCE9235-...} управление пользователями, {0CCE922B-...} создание процесса и так далее
5. Ввод Windows 7 в домен
5.1. Подготовка
Установлен Service Pack 1 (
winver).При установке задано имя ПК
WIN7-PC01и локальная учётная запись (например,labadmin).Адаптер в сети
AD-Lab, адрес выдаёт DC:
ipconfig /all
Нужно: IP из диапазона 192.168.100.100–200, DNS‑сервер 192.168.100.10, DNS‑суффикс corp.lab. Адрес вида 169.254.x.x означает, что DHCP недоступен.
Проверка DNS:
ping 192.168.100.10 nslookup corp.lab nslookup -type=SRV _ldap._tcp.dc._msdcs.corp.lab
Время на ПК и на DC не должно отличаться больше чем на 5 минут (требование Kerberos).
5.2. Ввод
PowerShell от администратора (на Windows 7 доступен PowerShell 2.0):
Add-Computer -DomainName corp.lab -Credential CORP\Administrator -Restart
Или графически: Компьютер → Свойства → Изменить параметры → Изменить → Член домена.
5.3. Проверка
После перезагрузки войдите как CORP\ipetrov (для проверок аудита нужен CORP\Administrator):
whoami gpresult /scope computer /r auditpol /get /category:* | find /v "Без аудита"
В gpresult должна быть Lab-Audit-Policy. На DC:
Get-ADComputer -Filter * | Select-Object Name, DistinguishedName
WIN7-PC01 должен находиться в OU=Computers,OU=Lab,DC=corp,DC=lab.
Для вывода командной строки в событии 4688 на Windows 7 нужно обновление KB3004375.
6. Подготовка ELK‑сервера
На сервере Ubuntu должны быть установлены Elasticsearch и Kibana версии 9.4.2 (по документации Elastic). Дальше описана подготовка сети и ресурсов.
6.1. Статический адрес
ls /etc/netplan/
Конфигурацию удобно записать одной строкой, чтобы не ошибиться в отступах YAML (имя файла и интерфейса подставьте свои):
echo 'network: {version: 2, ethernets: {enp0s3: {dhcp4: false, addresses: [192.168.100.20/24], routes: [{to: default, via: 192.168.100.1}], nameservers: {search: [corp.lab], addresses: [192.168.100.10]}}}}' | sudo tee /etc/netplan/50-cloud-init.yaml sudo chmod 600 /etc/netplan/50-cloud-init.yaml sudo netplan try # чтобы cloud-init не перезаписал настройку после перезагрузки echo 'network: {config: disabled}' | sudo tee /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg
Проверка:
ip a | grep inet resolvectl status nslookup dc01.corp.lab ping -c 3 192.168.100.10
В resolvectl status у интерфейса должен быть DNS Servers: 192.168.100.10.
Альтернатива: вместо статического адреса на самой машине можно создать на DHCP резервацию по MAC‑адресу (
Add-DhcpServerv4Reservation). Адрес в этом случае должен попадать в диапазон области. Статика независима от DC, поэтому для серверов её используют чаще.
6.2. Память
free -h
Если RAM мало, увеличьте её в настройках ВМ и ограничьте кучи Java:
printf -- '-Xms2g\n-Xmx2g\n' | sudo tee /etc/elasticsearch/jvm.options.d/heap.options sudo systemctl restart elasticsearch
6.3. Kibana доступна снаружи
По умолчанию Kibana слушает только 127.0.0.1:
sudo sed -i 's/^#\?server.host:.*/server.host: "0.0.0.0"/' /etc/kibana/kibana.yml sudo systemctl restart kibana
6.4. Пароль пользователя elastic
sudo /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic
Новый пароль выводится один раз, запишите его.
7. Logstash
Winlogbeat 7.17 (единственная ветка, работающая на Windows 7) не подключается напрямую к Elasticsearch 9.x, поэтому между ними ставится Logstash той же версии, что и Elasticsearch (9.4.2).
7.1. Установка
Если сервер может обращаться к репозиторию Elastic, подойдёт обычный apt. Если загрузка пакетов блокируется (ответ 403 Forbidden), скачайте logstash-9.4.2-amd64.deb на другой машине и передайте на сервер:
scp -P 2222 "C:\Users\<user>\Downloads\logstash-9.4.2-amd64.deb" elk@127.0.0.1:~/
Устанавливайте файл через dpkg, а не apt install ./файл. Во втором случае apt пытается скачать пакет из репозитория, а локальный файл читает от служебного пользователя, у которого нет доступа к домашней папке (ошибка Permission denied):
sudo dpkg -i ~/logstash-9.4.2-amd64.deb /usr/share/logstash/bin/logstash --version
Если памяти мало, уменьшите кучу Logstash:
sudo sed -i 's/^-Xms1g/-Xms512m/; s/^-Xmx1g/-Xmx512m/' /etc/logstash/jvm.options
7.2. Сертификат Elasticsearch
sudo mkdir -p /etc/logstash/certs sudo cp /etc/elasticsearch/certs/http_ca.crt /etc/logstash/certs/ sudo chown -R logstash:logstash /etc/logstash/certs sudo chmod 640 /etc/logstash/certs/http_ca.crt
7.3. Pipeline
Пароль запрашивается интерактивно и подставляется в файл, в историю команд он не попадает:
read -s -p "Пароль elastic: " PW; echo sudo tee /etc/logstash/conf.d/winlogbeat.conf > /dev/null <<EOF input { beats { port => 5044 } } output { elasticsearch { hosts => ["https://localhost:9200"] user => "elastic" password => "$PW" ssl_certificate_authorities => ["/etc/logstash/certs/http_ca.crt"] index => "winlogbeat-%{+YYYY.MM.dd}" } } EOF unset PW
Хранить пароль
elasticв конфигурации допустимо только в изолированной лаборатории. В реальной среде создайте отдельного пользователя с минимальными правами на запись в индексыwinlogbeat-*.
7.4. Запуск
sudo systemctl enable --now logstash sudo ss -tlnp | grep -E '5044|5601|9200'
Logstash стартует около минуты. Должны слушаться порты 9200 (Elasticsearch), 5601 (Kibana) и 5044 (Logstash). Если включён ufw:
sudo ufw allow from 192.168.100.0/24 to any port 5044 proto tcp
8. Winlogbeat на DC и Windows 7
8.1. Версия
Winlogbeat | Windows 7 | Комментарий |
|---|---|---|
7.17.x | ✅ | Используем на DC и Windows 7 |
8.x и новее | ❌ | Не запускается на Windows 7 |
Скачайте winlogbeat-7.17.x-windows-x86_64.zip (для 32-разрядной Windows 7 вариант x86) и распакуйте в C:\Program Files\Winlogbeat.
8.2. Конфигурация winlogbeat.yml
Одинаковая для обеих машин:
winlogbeat.event_logs: - name: Security ignore_older: 72h - name: System ignore_older: 72h - name: Application ignore_older: 72h setup.template.enabled: false setup.ilm.enabled: false output.logstash: hosts: ["192.168.100.20:5044"] logging.level: info logging.to_files: true logging.files: path: C:/ProgramData/winlogbeat/Logs
Другие секции output.* и setup.kibana должны быть закомментированы или удалены.
Совет, если в ВМ не работает буфер обмена: распакуйте архив на сервере ELK (
python3 -m zipfile -e <архив>.zip ~/wlb), запишите конфиг черезcat > ... <<'EOF', запакуйте обратно (python3 -m zipfile -c ~/winlogbeat-ready.zip<папка>) и раздайте в лабораторной сети командойpython3 -m http.server 8000. На DC скачать можно так:Invoke-WebRequest -UseBasicParsing -Urihttp://192.168.100.20:8000/winlogbeat-ready.zip-OutFile C:\winlogbeat-ready.zip. После скачивания остановите веб‑сервер.
8.3. Проверка
Из каталога Winlogbeat, от администратора:
winlogbeat.exe test config -c winlogbeat.yml -e winlogbeat.exe test output -c winlogbeat.yml
test output должен подтвердить подключение к 192.168.100.20:5044.
8.4. Установка службы
DC01 (PowerShell):
Set-ExecutionPolicy -Scope Process Bypass .\install-service-winlogbeat.ps1 Start-Service winlogbeat
Windows 7 (cmd, одной командой; штатный скрипт требует более новый PowerShell):
sc create winlogbeat binPath= "\"C:\Program Files\Winlogbeat\winlogbeat.exe\" -c \"C:\Program Files\Winlogbeat\winlogbeat.yml\" -path.home \"C:\Program Files\Winlogbeat\" -path.data \"C:\ProgramData\winlogbeat\" -path.logs \"C:\ProgramData\winlogbeat\Logs\"" start= auto DisplayName="Winlogbeat" sc start winlogbeat
Пробелы после binPath= и start= обязательны. Проверка: sc query winlogbeat показывает RUNNING.
9. Просмотр логов в Kibana
9.1. Проверка на стороне сервера
read -s -p "Пароль elastic: " PW; echo curl -sk -u elastic:$PW 'https://localhost:9200/_cat/indices/winlogbeat-*?v'
Должен появиться индекс winlogbeat-ГГГГ.ММ.ДД, а docs.count растёт. Статус yellow у одиночного узла нормален (нет второго сервера для реплик).
События по хостам:
curl -sk -u elastic:$PW 'https://localhost:9200/winlogbeat-*/\_search?size=0&pretty' -H 'Content-Type: application/json' -d '{"aggs":{"hosts":{"terms":{"field":"host.name.keyword"}}}}'
Должны быть и DC01, и WIN7-PC01.
9.2. Data View
Kibana сама не создаёт Data View для winlogbeat-*:
http://localhost:5601(логинelastic).Stack Management → Data Views → Create data view.
Name:
winlogbeat, Index pattern:winlogbeat-*, Timestamp field:@timestamp.Discover → выберите этот Data View, диапазон «Last 24 hours».
9.3. Генерация событий
На Windows 7: один раз введите неверный пароль для
CORP\ipetrov, затем верный.На DC:
New-ADUser -Name "Test User" -SamAccountName "tuser" Add-ADGroupMember -Identity "IT-Admins" -Members tuser Remove-ADUser -Identity tuser -Confirm:$false
9.4. Полезные запросы (KQL)
Что ищем | Запрос |
|---|---|
События с DC |
|
События с Windows 7 |
|
Успешные входы |
|
Неудачные входы |
|
Создание пользователей |
|
Удаление пользователей |
|
Добавление в группы |
|
Билеты Kerberos (на DC) |
|
Запуск процессов |
|
Имена полей зависят от версии Winlogbeat. Если запрос ничего не находит, раскройте любое событие в Discover и посмотрите реальные названия (event.code, winlog.event_id, winlog.event_data.*).
10. Проблемы и решения
Симптом | Причина и решение |
|---|---|
| При вставке команды обратная кавычка |
DHCP 20 052 | Область уже существует (создана мастером). Проверьте |
| В |
Win7: «Не удаётся найти контроллер домена» | DNS клиента не указывает на DC. Проверьте |
Win7: ошибка при входе или вводе, связанная со временем | Расхождение больше 5 минут, синхронизируйте часы |
ELK в сети | У ВМ стоит обычный «NAT» вместо «Сети NAT» |
| Неверные отступы. Запишите конфиг одной строкой (см. 6.1) |
| В |
| Загрузка пакетов Elastic блокируется. Скачайте |
| Служебный пользователь |
| Для копирования файлов нужен |
| Elasticsearch ещё не поднялся или упал из‑за нехватки памяти. Проверьте |
Elasticsearch и Kibana падают или тормозят | Мало RAM (3 ГБ недостаточно). Увеличьте память ВМ, ограничьте кучи Java |
Logstash: | Elasticsearch перезапускался или не справлялся с нагрузкой. После стабилизации Logstash подключается сам |
| У пользователя нет прав на файл. Запускайте через |
В Kibana нет Data View | Его нужно создать вручную (см. 9.2) |
Нет событий с одного хоста | Проверьте службу Winlogbeat, |
В событии 4688 нет командной строки | Не включена настройка GPO или нет KB3004375 на Windows 7 |
Цепочка диагностики, если данных нет: служба Winlogbeat запущена → test output успешен → порт 5044 слушает (ss -tlnp) → в журнале Logstash нет ошибок (journalctl -u logstash) → индекс создан (_cat/indices) → в Kibana выбран правильный диапазон времени.
11. Что дальше
Установить Sysmon (например, с конфигом SwiftOnSecurity) и добавить канал
Microsoft-Windows-Sysmon/Operationalв Winlogbeat.Создать дашборд: неудачные входы по времени и хостам, топ учётных записей с ошибками, изменения групп.
Включить безопасность Elastic по‑настоящему: отдельный пользователь для Logstash, TLS между компонентами, убрать пароль
elasticиз конфигов.Настроить правила обнаружения (Kibana Security или Sigma), например для перебора паролей и создания привилегированных учётных записей.
Заменить Windows 7 на современную ОС и использовать Elastic Agent вместо Winlogbeat.
Потренироваться на атаках в лаборатории (перебор паролей, Kerberoasting) и посмотреть, как они выглядят в логах.
Лицензия
MIT. Материал предоставляется «как есть». Не применяйте приведённые конфигурации в рабочей среде без доработки безопасности.
