Домашняя лаборатория: 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) и подходят только для лаборатории.
Содержание
Архитектура стенда

|
Машина |
ОС |
Роль |
Адрес |
|---|---|---|---|
|
|
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-NetAdapterNew-NetIPAddress -InterfaceAlias "Ethernet" -IPAddress 192.168.100.10 -PrefixLength 24 -DefaultGateway 192.168.100.1Set-DnsClientServerAddress -InterfaceAlias "Ethernet" -ServerAddresses 127.0.0.1
(вместо Ethernet подставьте имя адаптера из Get-NetAdapter).
1.2. Установка роли и повышение до контроллера домена
Install-WindowsFeature -Name AD-Domain-Services -IncludeManagementToolsInstall-ADDSForest -DomainName "corp.lab" -DomainNetbiosName "CORP" -InstallDns:$true -SafeModeAdministratorPassword (Read-Host -AsSecureString "DSRM password") -Force:$true
Сервер перезагрузится. Дальше входите как CORP\Administrator.
1.3. Проверка
Get-ADDomaindcdiag /qGet-Service NTDS, DNS, Netlogon, KDC
dcdiag /q не должна выводить ошибок.
2. DHCP
Install-WindowsFeature -Name DHCP -IncludeManagementTools# Авторизовать сервер в ADAdd-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.1Restart-Service DHCPServer
Проверка:
Get-DhcpServerv4ScopeGet-DhcpServerInDCGet-DhcpServerv4OptionValue -ScopeId 192.168.100.0
Если при создании области появляется ошибка
DHCP 20052 / ResourceExists, значит, область уже создана мастером при установке роли. Проверьте её и поправьте черезSet-DhcpServerv4Scope.
3. Структура домена
$base = "DC=corp,DC=lab"New-ADOrganizationalUnit -Name "Lab" -Path $baseNew-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=Computersredircmp "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 $trueNew-ADUser -Name "Anna Smirnova" -SamAccountName "asmirnova" -UserPrincipalName "asmirnova@corp.lab" -Path "OU=Users,OU=Lab,DC=corp,DC=lab" -AccountPassword $pwd -Enabled $trueAdd-ADGroupMember -Identity "Employees" -Members ipetrov, asmirnovaAdd-ADGroupMember -Identity "IT-Admins" -Members ipetrov
Проверка:
Get-ADOrganizationalUnit -Filter * | Select-Object Name, DistinguishedNameGet-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"# Командная строка процессов в событии 4688Set-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 /forceauditpol /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).gPCMachineExtensionNamesif ($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.10nslookup corp.labnslookup -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):
whoamigpresult /scope computer /rauditpol /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.yamlsudo chmod 600 /etc/netplan/50-cloud-init.yamlsudo netplan try# чтобы cloud-init не перезаписал настройку после перезагрузкиecho 'network: {config: disabled}' | sudo tee /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg
Проверка:
ip a | grep inetresolvectl statusnslookup dc01.corp.labping -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.optionssudo 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.ymlsudo 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/certssudo cp /etc/elasticsearch/certs/http_ca.crt /etc/logstash/certs/sudo chown -R logstash:logstash /etc/logstash/certssudo chmod 640 /etc/logstash/certs/http_ca.crt
7.3. Pipeline
Пароль запрашивается интерактивно и подставляется в файл, в историю команд он не попадает:
read -s -p "Пароль elastic: " PW; echosudo tee /etc/logstash/conf.d/winlogbeat.conf > /dev/null <<EOFinput { 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}" }}EOFunset PW
Хранить пароль
elasticв конфигурации допустимо только в изолированной лаборатории. В реальной среде создайте отдельного пользователя с минимальными правами на запись в индексыwinlogbeat-*.
7.4. Запуск
sudo systemctl enable --now logstashsudo 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: 72hsetup.template.enabled: falsesetup.ilm.enabled: falseoutput.logstash: hosts: ["192.168.100.20:5044"]logging.level: infologging.to_files: truelogging.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 -ewinlogbeat.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.ps1Start-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; echocurl -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 tuserRemove-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. Материал предоставляется «как есть». Не применяйте приведённые конфигурации в рабочей среде без доработки безопасности.
ссылка на оригинал статьи https://habr.com/ru/articles/1098864/