Monitor Security 4740 on a configured domain controller and enrich alerts with ActiveSync client IPs from IIS logs. Add unified Telegram and email delivery with NotifyOrder. Update README and DPAPI helper for mail password.
15 KiB
RDP Login Monitor
PowerShell-набор для мониторинга входов в Windows с отправкой уведомлений в Telegram.
Актуальная схема (рекомендуется)
- Базовый путь установки:
C:\ProgramData\RDP-login-monitor\. - Основной скрипт:
Login_Monitor.ps1— журнал Security4624/4625(логика зависит от типа ОС: рабочая станция или сервер/КД), при наличии журнала — Remote Connection Manager1149(часто актуально для РС с RDP), при роли RD Gateway —302/303, на указанном КД —4740(блокировка УЗ + IP из IIS ActiveSync), ежедневный отчёт в Telegram (активные сессии черезquser), heartbeat, ротация логов, уведомления в Telegram и/или Email. - Установка задач: запуск
Login_Monitor.ps1 -InstallTasksсоздаёт:RDP-Login-Monitor(основной монитор),RDP-Login-Monitor-Watchdog(контроль процесса каждые 5 минут).
- Доменная доставка и обновления:
Deploy-LoginMonitor.ps1+version.txtс шарыNETLOGON. После успешного деплоя в приветственном сообщении Telegram может появиться отметка об обновлении (файлdeploy_last_update.txtрядом с логами). - Для полной инструкции по деплою/GPO используйте DEPLOY.md.
Encrypt-DpapiForRdpMonitor.ps1— опционально для подготовки DPAPI-строк токена/chat id.
Что изменилось (важное)
- Кодировка
.ps1: в репозитории добавлены.editorconfigи.gitattributes, чтобы*.ps1по умолчанию сохранялись как UTF-8 with BOM и с CRLF (это сильно снижает “кракозябры” и ошибки парсинга PowerShell). - Кодировка логов:
login_monitor.log/watchdog.logпишутся как UTF-8 с BOM (и при необходимости BOM добавляется к уже существующему файлу), чтобы в FAR/старых просмотрщиках не было ситуации “в консоли нормально, а в файле РЈРІРµ…” из‑за неверной авто-кодировки. auditpolна русской Windows: настройка/проверка аудита опирается на категориюВход/выходи подкатегорииВход в систему/Выход из системы(ожидается строкаУспех и сбой). Это устраняет ошибки вида0x00000057из‑за несуществующего на RU ОС имениLogon.- Стабильность:
auditpolзапускается черезcmd.exeс перехватомstdout+stderr, чтобы не ломать выполнение при$ErrorActionPreference = "Stop".
1) Подготовка
- Подготовьте папку установки:
C:\ProgramData\RDP-login-monitor\
- Скопируйте в неё как минимум:
Login_Monitor.ps1- (для доменного развёртывания отдельно на шаре)
Deploy-LoginMonitor.ps1иversion.txt.
- Откройте
Login_Monitor.ps1и задайте каналы оповещений:- Telegram:
$TelegramBotToken/$TelegramChatIDили...ProtectedB64 - Email (SMTP):
$MailSmtpHost,$MailFrom,$MailTo, при необходимости$MailSmtpUser/$MailSmtpPassword(или$MailSmtpPasswordProtectedB64через DPAPI) - Порядок:
$NotifyOrder— пусто = авто (Telegram → Email, только настроенные); иначеtelegram,emailилиemailи т.п. (допускаютсяtg,mail)
- Telegram:
- Запускайте с правами администратора (чтение
Securityжурнала и регистрация задач). - Логи и служебные файлы будут в:
C:\ProgramData\RDP-login-monitor\Logs\
- (Опционально) Подавление части алертов по списку — см. раздел «7) ignore.lst» ниже.
- (Опционально) Мониторинг блокировок AD на КД —
$LockoutMonitorDomainController,$NetBiosDomainName,$ExchangeIisLogPath(UNC к логам IIS ActiveSync),$ExchangeServerHostForIisExclude(IP сервера Exchange, не считать клиентским). В оповещении: пользователь из 4740 и IP из IIS (401 + ActiveSync). На других узлах блок 4740 не активен.
2) Ручной запуск
Используйте этот вариант для быстрой проверки старта/логики без установки задач планировщика.
powershell.exe -NoProfile -ExecutionPolicy Bypass -File "C:\ProgramData\RDP-login-monitor\Login_Monitor.ps1"
Примечание: при ручном запуске монитор работает в текущей сессии до остановки (например, Ctrl+C).
3) Запуск через Планировщик заданий (Task Scheduler)
Текущая схема: вручную задачи в GUI создавать не нужно.
Достаточно запустить:
powershell.exe -NoProfile -ExecutionPolicy Bypass -File "C:\ProgramData\RDP-login-monitor\Login_Monitor.ps1" -InstallTasks
Скрипт сам зарегистрирует RDP-Login-Monitor и RDP-Login-Monitor-Watchdog, а также запросит немедленный первый запуск задач.
Для доменной установки/обновления с шары вручную ничего в планировщике на клиенте настраивать не требуется: используйте Deploy-LoginMonitor.ps1 (подробно в DEPLOY.md).
4) Что проверять после запуска
- Логи:
C:\ProgramData\RDP-login-monitor\Logs\login_monitor.logC:\ProgramData\RDP-login-monitor\Logs\watchdog.log
- Heartbeat:
C:\ProgramData\RDP-login-monitor\Logs\last_heartbeat.txtобновляется по интервалу$HeartbeatInterval(по умолчанию раз в час).
- Ежедневный отчёт: после первого прохождения дневного слота (по умолчанию 09:00, задаётся
$DailyReportHour/$DailyReportMinuteвLogin_Monitor.ps1) в Telegram уходит сводка поquser; метка последнего отчёта —Logs\last_daily_report.txt. - При старте в Telegram/Email: строка «Каналы уведомлений» (фактический порядок доставки), плюс режим RDS/4740 по конфигурации.
- Telegram при старте: при установленном RD Session Host (или аналогичных компонентах RDS, не только шлюз) — строка про входы по RDP/RDS на этом сервере; при доступном журнале RD Gateway — отдельная строка про подключения к внутренним целевым ПК через шлюз (302/303). Узел только с ролью RD Gateway не дублирует формулировку «хост сессий».
5) Автоматический перезапуск при падении
Режим -Watchdog внутри Login_Monitor.ps1 делает:
- проверяет, есть ли процесс
powershell.exe/pwsh.exeсLogin_Monitor.ps1в командной строке; - если процесса нет — запускает монитор;
- если монитор уже есть — не дублирует экземпляр.
6) Дополнительные параметры и прочие файлы
-SkipScheduledTaskMaintenance: при обычном запуске монитора не выполнять проверку/пересоздание задач планировщика (если регистрацию задач ведёте только через-InstallTasksили вручную).Install-DeployScheduledTask.ps1— helper для периодического запускаDeploy-LoginMonitor.ps1с шары (см. DEPLOY.md).Watchdog_RDP_Monitor.ps1иInstall-ScheduledTasks.ps1— альтернативная схема с отдельным watchdog-файлом и путями по умолчаниюD:\Soft. Для новых установок рекомендуется встроенный режим-WatchdogвLogin_Monitor.ps1и задачиRDP-Login-Monitor/RDP-Login-Monitor-Watchdog.ignore.lst.exampleв репозитории — образец файлаignore.lstдля подавления отдельных уведомлений Security (см. раздел 7).
7) Подавление уведомлений Security: ignore.lst
В каталоге установки можно положить файл C:\ProgramData\RDP-login-monitor\ignore.lst (рядом с Login_Monitor.ps1). Правила из списка проверяются только для Telegram-уведомлений по событиям 4624/4625 журнала Security (успех/неудача входа). Жёстко заданные в скрипте исключения (ExcludedUsers, локальный IP, сервисные учётные записи и т.д.) по-прежнему действуют для всех типов событий; ignore.lst добавляет к ним дополнительные совпадения именно для 4624/4625.
События RD Gateway (302/303), RCM 1149, ежедневный отчёт и heartbeat этим файлом не настраиваются (для 1149 список не используется, даже если формально вызывается общая функция фильтрации).
Как читается файл
- Чтение выполняется по мере обработки событий; содержимое кэшируется в памяти. Если
LastWriteTimeUtcфайла изменился (редактирование и сохранение), список перечитывается автоматически — перезапуск монитора не обязателен. - Кодировка: UTF-8 (
Get-Content -Encoding UTF8). Строка может начинаться с BOM — он отбрасывается при разборе. - Пустые строки пропускаются. Строки, начинающиеся с
#или;, считаются комментариями. - Строка с
:: берётся первая двоеточие — всё слева (после обрезки пробелов) определяет тип правила, всё справа — значение. Если справа пусто, строка игнорируется. - Строка без
:: целиком трактуется как правило типа «любое совпадение» (см. ниже).
Типы правил (левая часть до первого :)
| Левая часть (фрагменты совпадают как regex, без учёта регистра) | Поле события |
|---|---|
рабоч, workstation, wks |
имя рабочей станции (WorkstationName и аналоги в XML события) |
польз, username, subject, account, target user, целое слово user |
имя пользователя (TargetUserName и др.) |
ip, ip адрес, ipaddress, адрес ip |
IP источника (IpAddress и др.), только если в событии есть непустой IP |
Если левая часть не подошла ни к одному типу, но двоеточие есть — используется режим как в разборе строк Telegram: тип «любое», значение — только правая часть (метка слева отбрасывается).
Совпадение для типа «любое» (строка без : или «неизвестная» метка слева от :)
Проверка по очереди:
- Если значение похоже на IPv4 — сравнивается с IP источника в событии (точное совпадение, без учёта регистра для текста не применимо).
- Если значение содержит
\— сравнивается с учётной записью: полное совпадение сDOMAIN\userили совпадение с SAM после последнего\(какDOMAIN\IVANOVпри правилеIVANOV). - Иначе сначала полное совпадение с именем рабочей станции, затем с учётной записью по тем же правилам, что в п.2.
Для явных типов User / Workstation / Ip используется только соответствующее поле (для пользователя — те же правила полного имени и SAM, что в п.2).
Примеры и поставка
- Расширенные примеры строк — в
ignore.lst.exampleв корне репозитория (скопируйте на сервер какignore.lstи отредактируйте). Deploy-LoginMonitor.ps1этот файл не копирует: правила обычно разные на каждой машине; при необходимости создайтеignore.lstвручную или через вашу систему конфигурации.
Ключевые слова (для поиска репозитория)
rdp, rd-gateway, rdp-gateway, rds, remote-desktop, windows-security-log, eventlog, event-id-4624, event-id-4625, event-id-302, event-id-303, powershell, telegram-bot, watchdog, gpo, netlogon, domain-deployment, windows-server, monitoring