Files
AWatch-rus/docs/DETMIR_CURRENT_STATE_RU.md
T
igor04091968 fe87c85a31
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
Harden DetMir DLP production runtime
- 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
2026-07-01 00:05:23 +03:00

388 lines
18 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# DetMir/AWatch-rus: актуальное состояние и граница DLP-модуля
Дата фиксации: 2026-06-25.
Обновление 2026-06-29 после восстановления RDP-сервера: фактический
production IP Windows/RDP host теперь `192.168.100.19`; stable ActivityWatch
logical host id остаётся `SHARKON2025`. Подробный post-restore baseline:
`docs/DETMIR_RESTORE_BASELINE_2026-06-29_RU.md`.
Документ фиксирует фактическое состояние DetMir/AWatch-rus и первую границу
переработки горячего пути портала. Это не release evidence для реестра
российского ПО, не заявление о сертификации и не claim замены DLP/SIEM/EDR.
## Runtime baseline
- Контур: DetMir / AWatch-rus.
- Stable Windows/RDP logical host id для ActivityWatch bucket-ов и отчетов:
`SHARKON2025`. Это legacy logical id, а не обязательное физическое имя
Windows-сервера. Правило rename-safe эксплуатации описано в
`docs/WINDOWS_LOGICAL_HOST_ID_RU.md`.
- Текущий физический RDP/WinRM target: `192.168.100.19`.
- Portal host: `10.10.10.2`.
- Portal service: `detmir-portal.service`.
- Portal URL: `http://10.10.10.2:8720/`.
- Задеплоенный binary hash:
`653b22b0fbf29a22f7de42ade7b689490b1de16fa07e785e4e0efd3078e7a3bc`.
- Бэкап предыдущего binary на сервере:
`/usr/local/bin/detmir-portal.bak.20260625T045640Z`.
- Runtime mode после 2026-06-30 prod hardening:
server-side DLP runtime зафиксирован в `core_only/disabled`.
Portal DLP UI/API module может оставаться включённым для чтения исторического
SQLite/evidence-среза, но это не означает запуск DLP collectors/exporters.
- Server-side optional DLP runtime control:
`AW_DLP_ENABLED=false|true` и `DETMIR_DLP_ENABLED=false|true`.
- Current resource profile: `AW_DLP_ENABLED=false`,
`AW_DLP_PROFILE=core_only`; возврат в `light` выполняется только вручную
после проверки нагрузки.
- Runtime control/statistics script:
`scripts/detmir_dlp_runtime_control.sh` / live
`/usr/local/bin/detmir-dlp-runtime-control`.
- DLP runtime state after 2026-06-30 prod hardening:
`AW_DLP_ENABLED=false`, `AW_DLP_PROFILE=core_only`,
`AW_DLP_INFLUX_ENABLED=false`; optional DLP units should be
`inactive/disabled`. `detmir-dlp-load-guard.timer` remains enabled and active
as protection for any later operator re-enable.
- Reason: DLP runtime materially increases Proxmox VM/LXC, InfluxDB, Grafana,
ClickHouse and AW server load. In production DetMir the safe default is
`core_only`; `light` is a reconnectable profile, not the automatic default.
- Auto-disable guard:
`scripts/detmir_dlp_load_guard.sh` / live
`/usr/local/bin/detmir-dlp-load-guard`. При перегрузе переводит DLP в
`core_only` через runtime-control и пишет evidence в
`/var/lib/activitywatch/health/dlp-light-guard-state.json`.
- DLP warehouse sync для портала:
`scripts/detmir_dlp_warehouse_sync.sh` / live
`/usr/local/bin/detmir-dlp-warehouse-sync`. Доставляет локальный SQLite
snapshot на portal host для UEBA/DLP views без heavy DLP hot path.
- Loki CT is intentionally excluded from the current DetMir production resource
profile. It must not be returned by routine deploy/recovery while the goal is
to keep Proxmox VM/LXC load low.
- Health после деплоя: `/healthz` возвращал `status=ok`.
- Readiness после деплоя: `/readyz` возвращал `status=ready`.
## Что исправлено в текущем baseline
- Первичная загрузка портала больше не зависает в бесконечном `LOADING`.
- При холодном старте тяжелый операторский срез не блокирует UI бесконечно.
- Frontend показывает честное состояние `STALE / Первичный срез прогревается`.
- При prewarm больше не смешиваются статусы `STALE` и ложное
`Данные отсутствуют`.
- Progress bar доходит до `100%` в fail-soft/prewarm состоянии.
- Browser smoke после деплоя подтвердил:
- `loadStatus=STALE`;
- `progress=100%`;
- `LOADING=false`;
- `EMPTY=false`;
- `ERROR=false`.
## Phase 1 live verification
2026-06-25 после сборки `detmir-portal` и деплоя через
`ansible/deploy_detmir_portal.yml --limit proxmox` подтверждено:
- `/healthz`: `status=ok`;
- `/readyz`: `status=ready`;
- `/api/reports`: `ok=true`, `cache_status=warming`,
`modules.dlp.enabled=false`, `modules.dlp.hot_path=false`;
- `/api/operator`: `cache_status=warming`, `summary.severity=STALE`,
`modules.dlp.status=disabled`, `incidents=0`;
- server log для `/api/operator`: `status=200`, `latency_ms=49`.
Это подтверждает, что первый operator/API screen больше не блокируется на
холодной полной сборке. Полный snapshot строится в фоне и честно помечается как
`warming`/`STALE`.
## Текущая проблема производительности
Наблюдаемые признаки:
- после restart полный тяжелый snapshot может уходить в prewarm/stale mode;
- report cache и stale UI защищают пользователя от зависания, но не убирают
саму стоимость тяжелых расчетов;
- DLP evidence, screenshots, endpoint signals, case review и forensics
enrichment требуют больше CPU/IO/сетевых операций, чем Workforce core.
Вывод: DLP/evidence/forensics enrichment вынесен из обязательного hot path.
Phase 1 делал это через `DETMIR_PORTAL_DLP_MODULE_ENABLED=false`; текущий
lightweight-профиль оставляет DLP-status/UEBA-сигналы включенными без тяжелого
evidence/case/exporter path. Полная оптимизация тяжелого snapshot/prewarm
остается отдельной инженерной задачей.
## Целевая граница после переработки
Core hot path:
- Workforce Operations;
- worktime/activity;
- загрузка, простои, перегруз;
- дисциплина процесса;
- качество и полнота данных;
- легкие агрегаты для руководителя;
- readiness/health без ожидания DLP.
Optional DLP module:
- DLP endpoint signals;
- clipboard/USB/print/web/file operation incidents;
- screenshots/evidence;
- DLP/case review;
- heavy security correlation;
- forensics timelines and evidence packages;
- Hayabusa enrichment where needed.
Отключение optional DLP module не должно ломать:
- `/healthz`;
- `/readyz`;
- первичную загрузку портала;
- Workforce views;
- management reports;
- базовый operator dashboard.
Отключение optional DLP module должно показывать честный статус:
```text
DLP module disabled / not configured
```
без заявления, что DLP-проверки выполнены.
## Рекомендуемые feature flags
Минимальная целевая модель конфигурации:
```json
{
"modules": {
"dlp": {
"enabled": false,
"evidence": false,
"correlation": false,
"screenshots": false,
"hot_path": false
}
}
}
```
Первая реализованная runtime-граница:
```text
--dlp-module-enabled
DETMIR_PORTAL_DLP_MODULE_ENABLED=true|false
AW_DLP_ENABLED=true|false
DETMIR_DLP_ENABLED=true|false
```
DetMir production default после 2026-06-30 hardening:
`AW_DLP_ENABLED=false` / `AW_DLP_PROFILE=core_only`. Portal DLP module may stay
enabled for historical/security views, but server-side DLP collectors/exporters
remain off. В этом режиме портал:
- не читает DLP incident/case/review/audit файлы в основном report/operator
path;
- использует только уже имеющийся лёгкий DLP-срез для UEBA и статуса;
- не включает evidence/case/exporters/Loki/Influx-heavy path;
- не считает отсутствие heavy DLP ошибкой Workforce core.
Ansible-параметр поставки для старого disabled-профиля:
```yaml
detmir_portal_dlp_module_enabled_override: false
```
Для текущего safe production профиля:
```yaml
detmir_portal_dlp_module_enabled_override: true
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
```
Возврат в `light` выполняется только после resource check:
```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/' \
/etc/activitywatch/aw-server.env
```
Отдельный `detmir-portal-evidence` сервис не отключается этим флагом и остается
самостоятельным контуром evidence/API при наличии отдельной конфигурации.
Hayabusa/Velociraptor boundary:
- Hayabusa/Sigma and Velociraptor are optional security findings / forensics
sources, not Workforce hot path dependencies.
- Heavy DLP runtime can remain disabled while Hayabusa/Velociraptor findings
are imported into Security Finding Inbox / ClickHouse.
- Velociraptor server/client mode must be enabled explicitly
(`disabled|offline_collector|server_clients`) and must not be auto-started by
routine production deploy on the small DetMir Proxmox contour.
- Findings from Velociraptor/Hayabusa support `decide -> plan -> approve ->
apply -> verify`, but do not imply automatic remediation without approval.
Server-side optional DLP runtime описан отдельно:
- [DLP_OPTIONAL_RUNTIME_RU.md](DLP_OPTIONAL_RUNTIME_RU.md).
- [DLP_RESOURCE_PROFILES_RU.md](DLP_RESOURCE_PROFILES_RU.md).
При `AW_DLP_ENABLED=false`:
- `dlp-health-check` возвращает штатный `dlp:mode=disabled`;
- `detmir-dlp` не выполняет SSH health probe;
- `detmir-check`, `check-aw-full` и `check-aw-data` не считают DLP buckets
обязательными;
- `detmir-readiness` не требует DLP Influx write и DLP systemd units;
- DLP profile changes use
`/usr/local/bin/detmir-dlp-runtime-control set-profile <profile>` and keep a
rollback snapshot for `/usr/local/bin/detmir-dlp-runtime-control rollback`;
- перед отключением и после отключения собираются JSON-срезы в
`/var/lib/activitywatch/health/dlp-runtime-history/`, latest-срез остается в
`/var/lib/activitywatch/health/dlp-runtime-state.json`.
При `AW_DLP_PROFILE=light`:
- `activitywatch-dlp-aggregator.timer` собирает только ограниченный набор DLP
events в локальный SQLite warehouse;
- `detmir-dlp-warehouse-sync.timer` доставляет этот warehouse на portal host
атомарным snapshot;
- UEBA может учитывать `dlp_warn`/`dlp_fail` без запуска Loki/Influx-heavy path;
- `detmir-dlp-load-guard.timer` автоматически переводит профиль в `core_only`
при превышении порогов load/RAM/iowait;
- тяжёлые DLP units (`aw-dlp-influx-exporter`, report/syslog/webhook/CEF,
policy engine, case management, evidence API) должны оставаться выключенными.
- если `detmir-dlp-load-guard.timer` видит повторный перегруз, он автоматически
возвращает DLP runtime в `core_only`.
Live disable evidence 2026-06-25:
- `dlp-health-check` returned `ok=true`, `dlp:mode=disabled`;
- `detmir-dlp` returned `ok=true`, `dlp:mode=disabled`;
- pre-disable active units:
`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`;
- post-disable active/enabled DLP units: `0/0`;
- retained evidence files:
`/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`;
- `check-aw-full` with `AW_DLP_ENABLED=false` reports `DLP buckets ...
SKIPPED`;
- ActivityWatch core services remained active:
`activitywatch-server`, `aw-worktime-api`.
Separate live observations after DLP disable, before 2026-06-29 restore:
- `aw-watcher-afk`, `aw-watcher-window` and `aw-worktime-sessions` were stale
in the manual check and require separate RDP collector/session recovery;
- WinRM from the server side to `192.168.100.18:5985` was unreachable during
this check;
- these are not treated as DLP disable regressions.
Post-restore correction on 2026-06-29:
- current physical RDP/WinRM target is `192.168.100.19`;
- laptop route to `192.168.100.19` is through DetMir OpenVPN gateway
`10.0.13.1`;
- WinRM `5985` and RDP `3389` are reachable from the admin laptop;
- stable ActivityWatch logical host id remains `SHARKON2025`.
Fail-safe правила:
- если DLP выключена, Security/Forensics views должны показывать disabled-state,
а не падать;
- если DLP включена, тяжелые DLP операции должны выполняться асинхронно или
через cache, а не блокировать первый Workforce/operator screen;
- readiness не должен заявлять DLP healthy, если модуль отключен или не
проверен;
- отсутствие DLP не является ошибкой Workforce core.
## Сетевое состояние
Доступ к DetMir зависит от NetworkManager VPN profile
`pfSense-gate-UDP4-1194-vpn_prog10-config`. Имя tun-интерфейса не является
семантической идентичностью и должно проверяться по адресу `10.0.13.*`.
Пример рабочего route:
```text
10.10.10.2 via 10.0.13.1 dev <current-detmir-tun>
```
Наблюдавшаяся нестабильность dataplane:
- tun device может присутствовать в routing table, но gateway `10.0.13.1` не
отвечает;
- при этом SSH, `/healthz` и браузерная проверка DetMir недоступны;
- после ручного поднятия NetworkManager-подключения
`pfSense-gate-UDP4-1194-vpn_prog10-config` доступ восстанавливался.
- 2026-06-25 после phase 1 deploy зафиксирован отдельный сбой:
`nm-openvpn` для `178.178.98.83:1194` получил `TLS handshake failed` и
`connect timeout exceeded`; повторная production-очистка старого systemd
prewarm drop-in отложена до восстановления VPN handshake.
Актуальная проверка 2026-06-29:
```text
192.168.100.19 via 10.0.13.1 dev <current-detmir-tun>
10.0.13.1 ping OK
192.168.100.19:5985 OK
192.168.100.19:3389 OK
```
Команда восстановления:
```bash
nmcli connection down 'pfSense-gate-UDP4-1194-vpn_prog10-config' || true
sleep 2
nmcli connection up 'pfSense-gate-UDP4-1194-vpn_prog10-config'
```
Проверка:
```bash
ping -c 2 -W 2 10.0.13.1
ping -c 2 -W 2 10.10.10.2
nc -vz -w 3 10.10.10.2 22
curl -sS --max-time 5 http://10.10.10.2:8720/healthz
```
## Что не менять без отдельной задачи
- Не удалять DLP collectors и warehouse ради ускорения портала.
- Не включать heavy DLP или Velociraptor server runtime автоматически при
обычном deploy без ресурсного решения.
- Не включать Loki CT автоматически при обычном deploy/recovery DetMir.
- Не менять UI/API несовместимо: новые поля должны быть additive.
- Не заявлять completed DLP decoupling до live deploy и browser/API smoke.
- Не позиционировать AWatch-rus как сертифицированную DLP/SIEM/EDR/СЗИ.
## Следующий инженерный шаг
Закрыть оставшиеся production-hardening пункты:
1. После восстановления DetMir VPN повторно прогнать
`ansible/deploy_detmir_portal.yml`, чтобы удалить legacy drop-in
`/etc/systemd/system/detmir-portal.service.d/30-prewarm-after-start.conf`.
2. Подтвердить remote `sha256sum /usr/local/bin/detmir-portal` и отсутствие
`ExecStartPost` prewarm в `systemctl cat detmir-portal`.
3. Подтвердить browser smoke без зависания первичной загрузки.
4. Добавить метрики и smoke для режимов `dlp.enabled=false` и
`dlp.enabled=true`.