8.0 KiB
Executable File
Windows validation
Автоматическая проверка (рекомендуется)
$report = .\windows\validate-deployment.ps1 `
-ConfigPath C:\ProgramData\AWatch-rus\deployment-config.json
$report | ConvertTo-Json -Depth 12
Примечание: валидатор проверяет задачи через полный список Task Scheduler и корректно обрабатывает имена с квадратными скобками (ActivityWatch Launch [DOMAIN_user]).
Критерий:
overallOk = true
Базовая проверка после развёртывания
1. Проверить установленные файлы
Test-Path 'C:\Program Files\AWatch-rus\bin\aw-watcher-afk\aw-watcher-afk.exe'
Test-Path 'C:\Program Files\AWatch-rus\bin\aw-watcher-window\aw-watcher-window.exe'
Test-Path 'C:\ProgramData\AWatch-rus\browser-domains-native-collector.ps1'
Test-Path 'C:\ProgramData\AWatch-rus\dlp-policy.json'
Test-Path 'C:\ProgramData\AWatch-rus\deployment-config.json'
Ожидаемый результат — везде True.
2. Проверить задачи
Get-ScheduledTask -TaskName 'ActivityWatch*' |
Select-Object TaskName, Author, State
Ожидаемо:
- по одной задаче
ActivityWatch Launch [...]на пользователя; - одна задача
ActivityWatch Recovery.
Точечная проверка. В имени ActivityWatch Launch [...] используется stable ActivityWatch logical host id из deployment-config.json (awHostname), а не обязательно физический COMPUTERNAME:
$cfg = Get-Content 'C:\ProgramData\AWatch-rus\deployment-config.json' -Raw | ConvertFrom-Json
$logicalHost = if ($cfg.awHostname) { [string]$cfg.awHostname } else { [string]$env:COMPUTERNAME }
Get-ScheduledTask | Where-Object TaskName -eq "ActivityWatch Launch [$($logicalHost)_user1]"
Get-ScheduledTask | Where-Object TaskName -eq 'ActivityWatch Recovery'
2.1 Проверить incidentCapture в конфиге
$cfg = Get-Content 'C:\ProgramData\AWatch-rus\deployment-config.json' -Raw | ConvertFrom-Json
$cfg.incidentCapture
Ожидаемо:
enabled = TruescreenshotEnabled = True(илиFalse, если временно отключали)artifactsRootуказывает на<StateRoot>\incident-artifacts
3. Проверить процессы после логина пользователя
Get-Process aw-watcher-afk, aw-watcher-window -ErrorAction SilentlyContinue |
Select-Object ProcessName, SessionId, StartTime
И collector:
Get-CimInstance Win32_Process |
Where-Object { $_.Name -in 'powershell.exe', 'pwsh.exe' -and $_.CommandLine -match 'browser-domains-native-collector.ps1' } |
Select-Object ProcessId, SessionId, CommandLine
4. Проверить сетевую связность
Test-NetConnection aw.example.local -Port 5600
Invoke-WebRequest http://aw.example.local:5600/api/0/info
Если используется HTTPS:
Invoke-WebRequest https://aw.example.local/api/0/info
5. Проверить buckets на сервере
После открытия нескольких сайтов в браузере на сервере должны появиться:
aw-watcher-window_<hostname>aw-watcher-web-edge_<hostname>или другой browser bucketaw-detmir-web-category_<hostname>aw-dlp-endpoint-signals_<hostname>aw-dlp-incidents_<hostname>(при срабатывании policy rule сaction=alert|block|quarantine)
Проверка через API:
Invoke-WebRequest http://aw.example.local:5600/api/0/buckets | Select-Object -ExpandProperty Content
Проверка категоризации
- Откройте сайт из кастомного правила.
- Подождите
PollSeconds + PulseSeconds. - Проверьте category bucket на сервере.
- Убедитесь, что поля
domain,rootDomain,category,categoryGroup,categoryRuleзаполнены.
Проверка DLP phase-1
- В
dlp-policy.jsonзадайте правило на тестовый домен. - Откройте этот домен в браузере.
- Проверьте
aw-dlp-incidents_<hostname>через API. - Проверьте локальный лог:
Get-Content "C:\ProgramData\AWatch-rus\logs\dlp-incidents-$env:USERNAME.log" -Tail 50
Если screenshotEnabled = True, проверьте наличие скриншота в инциденте:
Invoke-WebRequest http://aw.example.local:5600/api/0/buckets/aw-dlp-incidents_<hostname>/events?limit=5 |
Select-Object -ExpandProperty Content
Проверьте поля:
data.screenshotPathdata.screenshotSha256data.screenshotWidthdata.screenshotHeight
И что файл реально существует:
Test-Path '<path from data.screenshotPath>'
Контролируемый self-test DLP ingest
Этот тест проверяет канал AW API -> aw-dlp-incidents_<hostname> -> Web UI, не затрагивая пользовательские действия.
$ts = (Get-Date).ToUniversalTime().ToString('yyyy-MM-ddTHH:mm:ss.000Z')
$body = @{
timestamp = $ts
duration = 0
data = @{
ruleId = 'selftest-dlp-incident'
action = 'alert'
severity = 'low'
message = 'Self-test DLP incident from validation'
signalType= 'self_test'
username = 'AUTOTEST'
sessionId = 0
hostname = '<hostname>'
source = 'self-test'
}
} | ConvertTo-Json -Depth 6
Invoke-RestMethod -Method Post `
-Uri "http://aw.example.local:5600/api/0/buckets/aw-dlp-incidents_<hostname>/heartbeat?pulsetime=60" `
-ContentType 'application/json; charset=utf-8' `
-Body ([Text.Encoding]::UTF8.GetBytes($body))
Проверка:
- в API появился
ruleId=selftest-dlp-incident; - в UI (
#/buckets/aw-dlp-incidents_<hostname>) событие видно вEvents.
Проверка endpoint signals
- Скопируйте любой текст в буфер обмена.
- Отправьте тестовую печать (любой принтер/виртуальный PDF).
- Проверьте endpoint bucket:
Invoke-WebRequest http://aw.example.local:5600/api/0/buckets/aw-dlp-endpoint-signals_<hostname>/events?limit=20
- Проверьте локальный лог:
Get-Content "C:\ProgramData\AWatch-rus\logs\endpoint-signals-$env:USERNAME.log" -Tail 50
Проверка восстановления
- Завершите
aw-watcher-afk.exeиaw-watcher-window.exeу тестового пользователя. - Подождите до
RecoveryIntervalSeconds. - Убедитесь, что per-user launch task стартовала процессы заново.
Ручной запуск recovery:
Start-ScheduledTask -TaskName 'ActivityWatch Recovery'
Проверка ACL
icacls 'C:\Program Files\AWatch-rus\bin'
icacls 'C:\ProgramData\AWatch-rus'
icacls 'C:\ProgramData\AWatch-rus\logs'
Ожидаемо:
SYSTEMиAdministratorsимеютF;UsersимеетRXна install/state;UsersимеетMнаlogs.
Критерий готовности к массовому развёртыванию
- Установка проходит без ручного редактирования скриптов.
- Все параметры инфраструктуры передаются снаружи.
- Повторный запуск не ломает текущую установку.
- Recovery восстанавливает запуск watcher'ов после остановки.
- Collector пишет domain/category события без расширений браузера.