docs(windows): add DLP screenshot and self-test runbook
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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. Скопируйте любой текст в буфер обмена.
|
||||
|
||||
Reference in New Issue
Block a user