Files
RDP-login-monitor/README.md
T
PTah b7786e8690 feat: AD lockout 4740 with IIS IPs and SMTP notifications (v1.5.2)
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.
2026-05-19 19:47:23 +10:00

15 KiB
Raw Blame History

RDP Login Monitor

PowerShell-набор для мониторинга входов в Windows с отправкой уведомлений в Telegram.

Актуальная схема (рекомендуется)

  • Базовый путь установки: C:\ProgramData\RDP-login-monitor\.
  • Основной скрипт: Login_Monitor.ps1 — журнал Security 4624/4625 (логика зависит от типа ОС: рабочая станция или сервер/КД), при наличии журнала — Remote Connection Manager 1149 (часто актуально для РС с RDP), при роли RD Gateway302/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) Подготовка

  1. Подготовьте папку установки:
    • C:\ProgramData\RDP-login-monitor\
  2. Скопируйте в неё как минимум:
    • Login_Monitor.ps1
    • (для доменного развёртывания отдельно на шаре) Deploy-LoginMonitor.ps1 и version.txt.
  3. Откройте Login_Monitor.ps1 и задайте каналы оповещений:
    • Telegram: $TelegramBotToken / $TelegramChatID или ...ProtectedB64
    • Email (SMTP): $MailSmtpHost, $MailFrom, $MailTo, при необходимости $MailSmtpUser / $MailSmtpPassword (или $MailSmtpPasswordProtectedB64 через DPAPI)
    • Порядок: $NotifyOrder — пусто = авто (Telegram → Email, только настроенные); иначе telegram,email или email и т.п. (допускаются tg, mail)
  4. Запускайте с правами администратора (чтение Security журнала и регистрация задач).
  5. Логи и служебные файлы будут в:
    • C:\ProgramData\RDP-login-monitor\Logs\
  6. (Опционально) Подавление части алертов по списку — см. раздел «7) ignore.lst» ниже.
  7. (Опционально) Мониторинг блокировок 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.log
    • C:\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: тип «любое», значение — только правая часть (метка слева отбрасывается).

Совпадение для типа «любое» (строка без : или «неизвестная» метка слева от :)

Проверка по очереди:

  1. Если значение похоже на IPv4 — сравнивается с IP источника в событии (точное совпадение, без учёта регистра для текста не применимо).
  2. Если значение содержит \ — сравнивается с учётной записью: полное совпадение с DOMAIN\user или совпадение с SAM после последнего \ (как DOMAIN\IVANOV при правиле IVANOV).
  3. Иначе сначала полное совпадение с именем рабочей станции, затем с учётной записью по тем же правилам, что в п.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