Files
AWatch-rus/powershell-analysis.md
T

5.1 KiB
Raw Permalink Blame History

Анализ DLP-скриптов PowerShell (работоспособность)

Дата анализа: 2026-05-04 (UTC)

Проверенный scope

  • windows/dlp-endpoint-signals-collector.ps1
  • windows/file-operations-collector.ps1
  • windows/dlp-policy.example.json
  • windows/web-category-rules.example.json

Ключевой итог

DLP-скрипты в целом рабочие по архитектуре (heartbeat в ActivityWatch, policy-driven правила, cooldown, enforcement), но есть критичный риск misconfiguration и несколько эксплуатационных рисков.


Что точно хорошо

  1. В обоих коллекторах включены Set-StrictMode -Version Latest и $ErrorActionPreference = 'Stop'.
  2. Есть отправка событий в отдельные bucket’ы (aw-dlp-endpoint-signals_*, aw-dlp-incidents_*, aw-file-operations_*).
  3. В endpoint-коллекторе реализованы:
    • правила по буферу обмена / USB / печати,
    • suppression через cooldown (Should-EmitByCooldown),
    • опциональный screenshot capture при инциденте.
  4. В file collector есть наблюдение за Desktop/Documents/Downloads через FileSystemWatcher.

Найденные проблемы и риски

1) Критично: дефолтный путь конфига в endpoint-скрипте не совпадает с проектом

  • dlp-endpoint-signals-collector.ps1 использует по умолчанию:
    • C:\ProgramData\ActivityWatch\deployment-config.json
  • Остальной проект использует namespace AWatch-rus (C:\ProgramData\AWatch-rus\...).

Риск: endpoint-коллектор может стартовать без нужного deployment-конфига и работать с неверными/пустыми параметрами.

2) Нет строгой проверки HTTP-результата в file collector

В file-operations-collector.ps1 POST выполняется через HttpClient, но код ответа не валидируется (IsSuccessStatusCode не проверяется), ошибки частично только логируются.

Риск: «тихая» потеря telemetry при 4xx/5xx.

3) Watcher не снимает event subscriptions явно

Есть Register-ObjectEvent, но в finally disposal только watcher-объектов; отписка событий (Unregister-Event) явно не делается.

Риск: при рестартах/долгой работе возможно накопление подписок в сессии.

4) Screenshot/GUI-зависимость для enforcement

Capture-IncidentScreenshot и balloon notification завязаны на System.Windows.Forms/System.Drawing.

Риск: в non-interactive / service context часть enforcement UX может не работать (событие уйдёт, но скриншот/уведомление может не сформироваться).


Рекомендации (приоритет)

  1. P1: выровнять дефолтный ConfigPath в dlp-endpoint-signals-collector.ps1 на C:\ProgramData\AWatch-rus\deployment-config.json.
  2. P1: добавить проверку response.IsSuccessStatusCode в file-operations-collector.ps1 и логировать body/status при ошибках.
  3. P2: сохранить subscription-объекты Register-ObjectEvent и делать Unregister-Event в finally.
  4. P2: для enforcement/UI добавить fallback режим «headless» (только лог + heartbeat).

Что не удалось проверить в текущей среде

В этом контейнере отсутствует pwsh, поэтому не выполнены:

  • синтаксический parse всех *.ps1/*.psm1 через PowerShell parser;
  • Test-ModuleManifest;
  • smoke-run на Windows API (Get-WinEvent, Get-Partition, Get-Disk, Set-Clipboard, Win32_PrintJob).

Команды для целевой Windows-проверки

# 1) Синтаксис
Get-ChildItem .\windows -Recurse -Include *.ps1,*.psm1 | ForEach-Object {
  [void][System.Management.Automation.Language.Parser]::ParseFile($_.FullName,[ref]$null,[ref]$errs)
  if($errs){ "FAIL $($_.FullName)" } else { "OK $($_.FullName)" }
}

# 2) Быстрый запуск file collector (с логом)
.\windows\file-operations-collector.ps1 -ConfigPath 'C:\ProgramData\AWatch-rus\deployment-config.json' -LogPath 'C:\ProgramData\AWatch-rus\collector-fileops.log'

# 3) Быстрый запуск endpoint collector (с логом)
.\windows\dlp-endpoint-signals-collector.ps1 -ConfigPath 'C:\ProgramData\AWatch-rus\deployment-config.json' -PolicyPath 'C:\ProgramData\AWatch-rus\dlp-policy.json' -LogPath 'C:\ProgramData\AWatch-rus\collector-endpoint.log'