docs(windows): add DLP screenshot and self-test runbook

This commit is contained in:
igor04091968
2026-04-27 03:53:02 +03:00
parent 63c3d96a19
commit f26012ae52
3 changed files with 111 additions and 0 deletions
+36
View File
@@ -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
+9
View File
@@ -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 = <StateRoot>\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.
+66
View File
@@ -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` указывает на `<StateRoot>\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_<hostname>/events?limit=5 |
Select-Object -ExpandProperty Content
```
Проверьте поля:
- `data.screenshotPath`
- `data.screenshotSha256`
- `data.screenshotWidth`
- `data.screenshotHeight`
И что файл реально существует:
```powershell
Test-Path '<path from data.screenshotPath>'
```
## Контролируемый self-test DLP ingest
Этот тест проверяет канал `AW API -> aw-dlp-incidents_<hostname> -> 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 = '<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`.
## Проверка phase-2 endpoint signals
1. Скопируйте любой текст в буфер обмена.