feat(Login): вынести локальные настройки в login_monitor.settings.ps1
Секреты, SMTP, 4740 и IP-исключения больше не в Login_Monitor.ps1 — не слетают при автообновлении с NETLOGON. Deploy создаёт settings из example при первой установке.
This commit is contained in:
@@ -175,6 +175,16 @@ try {
|
|||||||
|
|
||||||
Write-DeployLog "Deploy: корень дистрибутива: $shareRoot"
|
Write-DeployLog "Deploy: корень дистрибутива: $shareRoot"
|
||||||
|
|
||||||
|
$settingsLocal = Join-Path $InstallRoot 'login_monitor.settings.ps1'
|
||||||
|
$settingsExampleShare = Join-Path $shareRoot 'login_monitor.settings.example.ps1'
|
||||||
|
if (-not (Test-Path -LiteralPath $settingsLocal) -and (Test-Path -LiteralPath $settingsExampleShare)) {
|
||||||
|
if (-not (Test-Path -LiteralPath $InstallRoot)) {
|
||||||
|
New-Item -ItemType Directory -Path $InstallRoot -Force | Out-Null
|
||||||
|
}
|
||||||
|
Copy-Item -LiteralPath $settingsExampleShare -Destination $settingsLocal -Force
|
||||||
|
Write-DeployLog "Создан login_monitor.settings.ps1 из example (при следующих обновлениях не перезаписывается)."
|
||||||
|
}
|
||||||
|
|
||||||
if (-not (Test-Path -LiteralPath $sourceScript)) {
|
if (-not (Test-Path -LiteralPath $sourceScript)) {
|
||||||
Write-DeployLog "ОШИБКА: на шаре нет файла: $sourceScript"
|
Write-DeployLog "ОШИБКА: на шаре нет файла: $sourceScript"
|
||||||
exit 0
|
exit 0
|
||||||
|
|||||||
@@ -22,6 +22,7 @@
|
|||||||
- `Install-DomainMonitors.ps1`
|
- `Install-DomainMonitors.ps1`
|
||||||
- `Deploy-DomainMonitors.ps1`
|
- `Deploy-DomainMonitors.ps1`
|
||||||
- `exchange_monitor.settings.example.ps1`
|
- `exchange_monitor.settings.example.ps1`
|
||||||
|
- `login_monitor.settings.example.ps1`
|
||||||
|
|
||||||
## Запуск
|
## Запуск
|
||||||
|
|
||||||
|
|||||||
@@ -14,7 +14,8 @@
|
|||||||
|
|
||||||
| Файл | Назначение |
|
| Файл | Назначение |
|
||||||
|------|------------|
|
|------|------------|
|
||||||
| `Login_Monitor.ps1` | Основной скрипт (токен/chat id plain или DPAPI в параметрах). |
|
| `Login_Monitor.ps1` | Основной скрипт (логика мониторинга; без локальных секретов). |
|
||||||
|
| `login_monitor.settings.example.ps1` | Образец настроек на шаре (Telegram, SMTP, 4740). |
|
||||||
| `version.txt` | **Одна строка** — номер версии пакета на шаре (см. раздел «Версии» ниже). |
|
| `version.txt` | **Одна строка** — номер версии пакета на шаре (см. раздел «Версии» ниже). |
|
||||||
| `Deploy-LoginMonitor.ps1` | Установщик: сравнивает версию, копирует монитор, вызывает `-InstallTasks`, при необходимости запускает процесс монитора. |
|
| `Deploy-LoginMonitor.ps1` | Установщик: сравнивает версию, копирует монитор, вызывает `-InstallTasks`, при необходимости запускает процесс монитора. |
|
||||||
|
|
||||||
@@ -36,13 +37,31 @@
|
|||||||
|
|
||||||
Лог: **`C:\ProgramData\RDP-login-monitor\Logs\deploy.log`**.
|
Лог: **`C:\ProgramData\RDP-login-monitor\Logs\deploy.log`**.
|
||||||
|
|
||||||
|
## Локальные настройки: `login_monitor.settings.ps1`
|
||||||
|
|
||||||
|
На каждом компьютере: **`C:\ProgramData\RDP-login-monitor\login_monitor.settings.ps1`**.
|
||||||
|
|
||||||
|
- Секреты и параметры сайта (Telegram, SMTP, **4740**, `$IgnoreAdvapiNetworkLogonSourceIps`) — **только** в этом файле.
|
||||||
|
- Образец в репозитории и на шаре: **`login_monitor.settings.example.ps1`**.
|
||||||
|
- **`Deploy-LoginMonitor.ps1`** **не перезаписывает** `login_monitor.settings.ps1` при обновлении скрипта.
|
||||||
|
- Если файла нет, Deploy **один раз** копирует example → settings (дальше правки только локально).
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
$root = 'C:\ProgramData\RDP-login-monitor'
|
||||||
|
Copy-Item '\\B26\NETLOGON\RDP-login-monitor\login_monitor.settings.example.ps1' `
|
||||||
|
(Join-Path $root 'login_monitor.settings.ps1')
|
||||||
|
notepad (Join-Path $root 'login_monitor.settings.ps1')
|
||||||
|
```
|
||||||
|
|
||||||
|
DPAPI: **`Encrypt-DpapiForRdpMonitor.ps1`** — строки Base64 в settings.
|
||||||
|
|
||||||
## Опционально: `ignore.lst`
|
## Опционально: `ignore.lst`
|
||||||
|
|
||||||
Файл **`C:\ProgramData\RDP-login-monitor\ignore.lst`** — подавление отдельных алертов **4624/4625/4740**. Синтаксис — в **[README.md](../README.md)** (раздел 7) и **`ignore.lst.example`**. Deploy с шары **`ignore.lst` не копирует**.
|
Файл **`C:\ProgramData\RDP-login-monitor\ignore.lst`** — подавление отдельных алертов **4624/4625/4740**. Синтаксис — в **[README.md](../README.md)** (раздел 7) и **`ignore.lst.example`**. Deploy с шары **`ignore.lst` не копирует**.
|
||||||
|
|
||||||
## Опционально на КД: блокировки AD (4740)
|
## Опционально на КД: блокировки AD (4740)
|
||||||
|
|
||||||
Включается только если монитор запущен на КД с именем **`$LockoutMonitorDomainController`**. Параметры задаются **локально** на этом КД после деплоя (`$NetBiosDomainName`, `$ExchangeIisLogPath`, …).
|
Включается только если монитор запущен на КД с именем **`$LockoutMonitorDomainController`**. Параметры задаются в **`login_monitor.settings.ps1`** на этом КД (`$NetBiosDomainName`, `$ExchangeIisLogPath`, …).
|
||||||
|
|
||||||
## Heartbeat и watchdog
|
## Heartbeat и watchdog
|
||||||
|
|
||||||
@@ -109,9 +128,9 @@ powershell.exe -NoProfile -ExecutionPolicy Bypass -File "\\B26\NETLOGON\RDP-logi
|
|||||||
|
|
||||||
## Безопасность
|
## Безопасность
|
||||||
|
|
||||||
- Ограничьте ACL на шару (в скрипте могут быть секреты).
|
- Ограничьте ACL на шару (в example/settings могут быть секреты для домена B26).
|
||||||
- DPAPI: **`Encrypt-DpapiForRdpMonitor.ps1`**
|
- DPAPI: **`Encrypt-DpapiForRdpMonitor.ps1`** (значения в **`login_monitor.settings.ps1`**)
|
||||||
- Внутренний git: не пушить секреты в публичный GitHub
|
- Внутренний git (git.kalinamall.ru): доверенный; секреты допустимы в **`login_monitor.settings.example.ps1`**
|
||||||
|
|
||||||
## UNC и ExecutionPolicy
|
## UNC и ExecutionPolicy
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
# Запуск: от администратора на ТОМ ЖЕ компьютере, где будет Login_Monitor.ps1.
|
# Запуск: от администратора на ТОМ ЖЕ компьютере, где будет Login_Monitor.ps1.
|
||||||
# Результат (Base64) вставьте в $TelegramBotTokenProtectedB64 / $TelegramChatIDProtectedB64 / $MailSmtpPasswordProtectedB64.
|
# Результат (Base64) вставьте в login_monitor.settings.ps1 или exchange_monitor.settings.ps1:
|
||||||
|
# $TelegramBotTokenProtectedB64 / $TelegramChatIDProtectedB64 / $MailSmtpPasswordProtectedB64.
|
||||||
param(
|
param(
|
||||||
[Parameter(Mandatory = $true)][string]$PlainText
|
[Parameter(Mandatory = $true)][string]$PlainText
|
||||||
)
|
)
|
||||||
|
|||||||
+35
-24
@@ -21,16 +21,18 @@
|
|||||||
Add-Type -AssemblyName System.Security
|
Add-Type -AssemblyName System.Security
|
||||||
$p=[Text.Encoding]::UTF8.GetBytes('<токен>')
|
$p=[Text.Encoding]::UTF8.GetBytes('<токен>')
|
||||||
[Convert]::ToBase64String([Security.Cryptography.ProtectedData]::Protect($p,$null,'LocalMachine'))
|
[Convert]::ToBase64String([Security.Cryptography.ProtectedData]::Protect($p,$null,'LocalMachine'))
|
||||||
Полученную строку вставьте в $TelegramBotTokenProtectedB64 (и аналогично для chat id).
|
Полученную строку вставьте в $TelegramBotTokenProtectedB64 в login_monitor.settings.ps1 (и аналогично для chat id).
|
||||||
|
Локальные настройки (секреты, КД, SMTP): C:\ProgramData\RDP-login-monitor\login_monitor.settings.ps1
|
||||||
|
(образец login_monitor.settings.example.ps1). Файл настроек не перезаписывается при автообновлении скрипта.
|
||||||
#>
|
#>
|
||||||
|
|
||||||
[CmdletBinding()]
|
[CmdletBinding()]
|
||||||
param(
|
param(
|
||||||
[string]$TelegramBotToken = "8239219522:AAEyOZX3cwNfgGOMDkf-mgjTIuoaOh5gF7I",
|
[string]$TelegramBotToken = '',
|
||||||
[string]$TelegramChatID = "2843230",
|
[string]$TelegramChatID = '',
|
||||||
[string]$TelegramBotTokenProtectedB64 = "",
|
[string]$TelegramBotTokenProtectedB64 = '',
|
||||||
[string]$TelegramChatIDProtectedB64 = "",
|
[string]$TelegramChatIDProtectedB64 = '',
|
||||||
[string]$MailSmtpPasswordProtectedB64 = "",
|
[string]$MailSmtpPasswordProtectedB64 = '',
|
||||||
[switch]$Watchdog,
|
[switch]$Watchdog,
|
||||||
[switch]$InstallTasks,
|
[switch]$InstallTasks,
|
||||||
[switch]$SkipScheduledTaskMaintenance
|
[switch]$SkipScheduledTaskMaintenance
|
||||||
@@ -72,7 +74,7 @@ $script:MonitorSingletonLockStream = $null
|
|||||||
# строки ниже, если правки «мелкие» и вы не хотите менять отображаемую версию в логах).
|
# строки ниже, если правки «мелкие» и вы не хотите менять отображаемую версию в логах).
|
||||||
# Рекомендация: при значимых релизах меняйте и $ScriptVersion, и version.txt одинаково; при только
|
# Рекомендация: при значимых релизах меняйте и $ScriptVersion, и version.txt одинаково; при только
|
||||||
# исправлениях на шаре — достаточно поднять patch в version.txt (например 1.3.0.1).
|
# исправлениях на шаре — достаточно поднять patch в version.txt (например 1.3.0.1).
|
||||||
$ScriptVersion = "1.5.10"
|
$ScriptVersion = "1.5.11"
|
||||||
|
|
||||||
# Логи (все под InstallRoot)
|
# Логи (все под InstallRoot)
|
||||||
$LogFile = Join-Path $script:InstallRoot "Logs\login_monitor.log"
|
$LogFile = Join-Path $script:InstallRoot "Logs\login_monitor.log"
|
||||||
@@ -146,21 +148,17 @@ $ExcludedComputerPatterns = @(
|
|||||||
)
|
)
|
||||||
|
|
||||||
# Узкое исключение "шумовых" сетевых логонов (LogonType=3) от конкретных источников.
|
# Узкое исключение "шумовых" сетевых логонов (LogonType=3) от конкретных источников.
|
||||||
# Пример: Proxmox Mail Gateway / LDAP sync, которые периодически создают 4624 с LogonProcessName=Advapi.
|
# IP-список — в login_monitor.settings.ps1 ($IgnoreAdvapiNetworkLogonSourceIps).
|
||||||
$IgnoreAdvapiNetworkLogonSourceIps = @(
|
$IgnoreAdvapiNetworkLogonSourceIps = @()
|
||||||
"192.168.160.57"
|
|
||||||
)
|
|
||||||
$IgnoreAdvapiNetworkLogonProcessContains = "Advapi"
|
$IgnoreAdvapiNetworkLogonProcessContains = "Advapi"
|
||||||
|
|
||||||
# Блокировка учётной записи AD (Security 4740) + IP клиента из логов IIS ActiveSync.
|
# Блокировка учётной записи AD (Security 4740) + IP клиента из логов IIS ActiveSync.
|
||||||
# Мониторинг включается только если скрипт запущен на узле, имя которого совпадает с $LockoutMonitorDomainController.
|
# Параметры КД/IIS — в login_monitor.settings.ps1.
|
||||||
# Конфигурация домена B26 / DC3 — внутренний дистрибутив (git.kalinamall.ru). Не пушить этот файл в публичный GitHub.
|
$LockoutMonitorDomainController = ''
|
||||||
$LockoutMonitorDomainController = "K6A-DC3"
|
$NetBiosDomainName = ''
|
||||||
$NetBiosDomainName = "B26"
|
$ExchangeIisLogPath = ''
|
||||||
$ExchangeIisLogPath = "\\fifth.kalinamall.ru\c$\inetpub\logs\LogFiles\W3SVC1"
|
$ExchangeServerHostForIisExclude = ''
|
||||||
$ExchangeServerHostForIisExclude = ""
|
|
||||||
$ExchangeIisLogTailLines = 5000
|
$ExchangeIisLogTailLines = 5000
|
||||||
# Окно поиска IP в IIS: только строки за N минут до события 4740 (локальное время сервера IIS).
|
|
||||||
$ExchangeIisLogMinutesBeforeLockout = 30
|
$ExchangeIisLogMinutesBeforeLockout = 30
|
||||||
|
|
||||||
# Агрегация неудачных входов Security 4625 (вариант C: два порога). Автоблокировка IP не выполняется.
|
# Агрегация неудачных входов Security 4625 (вариант C: два порога). Автоблокировка IP не выполняется.
|
||||||
@@ -176,16 +174,24 @@ $FailedLogonRateLimitIpThreshold = 12
|
|||||||
$FailedLogonRateLimitIpCooldownSeconds = 300
|
$FailedLogonRateLimitIpCooldownSeconds = 300
|
||||||
|
|
||||||
# Очередь оповещений: telegram, email (или tg, mail). Пусто = авто: настроенные каналы, порядок telegram → email.
|
# Очередь оповещений: telegram, email (или tg, mail). Пусто = авто: настроенные каналы, порядок telegram → email.
|
||||||
$NotifyOrder = "tg"
|
# Переопределение — в login_monitor.settings.ps1.
|
||||||
$MailSmtpHost = ""
|
$NotifyOrder = 'tg'
|
||||||
|
$MailSmtpHost = ''
|
||||||
$MailSmtpPort = 587
|
$MailSmtpPort = 587
|
||||||
$MailSmtpUser = ""
|
$MailSmtpUser = ''
|
||||||
$MailSmtpPassword = ""
|
$MailSmtpPassword = ''
|
||||||
$MailFrom = ""
|
$MailFrom = ''
|
||||||
$MailTo = ""
|
$MailTo = ''
|
||||||
$MailSmtpStartTls = $true
|
$MailSmtpStartTls = $true
|
||||||
$MailSmtpSsl = $false
|
$MailSmtpSsl = $false
|
||||||
|
|
||||||
|
$script:LoginMonitorSettingsFile = Join-Path $script:InstallRoot 'login_monitor.settings.ps1'
|
||||||
|
$script:LoginMonitorSettingsLoaded = $false
|
||||||
|
if (Test-Path -LiteralPath $script:LoginMonitorSettingsFile) {
|
||||||
|
. $script:LoginMonitorSettingsFile
|
||||||
|
$script:LoginMonitorSettingsLoaded = $true
|
||||||
|
}
|
||||||
|
|
||||||
# ============================================
|
# ============================================
|
||||||
# ИНИЦИАЛИЗАЦИЯ
|
# ИНИЦИАЛИЗАЦИЯ
|
||||||
# ============================================
|
# ============================================
|
||||||
@@ -793,6 +799,11 @@ if (-not (Test-Administrator)) {
|
|||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
Write-Log "Скрипт запущен с правами администратора, версия $ScriptVersion"
|
Write-Log "Скрипт запущен с правами администратора, версия $ScriptVersion"
|
||||||
|
if ($script:LoginMonitorSettingsLoaded) {
|
||||||
|
Write-Log "Настройки: login_monitor.settings.ps1 загружен."
|
||||||
|
} else {
|
||||||
|
Write-Log "Предупреждение: login_monitor.settings.ps1 не найден — Telegram/SMTP/4740 не настроены (скопируйте login_monitor.settings.example.ps1)."
|
||||||
|
}
|
||||||
|
|
||||||
Invoke-RdpMonitorProcessMigrationAndRelaunch
|
Invoke-RdpMonitorProcessMigrationAndRelaunch
|
||||||
Lock-RdpMonitorSingleInstance
|
Lock-RdpMonitorSingleInstance
|
||||||
|
|||||||
@@ -11,10 +11,12 @@ PowerShell-набор для мониторинга входов в Windows с
|
|||||||
- `RDP-Login-Monitor-Watchdog` (контроль процесса каждые 5 минут).
|
- `RDP-Login-Monitor-Watchdog` (контроль процесса каждые 5 минут).
|
||||||
- Доменная доставка и обновления: **`Deploy-LoginMonitor.ps1`** + **`version.txt`** с шары `NETLOGON`. После успешного деплоя в приветственном сообщении (Telegram/Email) может появиться отметка об обновлении (файл **`deploy_last_update.txt`** рядом с логами).
|
- Доменная доставка и обновления: **`Deploy-LoginMonitor.ps1`** + **`version.txt`** с шары `NETLOGON`. После успешного деплоя в приветственном сообщении (Telegram/Email) может появиться отметка об обновлении (файл **`deploy_last_update.txt`** рядом с логами).
|
||||||
- Документация по развёртыванию: **[Docs/README.md](Docs/README.md)** (RDP-монитор, Exchange, NETLOGON).
|
- Документация по развёртыванию: **[Docs/README.md](Docs/README.md)** (RDP-монитор, Exchange, NETLOGON).
|
||||||
- **`Encrypt-DpapiForRdpMonitor.ps1`** — опционально для подготовки DPAPI-строк токена/chat id и пароля SMTP (`$MailSmtpPasswordProtectedB64`).
|
- **`Encrypt-DpapiForRdpMonitor.ps1`** — опционально для подготовки DPAPI-строк токена/chat id и пароля SMTP (`$MailSmtpPasswordProtectedB64` в файле настроек).
|
||||||
|
- **Локальные настройки RDP-монитора:** **`login_monitor.settings.ps1`** в каталоге установки (образец **`login_monitor.settings.example.ps1`**). При автообновлении **`Login_Monitor.ps1`** с шары файл настроек **не перезаписывается** (как **`exchange_monitor.settings.ps1`** для Exchange).
|
||||||
|
|
||||||
## Что изменилось (важное)
|
## Что изменилось (важное)
|
||||||
|
|
||||||
|
- **Локальные настройки RDP-монитора** вынесены в **`login_monitor.settings.ps1`** (образец **`login_monitor.settings.example.ps1`**). При автообновлении **`Login_Monitor.ps1`** с шары секреты и параметры КД **не слетают**. Deploy при отсутствии settings создаёт файл один раз из example на шаре.
|
||||||
- **Кодировка `.ps1`**: в репозитории добавлены `.editorconfig` и `.gitattributes`, чтобы `*.ps1` по умолчанию сохранялись как **UTF-8 with BOM** и с **CRLF** (это сильно снижает “кракозябры” и ошибки парсинга PowerShell).
|
- **Кодировка `.ps1`**: в репозитории добавлены `.editorconfig` и `.gitattributes`, чтобы `*.ps1` по умолчанию сохранялись как **UTF-8 with BOM** и с **CRLF** (это сильно снижает “кракозябры” и ошибки парсинга PowerShell).
|
||||||
- **Кодировка логов**: `login_monitor.log` / `watchdog.log` пишутся как **UTF-8 с BOM** (и при необходимости BOM добавляется к уже существующему файлу), чтобы в **FAR/старых просмотрщиках** не было ситуации “в консоли нормально, а в файле РЈРІРµ…” из‑за неверной авто-кодировки.
|
- **Кодировка логов**: `login_monitor.log` / `watchdog.log` пишутся как **UTF-8 с BOM** (и при необходимости BOM добавляется к уже существующему файлу), чтобы в **FAR/старых просмотрщиках** не было ситуации “в консоли нормально, а в файле РЈРІРµ…” из‑за неверной авто-кодировки.
|
||||||
- **`auditpol` на русской Windows**: настройка/проверка аудита опирается на категорию **`Вход/выход`** и подкатегории **`Вход в систему` / `Выход из системы`** (ожидается строка **`Успех и сбой`**). Это устраняет ошибки вида `0x00000057` из‑за несуществующего на RU ОС имени `Logon`.
|
- **`auditpol` на русской Windows**: настройка/проверка аудита опирается на категорию **`Вход/выход`** и подкатегории **`Вход в систему` / `Выход из системы`** (ожидается строка **`Успех и сбой`**). Это устраняет ошибки вида `0x00000057` из‑за несуществующего на RU ОС имени `Logon`.
|
||||||
@@ -28,8 +30,9 @@ PowerShell-набор для мониторинга входов в Windows с
|
|||||||
- `C:\ProgramData\RDP-login-monitor\`
|
- `C:\ProgramData\RDP-login-monitor\`
|
||||||
2. Скопируйте в неё как минимум:
|
2. Скопируйте в неё как минимум:
|
||||||
- `Login_Monitor.ps1`
|
- `Login_Monitor.ps1`
|
||||||
- (для доменного развёртывания отдельно на шаре) `Deploy-LoginMonitor.ps1` и `version.txt`.
|
- `login_monitor.settings.example.ps1` → переименуйте в **`login_monitor.settings.ps1`** и задайте параметры (см. п. 3)
|
||||||
3. Откройте `Login_Monitor.ps1` и задайте каналы оповещений:
|
- (для доменного развёртывания отдельно на шаре) `Deploy-LoginMonitor.ps1`, `version.txt` и `login_monitor.settings.example.ps1`
|
||||||
|
3. Настройте **`C:\ProgramData\RDP-login-monitor\login_monitor.settings.ps1`** (не редактируйте секреты в `Login_Monitor.ps1` — они перезапишутся при деплое):
|
||||||
- **Telegram:** `$TelegramBotToken` / `$TelegramChatID` или `...ProtectedB64`
|
- **Telegram:** `$TelegramBotToken` / `$TelegramChatID` или `...ProtectedB64`
|
||||||
- **Email (SMTP):** `$MailSmtpHost`, `$MailFrom`, `$MailTo`, `$MailSmtpPort` (по умолчанию 587), при необходимости `$MailSmtpUser` / `$MailSmtpPassword` (или `$MailSmtpPasswordProtectedB64` через DPAPI), `$MailSmtpStartTls` / `$MailSmtpSsl`
|
- **Email (SMTP):** `$MailSmtpHost`, `$MailFrom`, `$MailTo`, `$MailSmtpPort` (по умолчанию 587), при необходимости `$MailSmtpUser` / `$MailSmtpPassword` (или `$MailSmtpPasswordProtectedB64` через DPAPI), `$MailSmtpStartTls` / `$MailSmtpSsl`
|
||||||
- **Порядок:** `$NotifyOrder` — пусто = авто (Telegram → Email, только настроенные); иначе `telegram,email` или `email` и т.п. (допускаются `tg`, `mail`)
|
- **Порядок:** `$NotifyOrder` — пусто = авто (Telegram → Email, только настроенные); иначе `telegram,email` или `email` и т.п. (допускаются `tg`, `mail`)
|
||||||
@@ -37,7 +40,7 @@ PowerShell-набор для мониторинга входов в Windows с
|
|||||||
5. Логи и служебные файлы будут в:
|
5. Логи и служебные файлы будут в:
|
||||||
- `C:\ProgramData\RDP-login-monitor\Logs\`
|
- `C:\ProgramData\RDP-login-monitor\Logs\`
|
||||||
6. (Опционально) Подавление части алертов по списку — см. раздел **«7) ignore.lst»** ниже.
|
6. (Опционально) Подавление части алертов по списку — см. раздел **«7) ignore.lst»** ниже.
|
||||||
7. (Опционально) Мониторинг блокировок AD на КД — **`$LockoutMonitorDomainController`** (короткое имя узла, на котором **установлен и запущен** монитор), **`$NetBiosDomainName`**, **`$ExchangeIisLogPath`**, **`$ExchangeIisLogMinutesBeforeLockout`** (по умолчанию 30), **`$ExchangeIisLogTailLines`** (по умолчанию 5000), **`$ExchangeServerHostForIisExclude`**. В оповещении: пользователь из 4740 и IP из IIS за окно до блокировки. В **`ignore.lst`** префикс **`4740:`** или **`all:`** — см. **`ignore.lst.example`**.
|
7. (Опционально) Мониторинг блокировок AD на КД — в **`login_monitor.settings.ps1`**: **`$LockoutMonitorDomainController`** (короткое имя узла, на котором **установлен и запущен** монитор), **`$NetBiosDomainName`**, **`$ExchangeIisLogPath`**, **`$ExchangeIisLogMinutesBeforeLockout`** (по умолчанию 30), **`$ExchangeIisLogTailLines`** (по умолчанию 5000), **`$ExchangeServerHostForIisExclude`**. В оповещении: пользователь из 4740 и IP из IIS за окно до блокировки. В **`ignore.lst`** префикс **`4740:`** или **`all:`** — см. **`ignore.lst.example`**.
|
||||||
8. Heartbeat: при отсутствии обновления **`Logs\last_heartbeat.txt`** дольше **`$HeartbeatStaleAlertMultiplier` × `$HeartbeatInterval`** (по умолчанию 2×1 ч) — оповещение в Telegram/Email.
|
8. Heartbeat: при отсутствии обновления **`Logs\last_heartbeat.txt`** дольше **`$HeartbeatStaleAlertMultiplier` × `$HeartbeatInterval`** (по умолчанию 2×1 ч) — оповещение в Telegram/Email.
|
||||||
|
|
||||||
## 2) Ручной запуск
|
## 2) Ручной запуск
|
||||||
@@ -90,6 +93,7 @@ powershell.exe -NoProfile -ExecutionPolicy Bypass -File "C:\ProgramData\RDP-logi
|
|||||||
- **`Install-DeployScheduledTask.ps1`** — helper для периодического запуска **`Deploy-LoginMonitor.ps1`** с шары (см. **[DEPLOY.md](DEPLOY.md)**).
|
- **`Install-DeployScheduledTask.ps1`** — helper для периодического запуска **`Deploy-LoginMonitor.ps1`** с шары (см. **[DEPLOY.md](DEPLOY.md)**).
|
||||||
- **`Watchdog_RDP_Monitor.ps1`** и **`Install-ScheduledTasks.ps1`** — **альтернативная** схема с отдельным watchdog-файлом и путями по умолчанию **`D:\Soft`**. Для новых установок рекомендуется встроенный режим **`-Watchdog`** в **`Login_Monitor.ps1`** и задачи **`RDP-Login-Monitor`** / **`RDP-Login-Monitor-Watchdog`**.
|
- **`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).
|
- **`ignore.lst.example`** в репозитории — образец файла **`ignore.lst`** для подавления отдельных уведомлений Security (см. раздел 7).
|
||||||
|
- **`login_monitor.settings.example.ps1`** — образец **`login_monitor.settings.ps1`** (Telegram, SMTP, 4740, локальные IP-исключения). Deploy при первой установке может создать `login_monitor.settings.ps1` из example автоматически.
|
||||||
|
|
||||||
## 7) Подавление уведомлений Security: `ignore.lst`
|
## 7) Подавление уведомлений Security: `ignore.lst`
|
||||||
|
|
||||||
@@ -138,7 +142,7 @@ powershell.exe -NoProfile -ExecutionPolicy Bypass -File "C:\ProgramData\RDP-logi
|
|||||||
### Примеры и поставка
|
### Примеры и поставка
|
||||||
|
|
||||||
- Расширенные примеры строк — в **`ignore.lst.example`** в корне репозитория (скопируйте на сервер как **`ignore.lst`** и отредактируйте).
|
- Расширенные примеры строк — в **`ignore.lst.example`** в корне репозитория (скопируйте на сервер как **`ignore.lst`** и отредактируйте).
|
||||||
- **`Deploy-LoginMonitor.ps1`** этот файл **не копирует**: правила обычно разные на каждой машине; при необходимости создайте `ignore.lst` вручную или через вашу систему конфигурации.
|
- **`Deploy-LoginMonitor.ps1`** **`ignore.lst`** и **`login_monitor.settings.ps1`** **не копирует и не перезаписывает** — правила и секреты локальны; при отсутствии settings Deploy создаёт его один раз из **`login_monitor.settings.example.ps1`** на шаре.
|
||||||
|
|
||||||
## Ключевые слова (для поиска репозитория)
|
## Ключевые слова (для поиска репозитория)
|
||||||
|
|
||||||
|
|||||||
+8
-5
@@ -11,7 +11,8 @@ PowerShell toolkit for monitoring Windows logons with Telegram and/or Email (SMT
|
|||||||
- `RDP-Login-Monitor-Watchdog` (process health check every 5 minutes).
|
- `RDP-Login-Monitor-Watchdog` (process health check every 5 minutes).
|
||||||
- Domain delivery and upgrades: **`Deploy-LoginMonitor.ps1`** + **`version.txt`** on a share such as `NETLOGON`. After a successful deploy, the startup notification may include an update note (file **`deploy_last_update.txt`** next to logs).
|
- Domain delivery and upgrades: **`Deploy-LoginMonitor.ps1`** + **`version.txt`** on a share such as `NETLOGON`. After a successful deploy, the startup notification may include an update note (file **`deploy_last_update.txt`** next to logs).
|
||||||
- Deployment docs: **[Docs/README.md](Docs/README.md)** (RDP monitor, Exchange, NETLOGON).
|
- Deployment docs: **[Docs/README.md](Docs/README.md)** (RDP monitor, Exchange, NETLOGON).
|
||||||
- **`Encrypt-DpapiForRdpMonitor.ps1`** — optional helper to prepare DPAPI-protected Base64 for the bot token / chat id and SMTP password (`$MailSmtpPasswordProtectedB64`).
|
- **`Encrypt-DpapiForRdpMonitor.ps1`** — optional helper to prepare DPAPI-protected Base64 for the bot token / chat id and SMTP password (`$MailSmtpPasswordProtectedB64` in the settings file).
|
||||||
|
- **RDP monitor local settings:** **`login_monitor.settings.ps1`** in the install directory (template **`login_monitor.settings.example.ps1`**). When **`Login_Monitor.ps1`** is auto-updated from the share, the settings file is **not overwritten** (same pattern as **`exchange_monitor.settings.ps1`** for Exchange).
|
||||||
|
|
||||||
## Notable behavior
|
## Notable behavior
|
||||||
|
|
||||||
@@ -28,8 +29,9 @@ PowerShell toolkit for monitoring Windows logons with Telegram and/or Email (SMT
|
|||||||
- `C:\ProgramData\RDP-login-monitor\`
|
- `C:\ProgramData\RDP-login-monitor\`
|
||||||
2. Copy at least:
|
2. Copy at least:
|
||||||
- `Login_Monitor.ps1`
|
- `Login_Monitor.ps1`
|
||||||
- (for domain rollout on a share) `Deploy-LoginMonitor.ps1` and `version.txt`.
|
- `login_monitor.settings.example.ps1` → rename to **`login_monitor.settings.ps1`** and configure (see step 3)
|
||||||
3. Edit `Login_Monitor.ps1` and configure notification channels:
|
- (for domain rollout on a share) `Deploy-LoginMonitor.ps1`, `version.txt`, and `login_monitor.settings.example.ps1`
|
||||||
|
3. Configure **`C:\ProgramData\RDP-login-monitor\login_monitor.settings.ps1`** (do not put secrets in `Login_Monitor.ps1` — they are overwritten on deploy):
|
||||||
- **Telegram:** `$TelegramBotToken` / `$TelegramChatID` or `...ProtectedB64`
|
- **Telegram:** `$TelegramBotToken` / `$TelegramChatID` or `...ProtectedB64`
|
||||||
- **Email (SMTP):** `$MailSmtpHost`, `$MailFrom`, `$MailTo`, `$MailSmtpPort` (default 587), optionally `$MailSmtpUser` / `$MailSmtpPassword` (or `$MailSmtpPasswordProtectedB64` via DPAPI), `$MailSmtpStartTls` / `$MailSmtpSsl`
|
- **Email (SMTP):** `$MailSmtpHost`, `$MailFrom`, `$MailTo`, `$MailSmtpPort` (default 587), optionally `$MailSmtpUser` / `$MailSmtpPassword` (or `$MailSmtpPasswordProtectedB64` via DPAPI), `$MailSmtpStartTls` / `$MailSmtpSsl`
|
||||||
- **Order:** `$NotifyOrder` — empty = auto (Telegram → Email, configured channels only); otherwise `telegram,email`, `email`, etc. (`tg`, `mail` are accepted)
|
- **Order:** `$NotifyOrder` — empty = auto (Telegram → Email, configured channels only); otherwise `telegram,email`, `email`, etc. (`tg`, `mail` are accepted)
|
||||||
@@ -37,7 +39,7 @@ PowerShell toolkit for monitoring Windows logons with Telegram and/or Email (SMT
|
|||||||
5. Logs and auxiliary files:
|
5. Logs and auxiliary files:
|
||||||
- `C:\ProgramData\RDP-login-monitor\Logs\`
|
- `C:\ProgramData\RDP-login-monitor\Logs\`
|
||||||
6. (Optional) Suppress some Security alerts via **`ignore.lst`** — see **section 7** below.
|
6. (Optional) Suppress some Security alerts via **`ignore.lst`** — see **section 7** below.
|
||||||
7. (Optional) AD account lockout monitoring on a DC — **`$LockoutMonitorDomainController`** (short hostname of the machine **where the monitor is installed and running**), **`$NetBiosDomainName`**, **`$ExchangeIisLogPath`**, **`$ExchangeIisLogMinutesBeforeLockout`** (default 30), **`$ExchangeIisLogTailLines`** (default 5000), **`$ExchangeServerHostForIisExclude`**. Alerts include the user from event **4740** and client IPs from IIS within the time window before lockout. In **`ignore.lst`** use prefix **`4740:`** or **`all:`** — see **`ignore.lst.example`**.
|
7. (Optional) AD account lockout monitoring on a DC — in **`login_monitor.settings.ps1`**: **`$LockoutMonitorDomainController`** (short hostname of the machine **where the monitor is installed and running**), **`$NetBiosDomainName`**, **`$ExchangeIisLogPath`**, **`$ExchangeIisLogMinutesBeforeLockout`** (default 30), **`$ExchangeIisLogTailLines`** (default 5000), **`$ExchangeServerHostForIisExclude`**. Alerts include the user from event **4740** and client IPs from IIS within the time window before lockout. In **`ignore.lst`** use prefix **`4740:`** or **`all:`** — see **`ignore.lst.example`**.
|
||||||
8. Heartbeat: if **`Logs\last_heartbeat.txt`** is not updated for longer than **`$HeartbeatStaleAlertMultiplier` × `$HeartbeatInterval`** (default 2×1 h) — alert via Telegram/Email.
|
8. Heartbeat: if **`Logs\last_heartbeat.txt`** is not updated for longer than **`$HeartbeatStaleAlertMultiplier` × `$HeartbeatInterval`** (default 2×1 h) — alert via Telegram/Email.
|
||||||
|
|
||||||
## 2) Manual run
|
## 2) Manual run
|
||||||
@@ -90,6 +92,7 @@ For domain deployment from a share you do not configure the scheduler on clients
|
|||||||
- **`Install-DeployScheduledTask.ps1`** — helper to run **`Deploy-LoginMonitor.ps1`** from a share on a schedule (see **[DEPLOY.md](DEPLOY.md)**).
|
- **`Install-DeployScheduledTask.ps1`** — helper to run **`Deploy-LoginMonitor.ps1`** from a share on a schedule (see **[DEPLOY.md](DEPLOY.md)**).
|
||||||
- **`Watchdog_RDP_Monitor.ps1`** and **`Install-ScheduledTasks.ps1`** — **alternate** layout with a separate watchdog script and default paths under **`D:\Soft`**. For new installs, prefer the built-in **`-Watchdog`** in **`Login_Monitor.ps1`** and tasks **`RDP-Login-Monitor`** / **`RDP-Login-Monitor-Watchdog`**.
|
- **`Watchdog_RDP_Monitor.ps1`** and **`Install-ScheduledTasks.ps1`** — **alternate** layout with a separate watchdog script and default paths under **`D:\Soft`**. For new installs, prefer the built-in **`-Watchdog`** in **`Login_Monitor.ps1`** and tasks **`RDP-Login-Monitor`** / **`RDP-Login-Monitor-Watchdog`**.
|
||||||
- **`ignore.lst.example`** in the repo is a template for **`ignore.lst`** to suppress selected Security notifications (see section 7).
|
- **`ignore.lst.example`** in the repo is a template for **`ignore.lst`** to suppress selected Security notifications (see section 7).
|
||||||
|
- **`login_monitor.settings.example.ps1`** — template for **`login_monitor.settings.ps1`** (Telegram, SMTP, 4740, local IP exclusions). Deploy may create `login_monitor.settings.ps1` from the example on first install.
|
||||||
|
|
||||||
## 7) Suppressing Security alerts: `ignore.lst`
|
## 7) Suppressing Security alerts: `ignore.lst`
|
||||||
|
|
||||||
@@ -138,7 +141,7 @@ Explicit **User** / **Workstation** / **Ip** kinds only compare their respective
|
|||||||
### Examples and deployment
|
### Examples and deployment
|
||||||
|
|
||||||
- See **`ignore.lst.example`** in the repo; copy it to the server as **`ignore.lst`** and edit.
|
- See **`ignore.lst.example`** in the repo; copy it to the server as **`ignore.lst`** and edit.
|
||||||
- **`Deploy-LoginMonitor.ps1`** does **not** copy this file — rules are usually host-specific; create **`ignore.lst`** manually or via your configuration tooling.
|
- **`Deploy-LoginMonitor.ps1`** does **not** copy or overwrite **`ignore.lst`** or **`login_monitor.settings.ps1`**; if settings are missing, Deploy creates them once from **`login_monitor.settings.example.ps1`** on the share.
|
||||||
|
|
||||||
## Keywords (for discovery)
|
## Keywords (for discovery)
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,41 @@
|
|||||||
|
<#
|
||||||
|
.SYNOPSIS
|
||||||
|
Локальные настройки Login_Monitor.ps1
|
||||||
|
.DESCRIPTION
|
||||||
|
Скопируйте в C:\ProgramData\RDP-login-monitor\login_monitor.settings.ps1
|
||||||
|
и при необходимости отредактируйте. Файл login_monitor.settings.ps1 не перезаписывается
|
||||||
|
при автообновлении Login_Monitor.ps1 с шары (Deploy-LoginMonitor.ps1).
|
||||||
|
При первой установке Deploy может создать login_monitor.settings.ps1 из этого example автоматически.
|
||||||
|
#>
|
||||||
|
|
||||||
|
# --- Telegram (или DPAPI Base64 через Encrypt-DpapiForRdpMonitor.ps1) ---
|
||||||
|
$TelegramBotToken = '8239219522:AAEyOZX3cwNfgGOMDkf-mgjTIuoaOh5gF7I'
|
||||||
|
$TelegramChatID = '2843230'
|
||||||
|
# $TelegramBotTokenProtectedB64 = ''
|
||||||
|
# $TelegramChatIDProtectedB64 = ''
|
||||||
|
|
||||||
|
# --- Email (опционально) ---
|
||||||
|
$NotifyOrder = 'tg'
|
||||||
|
# $MailSmtpHost = 'smtp.example.com'
|
||||||
|
# $MailSmtpPort = 587
|
||||||
|
# $MailSmtpUser = ''
|
||||||
|
# $MailSmtpPassword = ''
|
||||||
|
# $MailFrom = 'monitor@example.com'
|
||||||
|
# $MailTo = 'admin@example.com'
|
||||||
|
# $MailSmtpStartTls = $true
|
||||||
|
# $MailSmtpSsl = $false
|
||||||
|
# $MailSmtpPasswordProtectedB64 = ''
|
||||||
|
|
||||||
|
# --- Узкое исключение шумовых сетевых логонов (LogonType=3, Advapi) ---
|
||||||
|
$IgnoreAdvapiNetworkLogonSourceIps = @(
|
||||||
|
'192.168.160.57'
|
||||||
|
)
|
||||||
|
|
||||||
|
# --- Блокировка учётной записи AD (4740) + IP из IIS ActiveSync ---
|
||||||
|
# Мониторинг включается только на КД с именем $LockoutMonitorDomainController.
|
||||||
|
$LockoutMonitorDomainController = 'K6A-DC3'
|
||||||
|
$NetBiosDomainName = 'B26'
|
||||||
|
$ExchangeIisLogPath = '\\fifth.kalinamall.ru\c$\inetpub\logs\LogFiles\W3SVC1'
|
||||||
|
$ExchangeServerHostForIisExclude = ''
|
||||||
|
$ExchangeIisLogTailLines = 5000
|
||||||
|
$ExchangeIisLogMinutesBeforeLockout = 30
|
||||||
@@ -28,7 +28,8 @@ $DistFiles = @(
|
|||||||
'Notify-Common.ps1',
|
'Notify-Common.ps1',
|
||||||
'Install-DomainMonitors.ps1',
|
'Install-DomainMonitors.ps1',
|
||||||
'Deploy-DomainMonitors.ps1',
|
'Deploy-DomainMonitors.ps1',
|
||||||
'exchange_monitor.settings.example.ps1'
|
'exchange_monitor.settings.example.ps1',
|
||||||
|
'login_monitor.settings.example.ps1'
|
||||||
)
|
)
|
||||||
|
|
||||||
function Write-UpdateLog {
|
function Write-UpdateLog {
|
||||||
|
|||||||
+1
-1
@@ -1 +1 @@
|
|||||||
1.6.7
|
1.6.8
|
||||||
|
|||||||
Reference in New Issue
Block a user