8.9 KiB
Windows Rust Agent Worktime/RDP
Назначение
awatch-agent-rs заменяет PowerShell-сборщик
worktime-session-collector.ps1 для учета Windows/RDP-сессий.
Цель перехода:
- меньше зависимость от PowerShell и локали Windows;
- стабильный сбор RDP/local/disconnected сессий через WinAPI WTS;
- единый
TelemetryRecordдля портала, отчетов, KPI активности и UEBA; - сохранение PowerShell-сценария только как legacy fallback.
Агент не собирает содержимое окон, документов, ввод с клавиатуры или снимки экрана. Для worktime/session path используются только:
username;session_id;session_type;active;started_at, если платформа отдаст это поле;remote_addr, если платформа отдаст это поле.
Конфигурация агента
Файл Windows:
C:\ProgramData\AWatch-rus\agent\awatch-agent.toml
Минимальный пример:
server_url = "https://<GATEWAY_HOST>/api/telemetry"
api_key = "CHANGE_ME"
collect_interval_seconds = 30
role = "workstation"
enable_processes = true
enable_network = true
enable_security_events = true
enable_workforce_activity = true
spool_dir = "C:\\ProgramData\\AWatch-rus\\agent\\spool"
timeout_seconds = 10
retry_attempts = 3
aw_api_base = "http://<AW_SERVER_HOST>:5600/api/0"
aw_worktime_enabled = true
По умолчанию в example-конфиге aw_worktime_enabled=false. Включайте его
только после настройки aw_api_base, spool-директории и rollback-процедуры.
Источники сессий
Агент пишет диагностическое поле session_source:
wts_api- основной промышленный путь через WinAPI WTS;quser_utf16- fallback черезquery user/quserв UTF-16;quser_lossy- fallback через обычный console output;env_sessionname_fallback- fallback по переменнойSESSIONNAME;local_fallback- последняя локальная заглушка, когда системные источники не вернули сессии.
В TelemetryRecord.diagnostics дополнительно пишутся:
sessions_collected_total;rdp_sessions_total;active_sessions_total;collector_source;collector_error.
Достоверность данных агента
Портал и отчеты поднимают diagnostics в два блока:
agent_quality- обратная совместимость и технические счетчики;agent_quality_explain- управленческий вывод о доверии к KPI.
Статусы agent_quality:
ok- основной источникwts_api, ошибки коллектора нет;fallback- данные получены черезquser_utf16,quser_lossyилиenv_sessionname_fallback;degraded- используетсяlocal_fallbackили есть некритичная ошибка коллектора;error- есть критичная ошибка коллектора, например отказ доступа, некорректный обязательный payload или ошибка парсинга;unknown- старый агент или payload без diagnostics.
Статусы agent_quality_explain:
OK- данные приняты в KPI;WARNING- данные собраны резервным способом, допустимы как оперативный ориентир, но требуют проверки для доказательной базы;DEGRADED- данные не приняты в KPI;UNKNOWN- агент не передал диагностику качества данных.
local_fallback считается диагностическим сигналом, а не доказательством
активности. События worktime, опубликованные из local_fallback, получают
active=false, ignoredForKpi=true и не должны увеличивать KPI сотрудника или
подтверждать RDP-активность. В портале для этого режима выводится текст:
Диагностический режим, данные не засчитываются в KPI.
Портал также строит agent_quality_history за 7 дней из telemetry JSONL:
последняя запись каждого дня превращается в статус доверия к KPI. Если за
неделю меньше 5 дней OK, недельный KPI считается требующим валидации.
Портал строит agent_quality_nodes по последней записи каждого рабочего места
за период. Ключ узла выбирается так: hostname, затем machine_id, затем
unknown. Это позволяет не ломать старые telemetry payload и одновременно
показывать руководителю, какие рабочие станции портят достоверность KPI.
Источник local_fallback в этой сводке помечается как диагностический и не
подтверждает KPI узла.
На основе agent_quality_nodes портал также считает agent_coverage_sla:
покрытие ожидаемого парка рабочих мест по файлу expected nodes. Свежий
local_fallback может подтверждать наличие телеметрии, но не подтверждает KPI
узла и снижает coverage_pct.
PowerShell Legacy Fallback
В deployment-config.json используется блок:
{
"collectors": {
"worktimeSessionEnabled": true,
"worktimeSessionMode": "rust_primary",
"worktimeLegacyFallbackEnabled": true
}
}
Режимы:
powershell_primary- старое поведение, PowerShell collector основной;rust_primary- Rust agent основной, PowerShell запускается только как legacy fallback при недоступности Rust agent или stale worktime bucket.
Для полного отключения PowerShell worktime fallback:
{
"collectors": {
"worktimeSessionEnabled": false,
"worktimeSessionMode": "rust_primary",
"worktimeLegacyFallbackEnabled": false
}
}
Проверка
Проверить локальный JSON агента:
C:\ProgramData\AWatch-rus\agent\awatch-agent-rs.exe `
--config C:\ProgramData\AWatch-rus\agent\awatch-agent.toml `
--once --print-json
Ожидаемые признаки:
active_sessionsсодержит local/RDP/disconnected сессии;rdp_sessionsсодержит активные RDP-сессии;session_sourceравенwts_apiв штатном режиме;diagnostics.rdp_sessions_totalсоответствует числу RDP-сессий.
Проверить, что legacy PowerShell не запущен:
Get-CimInstance Win32_Process |
Where-Object {
$_.Name -match 'powershell|pwsh' -and
$_.CommandLine -match 'worktime-session-collector.ps1'
}
Проверить ActivityWatch bucket:
curl "http://<AW_SERVER_HOST>:5600/api/0/buckets/aw-worktime-sessions_<HOST>/events?limit=5"
В свежих событиях должно быть:
{
"source": "awatch-agent-rs",
"sessionSource": "wts_api",
"collectorSource": "wts_api",
"ignoredForKpi": false
}
Spool и восстановление
Если aw_worktime_enabled=true, но aw_api_base временно недоступен, агент
кладет worktime-записи в:
<spool_dir>\aw-worktime
При следующем успешном цикле агент пытается выгрузить накопленный spool с тем
же retry_attempts.
Rollback на PowerShell
- Остановить Rust Scheduled Task или сервис агента.
- В
deployment-config.jsonустановить:
{
"collectors": {
"worktimeSessionEnabled": true,
"worktimeSessionMode": "powershell_primary",
"worktimeLegacyFallbackEnabled": true
}
}
- Перезапустить guard/recovery AWatch-rus.
- Проверить, что
worktime-session-collector.ps1снова пишет события вaw-worktime-sessions_<HOST>.
PowerShell collector не удаляется из поставки именно для такого rollback.