Базовое администрирование AD, и подключение стека ELK

Домашняя лаборатория: 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-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, KDCdcdiag /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 14.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:enableGUID подкатегорий не зависят от языка системы: {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, DistinguishedNameWIN7-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 elasticsearch6.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 kibana6.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.options7.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.crt7.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 tcp8. 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.ymltest output должен подтвердить подключение к 192.168.100.20:5044.
8.4. Установка службы
DC01 (PowerShell):
Set-ExecutionPolicy -Scope Process Bypass
.\install-service-winlogbeat.ps1
Start-Service winlogbeatWindows 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:$false9.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. Материал предоставляется «как есть». Не применяйте приведённые конфигурации в рабочей среде без доработки безопасности.
KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.