CI / Rust checks (push) Waiting to run
CI / Docs and registry checks (push) Waiting to run
CI / Smoke checks (push) Waiting to run
Coverage / Coverage baseline (push) Waiting to run
Security / Cargo audit (push) Waiting to run
Security / Cargo deny (push) Waiting to run
Security / Secret pattern check (push) Waiting to run
Security / Dependency review (push) Waiting to run
- 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
259 lines
11 KiB
Markdown
259 lines
11 KiB
Markdown
# Optional DLP runtime for DetMir
|
||
|
||
Цель: DLP-контур должен оставаться подключаемым, но production default для
|
||
DetMir сейчас `core_only/disabled`. Возврат в лёгкий режим выполняется вручную
|
||
после resource check; при перегрузе guard снова переводит DLP в `core_only`.
|
||
|
||
Ресурсные профили и rollback-процедура описаны отдельно:
|
||
[DLP_RESOURCE_PROFILES_RU.md](DLP_RESOURCE_PROFILES_RU.md).
|
||
|
||
## Что отключается
|
||
|
||
Текущий production-профиль DetMir после 2026-06-30 prod hardening -
|
||
`core_only/disabled`:
|
||
|
||
- `AW_DLP_ENABLED=false`;
|
||
- `AW_DLP_PROFILE=core_only`;
|
||
- `AW_DLP_INFLUX_ENABLED=false`;
|
||
- optional DLP timers/services inactive/disabled;
|
||
- `detmir-dlp-load-guard.timer` остаётся enabled/active как защита на случай
|
||
последующего operator re-enable;
|
||
- heavy DLP units, Influx exporter, evidence/case/report/integration units и
|
||
Loki остаются выключенными.
|
||
|
||
Автоотключение выполняет `detmir-dlp-load-guard`: при превышении порогов
|
||
load/RAM/iowait он переводит DLP в `core_only` через
|
||
`detmir-dlp-runtime-control set-profile core_only`. После стабилизации контур
|
||
возвращается вручную командой `set-profile light`.
|
||
|
||
Штатный runtime off включает:
|
||
|
||
- `AW_DLP_ENABLED=false` на AW server;
|
||
- `DETMIR_DLP_ENABLED=false` в управляющем DetMir contour check;
|
||
- portal UI/API DLP-модуль может оставаться включённым для исторического
|
||
SQLite/evidence-среза; это не запускает server-side DLP runtime;
|
||
- остановку DLP timers/services:
|
||
- `aw-dlp-influx-exporter.timer`;
|
||
- `activitywatch-dlp-aggregator.timer`;
|
||
- `aw-dlp-report-scheduler.timer`;
|
||
- `aw-dlp-syslog-forwarder.timer`;
|
||
- `aw-dlp-webhook-sender.timer`;
|
||
- `aw-dlp-cef-exporter.timer`;
|
||
- `aw-dlp-ioc-refresh.timer`;
|
||
- `aw-dlp-policy-engine.service`;
|
||
- `aw-dlp-case-management.service`;
|
||
- `detmir-portal-evidence.service`, если DLP evidence upload больше не нужен.
|
||
|
||
Worktime, ActivityWatch server, browser/window/AFK collection, Hayabusa,
|
||
Velociraptor findings ingest и 1C/ClickHouse core не считаются DLP runtime и
|
||
отдельно не отключаются.
|
||
|
||
Важно: отключение DLP runtime не удаляет DLP-контур из проекта. Это
|
||
эксплуатационный режим `disabled`, выбранный для production DetMir из-за
|
||
существенной нагрузки на виртуальную среду Proxmox, InfluxDB, Grafana,
|
||
ClickHouse и AW server. DLP должен оставаться подключаемым обратно через
|
||
описанный ниже enable-процесс, без переустановки продукта и без потери
|
||
исторических артефактов до отдельной retention/cleanup процедуры.
|
||
|
||
## Статистика перед отключением
|
||
|
||
На AW server:
|
||
|
||
```bash
|
||
sudo bash /usr/local/bin/detmir-dlp-runtime-control stats
|
||
sudo cat /var/lib/activitywatch/health/dlp-runtime-state.json
|
||
```
|
||
|
||
Из репозитория до деплоя:
|
||
|
||
```bash
|
||
sudo bash scripts/detmir_dlp_runtime_control.sh stats
|
||
```
|
||
|
||
JSON фиксирует:
|
||
|
||
- generated timestamp;
|
||
- effective mode;
|
||
- DLP unit `active/enabled/load` state;
|
||
- последние timestamps по DLP buckets для текущего host;
|
||
- причину отключения.
|
||
|
||
Каждый запуск дополнительно сохраняет неизменяемый снимок в
|
||
`/var/lib/activitywatch/health/dlp-runtime-history/`. При `disable` остаются
|
||
как минимум два снимка: `pre_disable` до остановки units и `disabled` после
|
||
остановки/disable/reset-failed.
|
||
|
||
## Отключение
|
||
|
||
На AW server:
|
||
|
||
```bash
|
||
sudo install -o root -g root -m 0755 scripts/detmir_dlp_runtime_control.sh /usr/local/bin/detmir-dlp-runtime-control
|
||
sudo sed -i \
|
||
-e 's/^AW_DLP_ENABLED=.*/AW_DLP_ENABLED=false/' \
|
||
-e 's/^AW_DLP_DISABLED_REASON=.*/AW_DLP_DISABLED_REASON=operator_disabled_to_reduce_influx_grafana_clickhouse_load/' \
|
||
/etc/activitywatch/aw-server.env
|
||
sudo /usr/local/bin/detmir-dlp-runtime-control disable
|
||
sudo systemctl restart aw-worktime-api.service || true
|
||
```
|
||
|
||
Для portal:
|
||
|
||
```bash
|
||
sudo sed -i 's/^DETMIR_PORTAL_DLP_MODULE_ENABLED=.*/DETMIR_PORTAL_DLP_MODULE_ENABLED=false/' /etc/detmir-portal.env
|
||
sudo systemctl restart detmir-portal.service
|
||
```
|
||
|
||
Если переменной нет, добавьте ее в соответствующий env-файл отдельной строкой.
|
||
|
||
## Проверка после отключения
|
||
|
||
```bash
|
||
AW_DLP_ENABLED=false DETMIR_DLP_ENABLED=false /usr/local/bin/dlp-health-check --json
|
||
DETMIR_DLP_ENABLED=false detmir-dlp
|
||
DETMIR_DLP_ENABLED=false detmir-check --json
|
||
AW_DLP_ENABLED=false check-aw-full
|
||
```
|
||
|
||
Ожидаемое поведение:
|
||
|
||
- `dlp-health-check` возвращает `ok=true` и `dlp:mode=disabled`;
|
||
- `detmir-dlp` не открывает SSH health probe и возвращает disabled payload;
|
||
- `detmir-check` не проверяет DLP buckets;
|
||
- `check-aw-full` показывает DLP buckets как `SKIPPED`;
|
||
- DLP units остаются stopped/disabled;
|
||
- worktime/core проверки продолжают работать.
|
||
|
||
## Live evidence 2026-06-25
|
||
|
||
На DetMir/AW server выполнен controlled disable:
|
||
|
||
- `AW_DLP_ENABLED=false`;
|
||
- `AW_DLP_INFLUX_ENABLED=false`;
|
||
- `AW_DLP_DISABLED_REASON=operator_disabled_to_reduce_influx_grafana_clickhouse_load`;
|
||
- `AW_DLP_DISABLED_SINCE=2026-06-25`.
|
||
|
||
Зафиксированы evidence-снимки:
|
||
|
||
```text
|
||
/var/lib/activitywatch/health/dlp-runtime-history/dlp-runtime-current-20260625T083619Z.json
|
||
/var/lib/activitywatch/health/dlp-runtime-history/dlp-runtime-pre_disable-20260625T083637Z.json
|
||
/var/lib/activitywatch/health/dlp-runtime-history/dlp-runtime-disabled-20260625T083700Z.json
|
||
```
|
||
|
||
Результат:
|
||
|
||
- pre-disable active units included DLP Influx exporter, aggregator, report,
|
||
integration, policy/case and evidence units;
|
||
- post-disable active/enabled DLP units: `0/0`;
|
||
- `dlp-health-check` returned `ok=true`, `dlp:mode=disabled`;
|
||
- `detmir-dlp` returned `ok=true`, `dlp:mode=disabled`;
|
||
- `check-aw-full` returned `DLP buckets ... SKIPPED`.
|
||
|
||
Отдельные non-DLP findings того же ручного прогона, до восстановления
|
||
`192.168.100.19`:
|
||
|
||
- AFK/window/worktime buckets were stale and require RDP collector/session
|
||
recovery;
|
||
- WinRM from server side to `192.168.100.18:5985` was unreachable;
|
||
- these findings are outside the DLP runtime disable boundary.
|
||
|
||
## Возврат DLP
|
||
|
||
Для DetMir предпочтительно возвращать не весь DLP сразу, а лёгкий профиль.
|
||
Перед этим проверить load/RAM/iowait на Proxmox/AW/Influx/Grafana/ClickHouse.
|
||
|
||
```bash
|
||
sudo AW_DLP_DISABLED_REASON=operator_reenable_after_resource_check \
|
||
/usr/local/bin/detmir-dlp-runtime-control set-profile light
|
||
sudo sed -i \
|
||
-e 's/^AW_DLP_ENABLED=.*/AW_DLP_ENABLED=true/' \
|
||
-e 's/^AW_DLP_PROFILE=.*/AW_DLP_PROFILE=light/' \
|
||
-e 's/^AW_DLP_INFLUX_ENABLED=.*/AW_DLP_INFLUX_ENABLED=false/' \
|
||
/etc/activitywatch/aw-server.env
|
||
```
|
||
|
||
Если профиль ухудшил состояние контура:
|
||
|
||
```bash
|
||
sudo /usr/local/bin/detmir-dlp-runtime-control rollback
|
||
```
|
||
|
||
`on_demand` и `full` включаются только вручную после отдельного resource
|
||
preflight:
|
||
|
||
```bash
|
||
sudo /usr/local/bin/detmir-dlp-runtime-control set-profile on_demand
|
||
sudo /usr/local/bin/detmir-dlp-runtime-control set-profile full
|
||
```
|
||
|
||
Для portal:
|
||
|
||
```bash
|
||
sudo sed -i 's/^DETMIR_PORTAL_DLP_MODULE_ENABLED=.*/DETMIR_PORTAL_DLP_MODULE_ENABLED=true/' /etc/detmir-portal.env
|
||
sudo systemctl restart detmir-portal.service
|
||
```
|
||
|
||
После включения выполнить:
|
||
|
||
```bash
|
||
/usr/local/bin/dlp-health-check --json
|
||
detmir-dlp
|
||
detmir-check --json
|
||
```
|
||
|
||
Перед возвратом DLP в production обязательно проверить ресурсный бюджет
|
||
Proxmox/InfluxDB/Grafana/ClickHouse. Не включайте DLP timers/services
|
||
автоматически вместе с обычным deploy, если текущая цель - сохранить лёгкий
|
||
Workforce/AW контур.
|
||
|
||
## Hayabusa/Velociraptor при выключенном DLP
|
||
|
||
Hayabusa/Sigma и Velociraptor относятся к optional security findings /
|
||
forensics layer, а не к тяжёлому DLP runtime:
|
||
|
||
- Hayabusa drop/autoprocess может продолжать работать при выключенном DLP;
|
||
- Velociraptor findings ingest может использоваться в offline/server mode, если
|
||
администратор явно включил соответствующий режим;
|
||
- результаты должны попадать в Security Finding Inbox / ClickHouse как
|
||
контролируемые findings, а не запускать автоматическую блокировку без
|
||
approve/apply workflow;
|
||
- portal/workforce first screen не должен ждать Velociraptor или DLP;
|
||
- disabled DLP mode не должен превращаться в FAIL только из-за отсутствия DLP
|
||
buckets.
|
||
|
||
Velociraptor server/client runtime не должен стартовать автоматически в
|
||
production DetMir без отдельного ресурсного решения. Для малой виртуальной
|
||
среды предпочтителен `disabled` или `offline_collector` режим.
|
||
|
||
## Ansible
|
||
|
||
В inventory/group vars:
|
||
|
||
```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_module_enabled_override: true
|
||
```
|
||
|
||
Для временного operator re-enable в `light`:
|
||
|
||
```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
|
||
```
|
||
|
||
При `aw_dlp_profile: light` playbook включает только лёгкий агрегатор, IOC
|
||
refresh и load guard. DLP Influx exporter, report/syslog/webhook/CEF,
|
||
policy/case/evidence и Loki не должны возвращаться в active state.
|
||
|
||
## Ограничения
|
||
|
||
Это не удаление DLP-функциональности и не заявление, что DLP заменен другим средством. Это штатный режим временного/постоянного отключения тяжелого DLP runtime для стабилизации производительности. Исторические DLP buckets и артефакты могут оставаться на диске и в ActivityWatch до отдельной retention/cleanup процедуры.
|