e738d97c9c
Co-authored-by: Cursor <cursoragent@cursor.com>
222 lines
12 KiB
Markdown
222 lines
12 KiB
Markdown
# Развёртывание RDP Login Monitor в домене
|
||
|
||
Монитор ставится в **`C:\ProgramData\RDP-login-monitor\`**, задачи планировщика создаёт **`Login_Monitor.ps1 -InstallTasks`**. Доставку по сети выполняет **`Deploy-LoginMonitor.ps1`**.
|
||
|
||
- Публикация на NETLOGON: [deploy-netlogon-publish.md](deploy-netlogon-publish.md)
|
||
- Exchange Mail Security (отдельный пакет): [exchange-mail-security.md](exchange-mail-security.md)
|
||
|
||
## Файлы на файловой шаре
|
||
|
||
Каталог, доступный **конечным компьютерам** на чтение (учётная запись компьютера домена / SYSTEM), например:
|
||
|
||
`\\dc.contoso.local\NETLOGON\RDP-login-monitor\`
|
||
|
||
| Файл | Назначение |
|
||
|------|------------|
|
||
| `Login_Monitor.ps1` | Основной скрипт мониторинга |
|
||
| `Sac-Client.ps1` | Клиент SAC (обязателен для SAC; сверка SHA256 при деплое) |
|
||
| `login_monitor.settings.example.ps1` | Образец настроек (bootstrap локального settings) |
|
||
| `version.txt` | **Одна строка** — версия пакета на шаре (например `1.2.27-SAC`) |
|
||
| `Deploy-LoginMonitor.ps1` | Установщик для GPO / scheduled task |
|
||
|
||
Полный список файлов на шару (включая Exchange): [deploy-netlogon-publish.md](deploy-netlogon-publish.md).
|
||
|
||
**Не копируются Deploy-LoginMonitor:** `ignore.lst`, `login_monitor.settings.ps1` (секреты локальны).
|
||
|
||
## Алгоритм Deploy (GPO startup / scheduled task)
|
||
|
||
```mermaid
|
||
flowchart TD
|
||
A[GPO startup или RDP-Login-Monitor-Deploy] --> B[Deploy-LoginMonitor.ps1 с UNC]
|
||
B --> C{Login_Monitor.ps1 и version.txt на шаре?}
|
||
C -->|нет| Z[exit 0, запись в deploy.log]
|
||
C -->|да| D[Сравнение version.txt vs deployed_version.txt]
|
||
D --> E{Нужна работа?}
|
||
E -->|версия совпадает, bundle OK, settings OK| F["Актуально — exit 0"]
|
||
E -->|новая версия / патчи / первый запуск| G[Graceful stop монитора]
|
||
G --> H[Copy Login_Monitor.ps1 + Sac-Client.ps1]
|
||
H --> I[Sync settings из example + post-patches]
|
||
I --> J[Login_Monitor.ps1 -InstallTasks]
|
||
J --> K[deployed_version.txt + deploy_last_update.txt]
|
||
K --> L[Start monitor]
|
||
```
|
||
|
||
Корень дистрибутива: **`-SourceShareRoot`** или родитель каталога `Deploy-LoginMonitor.ps1` при запуске по UNC.
|
||
|
||
Локальная метка версии: **`C:\ProgramData\RDP-login-monitor\deployed_version.txt`**. Если файла нет — версия берётся из **`$ScriptVersion`** в установленном `Login_Monitor.ps1`.
|
||
|
||
### Когда деплой **не** копирует файлы
|
||
|
||
Версия на шаре **совпадает** с локальной **и** одновременно:
|
||
|
||
- SHA256 **`Login_Monitor.ps1`** и **`Sac-Client.ps1`** совпадает с шарой;
|
||
- в **`login_monitor.settings.ps1`** уже есть настроенный SAC (или не требуется bootstrap);
|
||
- применены post-patches: подсказки **`$ServerDisplayName`**, **`$DailyReportEnabled`**, на Exchange — noise settings.
|
||
|
||
Иначе деплой **продолжается** (даже при совпадении номера версии): другой hash bundle, донастройка SAC, исправление `DailyReportEnabled = false` без `$`, дописывание Exchange-фильтров и т.д.
|
||
|
||
### Upgrade / downgrade
|
||
|
||
| Ситуация | Поведение |
|
||
|----------|-----------|
|
||
| Версия на шаре **новее** | Полный цикл деплоя |
|
||
| Версия **совпадает**, но нужны патчи | Полный цикл (см. выше) |
|
||
| Версия на шаре **старее** | Пропуск, пока не указан **`-AllowDowngrade`** |
|
||
|
||
Метки с суффиксом (**`1.2.27-SAC`**) сравниваются **по полной строке**; для порядка версий используется числовой префикс `1.2.27`.
|
||
|
||
Лог: **`C:\ProgramData\RDP-login-monitor\Logs\deploy.log`**. Ошибки пишутся в лог и завершаются **`exit 0`** (удобно для GPO).
|
||
|
||
## Сервер Exchange и GPO Deploy-LoginMonitor
|
||
|
||
**`Deploy-LoginMonitor.ps1` не копирует отдельный Exchange-пакет** — на MailServer те же **`Login_Monitor.ps1`** + **`Sac-Client.ps1`**, что на RDS и рабочих станциях.
|
||
|
||
При обнаружении роли Exchange (реестр, каталог установки, службы) Deploy **только дописывает** в **`login_monitor.settings.ps1`**, если строк ещё нет:
|
||
|
||
- `${Ignore4624-LT3-EmptyIP-Event} = $true`
|
||
- `$WinRmIgnoreLocalSource = 1`
|
||
- `$WinRmIgnoreMachineAccounts = 1`
|
||
|
||
Подавление шума WinRM (HealthMailbox, loopback) и лишних **4624 LT3**.
|
||
|
||
**Мониторинг очередей транспорта и правил пересылки** — другой скрипт, **не** через GPO RDP-монитора:
|
||
|
||
```powershell
|
||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File "\\B26\NETLOGON\RDP-login-monitor\Deploy-DomainMonitors.ps1" -Target Exchange
|
||
```
|
||
|
||
Подробно: [exchange-mail-security.md](exchange-mail-security.md).
|
||
|
||
## Локальные настройки: `login_monitor.settings.ps1`
|
||
|
||
Путь: **`C:\ProgramData\RDP-login-monitor\login_monitor.settings.ps1`**.
|
||
|
||
| Действие Deploy | Условие |
|
||
|-----------------|--------|
|
||
| Копирует example → settings | Файла settings ещё нет |
|
||
| Дописывает блок SAC из example | Нет `$UseSAC` / `$SacUrl` / `$SacApiKey` |
|
||
| **Не перезаписывает** целиком | SAC уже настроен (`UseSAC` не `off`, ключ и URL заданы) |
|
||
| Подсказка `# $ServerDisplayName = '<COMPUTERNAME>'` | Строки `$ServerDisplayName` нет |
|
||
| Подсказка / починка `$DailyReportEnabled` | Нет переменной или `= false` без `$` → `$false` |
|
||
| Exchange noise (см. выше) | Роль Exchange и нет соответствующих строк |
|
||
|
||
Секреты (Telegram, **`sac_*`**, SMTP, 4740) правятся **вручную** на машине.
|
||
|
||
```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`**.
|
||
|
||
### Security Alert Center
|
||
|
||
```powershell
|
||
$UseSAC = 'dual' # off | exclusive | dual | fallback
|
||
$SacUrl = 'https://sac.kalinamall.ru'
|
||
$SacApiKey = 'sac_...'
|
||
```
|
||
|
||
Проверка: **`Login_Monitor.ps1 -CheckSac`**. После правок settings — **`Restart-RdpLoginMonitor.ps1`** или **`-RequestRestart`**.
|
||
|
||
## Задачи, heartbeat, ignore.lst
|
||
|
||
| Задача | Назначение |
|
||
|--------|------------|
|
||
| **`RDP-Login-Monitor`** | Запуск при старте ОС |
|
||
| **`RDP-Login-Monitor-Watchdog`** | Контроль процесса каждые 5 мин |
|
||
|
||
Логи: **`login_monitor.log`**, **`watchdog.log`**, **`Logs\last_heartbeat.txt`**.
|
||
|
||
**`ignore.lst`** — локально, Deploy не копирует. Синтаксис: [README.md](../README.md) (раздел 7).
|
||
|
||
**4740 на КД:** только если имя узла совпадает с **`$LockoutMonitorDomainController`** в settings на этом КД.
|
||
|
||
## GPO и периодический deploy
|
||
|
||
1. Файлы на `\\B26\NETLOGON\RDP-login-monitor\` (`update-rdp-monitor.ps1` на DC публикации).
|
||
2. GPO на OU **компьютеров** → **Сценарии PowerShell** автозагрузки → `Deploy-LoginMonitor.ps1`.
|
||
3. Security Filtering: группа компьютеров; на шару — Read для **SYSTEM** / Domain Computers.
|
||
4. После смены membership — **перезагрузка** (не только `gpupdate`).
|
||
|
||
Deploy после `-InstallTasks` запускает монитор; задача **`RDP-Login-Monitor`** поднимет его при следующей загрузке.
|
||
|
||
**Серверы без частых перезагрузок:**
|
||
|
||
```powershell
|
||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File ".\Install-DeployScheduledTask.ps1" `
|
||
-TaskName "RDP-Login-Monitor-Deploy" `
|
||
-DeployScriptPath "\\B26\NETLOGON\RDP-login-monitor\Deploy-LoginMonitor.ps1" `
|
||
-RepeatMinutes 60 `
|
||
-RunNow
|
||
```
|
||
|
||
**Ручной deploy** (от администратора):
|
||
|
||
```powershell
|
||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File "\\B26\NETLOGON\RDP-login-monitor\Deploy-LoginMonitor.ps1"
|
||
```
|
||
|
||
Параметры: **`-WhatIf`**, **`-SkipStartMonitorAfterUpdate`**, **`-AllowDowngrade`**.
|
||
|
||
## Обновление: чеклист
|
||
|
||
### A. Публикация на шару (один раз на релиз)
|
||
|
||
```powershell
|
||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File C:\soft\update-rdp-monitor.ps1
|
||
```
|
||
|
||
Проверьте на шаре **`Sac-Client.ps1`** и **`version.txt`** (например `1.2.27-SAC`).
|
||
|
||
### B. На целевых машинах
|
||
|
||
GPO или scheduled task — дождаться startup / `-RunNow`. Ручная проверка:
|
||
|
||
```powershell
|
||
Get-Content 'C:\ProgramData\RDP-login-monitor\Logs\deploy.log' -Tail 20
|
||
Select-String -Path 'C:\ProgramData\RDP-login-monitor\Login_Monitor.ps1' -Pattern 'ScriptVersion'
|
||
Test-Path 'C:\ProgramData\RDP-login-monitor\Sac-Client.ps1'
|
||
Get-ScheduledTask -TaskName 'RDP-Login-Monitor','RDP-Login-Monitor-Watchdog' -ErrorAction SilentlyContinue
|
||
```
|
||
|
||
Повторный запуск Deploy без смены версии должен дать **`Актуально, копирование не требуется`**.
|
||
|
||
### C. Graceful restart
|
||
|
||
После правки settings (без смены `Login_Monitor.ps1`):
|
||
|
||
```powershell
|
||
powershell.exe -NoProfile -ExecutionPolicy Bypass `
|
||
-File "C:\ProgramData\RDP-login-monitor\Login_Monitor.ps1" -RequestRestart
|
||
```
|
||
|
||
После Deploy нового **`Login_Monitor.ps1`** — recycle:
|
||
|
||
```powershell
|
||
powershell.exe -NoProfile -ExecutionPolicy Bypass `
|
||
-File "C:\ProgramData\RDP-login-monitor\Login_Monitor.ps1" -RequestRestart -Recycle
|
||
```
|
||
|
||
**`Deploy-LoginMonitor.ps1`** пишет **`restart.request`**, ждёт до **35 с**, затем **`Stop-Process -Force`** только при таймауте.
|
||
|
||
## Версии
|
||
|
||
| Файл | Роль |
|
||
|------|------|
|
||
| **`version.txt` на шаре** | Триггер обновления для Deploy |
|
||
| **`deployed_version.txt` локально** | Метка после успешного деплоя |
|
||
| **`$ScriptVersion` в Login_Monitor.ps1** | Версия в логах и Telegram |
|
||
|
||
Поднимайте **`version.txt`** при каждой выкладке на NETLOGON; строка в **`version.txt`** и **`$ScriptVersion`** должны совпадать (включая суффикс `-SAC`).
|
||
|
||
## Безопасность и UNC
|
||
|
||
- Ограничьте ACL на шару (в example могут быть доменные секреты).
|
||
- DPAPI для токенов в **`login_monitor.settings.ps1`**.
|
||
- При ошибках подписи с FQDN-шары: короткое имя DC и **`-ExecutionPolicy Bypass`**.
|
||
|
||
Диагностика: Group Policy Operational log, **`Logs\deploy.log`**, **`deploy_installtasks_*.log`**.
|