# DLP Enforcement (action: "block")

## Обзор

Phase 2.5 расширяет DLP endpoint collector функциями **активного предотвращения** (enforcement).
При `action: "block"` в правиле DLP-политики коллектор не только регистрирует инцидент, но и выполняет блокирующее действие:

| Канал     | Действие при `block`                                      |
|-----------|-----------------------------------------------------------|
| clipboard | Очистка буфера обмена (`Set-Clipboard -Value $null`)      |
| usb       | Перевод USB-диска в read-only (`Set-Disk -IsReadOnly`)    |
| print     | Отмена задания печати (`Remove-CimInstance Win32_PrintJob`)|

Во всех случаях пользователь получает Windows-уведомление (balloon notification) с описанием причины блокировки.

Для cross-OS развития используется отдельный native-first профиль:
`docs/dlp-cross-os-native-enforcement.md`. Он задает правило: Windows enforcement оставляем
на штатных GPO/AppLocker/Spooler/Storage механизмах, macOS строим через System Extensions/MDM,
Linux через fanotify/auditd/eBPF, ChromeOS через Data Controls. Тяжелый универсальный агент
не является целевой архитектурой.

## Конфигурация политики

Формат `dlp-policy.json` не изменился — поле `action` в правиле теперь поддерживает значение `"block"` наряду с `"alert"` (по умолчанию).

Важно: для production safety `action: "block"` в конкретном endpoint-правиле не включает
блокировку сам по себе. Реальное enforcement-действие выполняется только если:

- `nativeControls.mode` равно `"enforce"`;
- `nativeControls.rollout.allowGlobalBlock=true`;
- и `nativeControls.channels.<channel>.action` равно `"block"` или `"blockWithOverride"`.

Если правило просит `block`, но native controls находятся в `monitor`, collector пишет инцидент
как `alert` и добавляет поля:

- `requestedAction: "block"`;
- `enforcementMode`;
- `nativeChannelAction`;
- `enforcementSuppressed: true`.

### Пример: блокировка USB записи

```json
{
  "defaults": {
    "enabled": true,
    "action": "alert",
    "severity": "medium",
    "cooldownSeconds": 300
  },
  "nativeControls": {
    "mode": "enforce",
    "rollout": {
      "allowGlobalBlock": false
    },
    "channels": {
      "clipboard": {"action": "block"},
      "usb": {"action": "block"},
      "print": {"action": "block"}
    }
  },
  "endpoint": {
    "usb": [
      {
        "id": "block-all-usb-write",
        "action": "block",
        "severity": "high",
        "message": "Запись на USB-носитель заблокирована политикой DLP"
      }
    ],
    "clipboard": [
      {
        "id": "block-pdn-clipboard",
        "action": "block",
        "severity": "high",
        "regexPatterns": [
          "\\b\\d{3}-\\d{3}-\\d{3}\\s?\\d{2}\\b",
          "\\b\\d{4}\\s?\\d{6}\\b"
        ],
        "minLength": 8,
        "message": "Буфер обмена очищен: обнаружены персональные данные (СНИЛС/паспорт)"
      }
    ],
    "print": [
      {
        "id": "block-confidential-print",
        "action": "block",
        "severity": "high",
        "documentRegex": "(?i)(конфиденциально|секретно|confidential|restricted)",
        "message": "Печать заблокирована: документ содержит метку конфиденциальности"
      }
    ]
  }
}
```

### Пример: только мониторинг (без блокировки)

```json
{
  "endpoint": {
    "usb": [
      {
        "id": "monitor-usb",
        "action": "alert",
        "severity": "medium",
        "message": "Обнаружено подключение USB-носителя"
      }
    ]
  }
}
```

## Телеметрия

Каждый инцидент с enforcement записывается в bucket `aw-dlp-incidents_<host>` с дополнительным полем:

```json
{
  "ruleId": "block-all-usb-write",
  "action": "block",
  "severity": "high",
  "signalType": "usb_insert",
  "enforced": true,
  "driveLetter": "E:",
  "volumeName": "FLASH_DRIVE"
}
```

- `enforced: true` — блокировка выполнена успешно
- `enforced: false` — блокировка не удалась (недостаточно прав, устройство недоступно и т.д.)

## Требования

- **Clipboard block**: Не требует повышенных прав.
- **USB write-block**: Требует запуск от имени администратора (для `Set-Disk -IsReadOnly`). При запуске без прав блокировка не сработает, но инцидент будет зарегистрирован с `enforced: false`.
- **Print block**: Требует права на отмену заданий печати (обычно — SYSTEM или администратор принт-сервера).

## Уведомления

При каждой блокировке пользователю показывается Windows balloon notification:

| Канал     | Заголовок                            |
|-----------|--------------------------------------|
| clipboard | `DLP: буфер обмена очищен`           |
| usb       | `DLP: USB заблокирован для записи`   |
| print     | `DLP: печать заблокирована`          |

Текст уведомления берётся из поля `message` правила политики.

## Rollback

Для отключения enforcement без изменения кода — смените `action` с `"block"` на `"alert"` в `dlp-policy.json`. Все правила продолжат мониторинг без блокировки.

Для USB, переведённого в read-only, восстановление:
```powershell
Get-Disk | Where-Object { $_.BusType -eq 'USB' -and $_.IsReadOnly } | Set-Disk -IsReadOnly $false
```
