diff --git a/docs/runbook.md b/docs/runbook.md index c5525ad..7f5d636 100755 --- a/docs/runbook.md +++ b/docs/runbook.md @@ -50,6 +50,42 @@ Playbook вычисляет `durationDefault` автоматически (вкл ## Типовые инциденты +### DLP не виден в вебе + +Быстрый чек сервера: + +```sh +curl -fsS http://127.0.0.1:5600/api/0/buckets | jq -r 'keys[] | select(test("^aw-dlp-"))' +curl -fsS http://127.0.0.1:5600/api/0/buckets/aw-dlp-incidents_SHARKON2025 | jq '{end:.metadata.end}' +``` + +Контролируемый тест ingest: + +```sh +TS=$(date -u +%Y-%m-%dT%H:%M:%S.000Z) +PAYLOAD=$(jq -nc --arg ts "$TS" '{timestamp:$ts,duration:0,data:{ruleId:"selftest-dlp-incident",action:"alert",severity:"low",message:"Self-test DLP incident from runbook",signalType:"self_test",username:"AUTOTEST",sessionId:0,hostname:"SHARKON2025",source:"self-test"}}') +curl -fsS -X POST 'http://127.0.0.1:5600/api/0/buckets/aw-dlp-incidents_SHARKON2025/heartbeat?pulsetime=60' -H 'Content-Type: application/json' --data "$PAYLOAD" +curl -fsS 'http://127.0.0.1:5600/api/0/buckets/aw-dlp-incidents_SHARKON2025/events?limit=5' | jq '.[0].data' +``` + +Если API видит событие, а bucket-страница в UI показывает старые `First/last event`, нажать `Обновить` на странице bucket и раскрыть `Events`. + +### У пользователей всплывает окно PowerShell + +Ожидаемое поведение collector-ов: запуск hidden (`-WindowStyle Hidden`). +Проверка на Windows хосте: + +```powershell +Get-CimInstance Win32_Process | + Where-Object { $_.CommandLine -and ($_.CommandLine -match 'browser-domains-native-collector.ps1' -or $_.CommandLine -match 'dlp-endpoint-signals-collector.ps1') } | + Select-Object SessionId, ProcessId, CommandLine +``` + +Если нужно экстренно убрать снимки инцидентов: + +1. Поставить `incidentCapture.screenshotEnabled = false` в `deployment-config.json` (для каждого StateRoot). +2. Запустить `Start-ScheduledTask -TaskName 'ActivityWatch Recovery'`. + ### Сервис не стартует ```sh diff --git a/docs/windows/deployment.md b/docs/windows/deployment.md index f6c1a06..aa6686f 100755 --- a/docs/windows/deployment.md +++ b/docs/windows/deployment.md @@ -17,6 +17,9 @@ - Ставит `aw-watcher-afk` и `aw-watcher-window` из официального Windows ZIP ActivityWatch. - Копирует browser-domain collector в `C:\ProgramData\ActivityWatch`. - Копирует DLP policy в `C:\ProgramData\ActivityWatch\dlp-policy.json`. +- Включает `incidentCapture` в `deployment-config.json` для DLP-инцидентов: + - `incidentCapture.screenshotEnabled = true` + - `incidentCapture.artifactsRoot = \incident-artifacts` - Создаёт per-user задачи `ActivityWatch Launch [...]` с запуском при логоне. - Создаёт системную задачу `ActivityWatch Recovery`, которая циклически перезапускает per-user launch tasks. - Применяет ACL к `C:\Program Files\ActivityWatch`, `C:\ProgramData\ActivityWatch` и каталогу логов. @@ -24,6 +27,11 @@ - Корректно регистрирует задачи через `-LogonType Interactive` (совместимо с Windows Server, где `InteractiveToken` не поддерживается). - Поддерживает отключение шумных watcher'ов через `-AfkEnabled:$false` и `-WindowEnabled:$false`. +Важно: + +- Скриншот делается только при DLP-инциденте (`Send-DlpIncidentHeartbeat`), не по таймеру и не на обычной активности. +- Для экстренного отключения снимков можно выставить `incidentCapture.screenshotEnabled = false` в `deployment-config.json` и запустить `ActivityWatch Recovery`. + ## Предпосылки - Windows 10/11 или Windows Server с PowerShell 5.1+. @@ -191,6 +199,7 @@ Single-user pilot в таком же стиле: - `C:\Program Files\ActivityWatch` — бинарники watcher'ов. - `C:\ProgramData\ActivityWatch\deployment-config.json` — итоговая конфигурация. +- `C:\ProgramData\ActivityWatch\incident-artifacts\` — скриншоты DLP-инцидентов (если `incidentCapture.screenshotEnabled=true`). - `C:\ProgramData\ActivityWatch\launch-watchers.ps1` — per-user launcher. - `C:\ProgramData\ActivityWatch\recovery-loop.ps1` — system recovery loop. - `C:\ProgramData\ActivityWatch\browser-domains-native-collector.ps1` — runtime collector. diff --git a/docs/windows/validation.md b/docs/windows/validation.md index 74660c2..068948e 100755 --- a/docs/windows/validation.md +++ b/docs/windows/validation.md @@ -47,6 +47,19 @@ Get-ScheduledTask | Where-Object TaskName -eq 'ActivityWatch Launch [SHARKON2025 Get-ScheduledTask | Where-Object TaskName -eq 'ActivityWatch Recovery' ``` +### 2.1 Проверить incidentCapture в конфиге + +```powershell +$cfg = Get-Content 'C:\ProgramData\ActivityWatch\deployment-config.json' -Raw | ConvertFrom-Json +$cfg.incidentCapture +``` + +Ожидаемо: + +- `enabled = True` +- `screenshotEnabled = True` (или `False`, если временно отключали) +- `artifactsRoot` указывает на `\incident-artifacts` + ### 3. Проверить процессы после логина пользователя ```powershell @@ -109,6 +122,59 @@ Invoke-WebRequest http://aw.example.local:5600/api/0/buckets | Select-Object -Ex Get-Content "C:\ProgramData\ActivityWatch\logs\dlp-incidents-$env:USERNAME.log" -Tail 50 ``` +Если `screenshotEnabled = True`, проверьте наличие скриншота в инциденте: + +```powershell +Invoke-WebRequest http://aw.example.local:5600/api/0/buckets/aw-dlp-incidents_/events?limit=5 | + Select-Object -ExpandProperty Content +``` + +Проверьте поля: + +- `data.screenshotPath` +- `data.screenshotSha256` +- `data.screenshotWidth` +- `data.screenshotHeight` + +И что файл реально существует: + +```powershell +Test-Path '' +``` + +## Контролируемый self-test DLP ingest + +Этот тест проверяет канал `AW API -> aw-dlp-incidents_ -> Web UI`, не затрагивая пользовательские действия. + +```powershell +$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 = '' + source = 'self-test' + } +} | ConvertTo-Json -Depth 6 + +Invoke-RestMethod -Method Post ` + -Uri "http://aw.example.local:5600/api/0/buckets/aw-dlp-incidents_/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_`) событие видно в `Events`. + ## Проверка phase-2 endpoint signals 1. Скопируйте любой текст в буфер обмена.