CI / Rust checks (push) Canceled after 0s
CI / Docs and registry checks (push) Canceled after 0s
CI / Smoke checks (push) Canceled after 0s
Coverage / Coverage baseline (push) Canceled after 0s
Security / Cargo audit (push) Canceled after 0s
Security / Cargo deny (push) Canceled after 0s
Security / Secret pattern check (push) Canceled after 0s
Security / Dependency review (push) Canceled after 0s
- default DetMir DLP runtime to core_only/disabled with load-guard protection - add fail-closed placeholder validation and runtime-scoped artifact checks - document operator re-enable flow for light profile and guard rollback - update prod docs, env examples, and Ansible DLP defaults
197 lines
8.5 KiB
Markdown
197 lines
8.5 KiB
Markdown
# DLP resource profiles for DetMir
|
||
|
||
Дата фиксации: 2026-06-30.
|
||
|
||
Цель: сохранить стабильный Workforce/AW hot path на малом DetMir Proxmox
|
||
контуре и оставить DLP подключаемым модулем. Loki CT в текущем production
|
||
resource profile отключен намеренно и не является обязательной зависимостью
|
||
AWatch-rus.
|
||
|
||
## Профили
|
||
|
||
### `core_only`
|
||
|
||
Production default и аварийный/экономный профиль для DetMir.
|
||
|
||
- DLP runtime: выключен.
|
||
- DLP Influx exporter: выключен.
|
||
- DLP aggregators/report/syslog/webhook/CEF/case/evidence units: выключены.
|
||
- Loki/Promtail: выключены.
|
||
- Workforce, Worktime, ActivityWatch, ClickHouse 1C, Grafana core,
|
||
Hayabusa/Security Finding Inbox: работают независимо от DLP.
|
||
|
||
Назначение: безопасное состояние при перегрузе CPU/RAM/IOPS или при ручном
|
||
отключении DLP.
|
||
|
||
### `light`
|
||
|
||
Операторский re-enable профиль для DetMir после проверки ресурсов: лёгкий DLP
|
||
режим без Loki и без Influx-heavy path.
|
||
|
||
- Разрешены `activitywatch-dlp-aggregator.timer` и
|
||
`aw-dlp-ioc-refresh.timer`.
|
||
- `dlp-aggregator-rust` собирает ограниченный срез из bucket-ов
|
||
`aw-file-operations_` и `aw-dlp-incidents_` в локальный
|
||
`dlp_warehouse.sqlite` для последующей UEBA-корреляции.
|
||
- `detmir-dlp-warehouse-sync.timer` доставляет SQLite warehouse на portal host
|
||
через атомарный snapshot, чтобы DetMir Portal/UEBA читали локальный файл, а
|
||
не блокировали AW server hot path.
|
||
- Для агрегатора заданы короткий lookback, малый event limit, timeout,
|
||
`CPUQuota` и `MemoryMax`.
|
||
- Evidence, screenshots, case management и exporters остаются выключенными.
|
||
- InfluxDB/Grafana/Loki не участвуют в hot path лёгкого DLP.
|
||
- Используется для ежедневной эксплуатации, когда нужны DLP-сигналы для UEBA,
|
||
но нельзя нагружать Proxmox/Influx/Grafana/ClickHouse.
|
||
|
||
### `on_demand`
|
||
|
||
Временный режим для конкретного инцидента или окна проверки.
|
||
|
||
- Разрешены IOC refresh, policy engine, case management и evidence API.
|
||
- Influx exporter, CEF/syslog/webhook/report scheduler и aggregator остаются
|
||
выключенными, если администратор отдельно не выбрал `full`.
|
||
- После окна проверки профиль должен быть возвращён в `core_only`.
|
||
|
||
### `full`
|
||
|
||
Только вручную, только после resource preflight.
|
||
|
||
- Может включать DLP Influx exporter, aggregator, reports, integrations,
|
||
policy/case и evidence.
|
||
- На DetMir не является штатным production режимом.
|
||
- Запрещено включать автоматически при обычном deploy/recovery.
|
||
|
||
## Управление
|
||
|
||
На AW server:
|
||
|
||
```bash
|
||
sudo /usr/local/bin/detmir-dlp-runtime-control status
|
||
sudo /usr/local/bin/detmir-dlp-runtime-control set-profile core_only
|
||
sudo /usr/local/bin/detmir-dlp-runtime-control set-profile light
|
||
sudo /usr/local/bin/detmir-dlp-runtime-control set-profile on_demand
|
||
sudo /usr/local/bin/detmir-dlp-runtime-control set-profile full
|
||
sudo /usr/local/bin/detmir-dlp-load-guard
|
||
```
|
||
|
||
Перед каждым `set-profile` скрипт сохраняет rollback-снимок active/enabled
|
||
состояния DLP units:
|
||
|
||
```text
|
||
/var/lib/activitywatch/health/dlp-runtime-rollback.state
|
||
```
|
||
|
||
Откат к предыдущему состоянию:
|
||
|
||
```bash
|
||
sudo /usr/local/bin/detmir-dlp-runtime-control rollback
|
||
```
|
||
|
||
Важно: rollback восстанавливает только systemd active/enabled состояния DLP
|
||
units. Он не меняет retention, не удаляет данные и не включает Loki CT.
|
||
|
||
## Автоотключение при перегрузе
|
||
|
||
`detmir-dlp-load-guard.timer` запускает
|
||
`/usr/local/bin/detmir-dlp-load-guard`. Guard читает `/proc/loadavg`,
|
||
`/proc/meminfo` и `/proc/stat`; если load, свободная память или iowait выходят
|
||
за пороги несколько запусков подряд (`AW_DLP_GUARD_STRIKES_REQUIRED`, default
|
||
`3`), а DLP units активны, он переводит DLP в `core_only` через:
|
||
|
||
```bash
|
||
AW_DLP_DISABLED_REASON=auto_disabled_by_dlp_load_guard:<reason> \
|
||
/usr/local/bin/detmir-dlp-runtime-control set-profile core_only
|
||
```
|
||
|
||
State и история пишутся в:
|
||
|
||
```text
|
||
/var/lib/activitywatch/health/dlp-light-guard-state.json
|
||
/var/lib/activitywatch/health/dlp-light-guard-history/
|
||
```
|
||
|
||
Единичный IO/load spike фиксируется как `observe_overload`, но DLP не
|
||
отключается до достижения порога подряд. Guard не перезапускает
|
||
ActivityWatch/портал, не меняет маршруты, не трогает ClickHouse/Grafana и не
|
||
включает Loki. Возврат из `core_only` в `light` делает администратор после
|
||
стабилизации контура и проверки Proxmox/AW/Influx/Grafana/ClickHouse load. Если
|
||
перегруз повторится, guard снова переведёт профиль в `core_only`.
|
||
|
||
## Доставка DLP warehouse на портал
|
||
|
||
Portal читает DLP-срез из локального
|
||
`/var/lib/activitywatch/dlp_warehouse.sqlite`. На разнесённом контуре DetMir
|
||
этот файл создаётся на AW server, поэтому используется лёгкий sync:
|
||
|
||
```bash
|
||
sudo systemctl start detmir-dlp-warehouse-sync.service
|
||
sudo systemctl status detmir-dlp-warehouse-sync.timer
|
||
sudo jq . /var/lib/activitywatch/health/dlp-warehouse-sync-state.json
|
||
```
|
||
|
||
Sync делает SQLite backup на AW server и атомарно заменяет локальный файл на
|
||
portal host. Он не запускает DLP evidence/case/exporters и не включает Loki.
|
||
|
||
## Ansible defaults
|
||
|
||
Для DetMir production defaults должны оставаться экономными и
|
||
самозащищающимися:
|
||
|
||
```yaml
|
||
aw_dlp_profile: "core_only"
|
||
aw_dlp_enabled: false
|
||
aw_dlp_influx_enabled: false
|
||
aw_dlp_light_collector_enabled: false
|
||
aw_dlp_light_guard_enabled: true
|
||
detmir_portal_dlp_profile: "core_only"
|
||
detmir_portal_dlp_module_enabled_override: true
|
||
```
|
||
|
||
Для временного возврата в лёгкий профиль:
|
||
|
||
```yaml
|
||
aw_dlp_profile: "light"
|
||
aw_dlp_enabled: true
|
||
aw_dlp_influx_enabled: false
|
||
aw_dlp_light_collector_enabled: true
|
||
aw_dlp_light_guard_enabled: true
|
||
detmir_portal_dlp_profile: "light"
|
||
detmir_portal_dlp_module_enabled_override: true
|
||
```
|
||
|
||
Все тяжёлые DLP component flags должны быть `false`, пока администратор явно не
|
||
выбрал `on_demand` или `full`.
|
||
|
||
## Resource preflight перед `full`
|
||
|
||
Перед временным включением `full` проверить:
|
||
|
||
- Proxmox host load и steal/wait;
|
||
- свободную RAM и swap pressure;
|
||
- IOPS/latency storage;
|
||
- ClickHouse health и backlog ingest;
|
||
- InfluxDB/Grafana health, если они участвуют в выбранном профиле;
|
||
- ActivityWatch `/healthz`, Worktime API и portal latency;
|
||
- отсутствие старого Loki CT в autostart.
|
||
|
||
Если любой core-сервис деградирует, DLP возвращается в `core_only`.
|
||
|
||
## Проверка
|
||
|
||
```bash
|
||
DETMIR_RESILIENCE_EXPECT_DLP_PROFILE=light \
|
||
DETMIR_RESILIENCE_EXPECT_LOKI_OFF=1 \
|
||
scripts/detmir_resilience_check.sh --repo
|
||
```
|
||
|
||
Live check на сервере в `light` должен показывать inactive для heavy DLP units
|
||
и Loki units. В `core_only` inactive должны быть все optional DLP units.
|
||
|
||
## Запрещённые утверждения
|
||
|
||
- Не заявлять, что AWatch-rus заменяет DLP/SIEM/EDR.
|
||
- Не заявлять, что Loki обязателен для DetMir production.
|
||
- Не заявлять DLP health OK, если DLP выключен.
|
||
- Не запускать автоматическое блокирование рабочих станций без approve/apply
|
||
workflow.
|