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
147 lines
5.8 KiB
Markdown
147 lines
5.8 KiB
Markdown
# AWatch-rus containment policy
|
||
|
||
Дата: 2026-06-25.
|
||
|
||
Этот документ описывает безопасную политику автоматической/полуавтоматической
|
||
изоляции рабочих станций. Containment нужен для быстрого ограничения
|
||
распространения заражения, но не является автоматическим лечением,
|
||
remediation, EDR/XDR или сертифицированной СЗИ.
|
||
|
||
## Default posture
|
||
|
||
По умолчанию containment выключен:
|
||
|
||
```text
|
||
AW_CONTAINMENT_ENABLED=false
|
||
AW_CONTAINMENT_MODE=shadow
|
||
```
|
||
|
||
`shadow` означает: система рассчитывает рекомендацию и audit, но не меняет
|
||
firewall, pfSense, AD, VLAN, маршруты или состояние рабочих станций.
|
||
|
||
## Policy file
|
||
|
||
Default path:
|
||
|
||
```text
|
||
/etc/activitywatch/containment-policy.json
|
||
```
|
||
|
||
Repo example:
|
||
|
||
```text
|
||
configs/containment-policy.example.json
|
||
```
|
||
|
||
Критичные поля:
|
||
|
||
- `enabled`: глобальный opt-in;
|
||
- `mode`: `shadow`, `manual_approval`, `auto`;
|
||
- `default_ttl_minutes`: срок quarantine до rollback/review;
|
||
- `require_admin_channel_check`: запрещает блокировку, если управляемый канал
|
||
не проверен;
|
||
- `allow_auto_for_servers`: по умолчанию `false`;
|
||
- `allowed_actions`: whitelist containment-действий;
|
||
- `management_allowlist`: каналы, которые должны оставаться доступными;
|
||
- `minimum_high_signals_for_auto`: минимальный порог high/critical signals.
|
||
|
||
## Safety rules
|
||
|
||
- Не включать `auto` до успешного shadow burn-in.
|
||
- Не включать auto-containment для серверов и domain controllers.
|
||
- Не запускать containment без rollback record.
|
||
- Не запускать containment, если будет потерян admin/management channel.
|
||
- Не применять широкие AD/OU/domain actions.
|
||
- Не удалять файлы, registry keys или процессы как часть containment.
|
||
- Не заявлять, что containment гарантированно остановил заражение.
|
||
|
||
## Decision threshold
|
||
|
||
Automatic quarantine допускается только если:
|
||
|
||
- host role is `workstation`;
|
||
- host не входит в critical infrastructure denylist;
|
||
- есть один `critical` signal или несколько `high` signals;
|
||
- management-channel precheck passed;
|
||
- action есть в `allowed_actions`;
|
||
- rollback record создан успешно.
|
||
|
||
## Security Finding Inbox handoff
|
||
|
||
Security Finding Inbox (`docs/SECURITY_FINDING_INBOX_RU.md`) является входной
|
||
очередью для подозрительных рабочих станций. Он хранит findings и workflow
|
||
events в ClickHouse, показывает их в DetMir Portal. Портал не выполняет
|
||
containment самостоятельно.
|
||
|
||
Workflow `apply_requested` означает только операторский запрос на применение.
|
||
Фактическое применение идет через отдельный процесс
|
||
`security-finding-inbox executor`, который повторно проверяет `approved`,
|
||
запускает `containment-engine decide`, строит Windows Firewall plan, затем
|
||
выполняет `apply`, `verify` и при ошибке `rollback`. Реальная мутация firewall
|
||
разрешена только на целевой Windows-станции при `--execute-local`,
|
||
`--confirm-execute YES` и совпадении `--executor-host` с finding host.
|
||
|
||
## Current implementation status
|
||
|
||
Реализован первый безопасный слой:
|
||
|
||
- Rust CLI `containment-engine`;
|
||
- strict JSON policy/finding parsing;
|
||
- `disabled`, `shadow`, `manual_approval`, `auto` decision states;
|
||
- server/unknown host roles refused for auto mode by default;
|
||
- `would_mutate=false` for current implementation;
|
||
- separate Windows Firewall executor interface:
|
||
`plan`, `apply`, `verify`, `rollback`;
|
||
- Windows Firewall executor defaults to dry-run command generation unless
|
||
`--execute-local` and explicit confirmation are used.
|
||
|
||
pfSense/AD/VLAN mutation paths are not implemented.
|
||
|
||
## Windows Firewall executor
|
||
|
||
Executor input example:
|
||
|
||
```text
|
||
configs/windows-firewall-containment-request.example.json
|
||
```
|
||
|
||
The executor is deliberately separate from decision making:
|
||
|
||
```bash
|
||
containment-engine windows-firewall plan \
|
||
--request configs/windows-firewall-containment-request.example.json \
|
||
--pretty > /tmp/windows-firewall-plan.json
|
||
|
||
containment-engine windows-firewall apply \
|
||
--plan /tmp/windows-firewall-plan.json \
|
||
--confirm-apply YES \
|
||
--pretty
|
||
|
||
containment-engine windows-firewall verify \
|
||
--plan /tmp/windows-firewall-plan.json \
|
||
--pretty
|
||
|
||
containment-engine windows-firewall rollback \
|
||
--plan /tmp/windows-firewall-plan.json \
|
||
--confirm-rollback YES \
|
||
--pretty
|
||
```
|
||
|
||
Without `--execute-local`, `apply` and `rollback` return generated PowerShell
|
||
commands and `would_mutate=false`.
|
||
|
||
With `--execute-local`, execution is allowed only on a Windows host and only
|
||
after explicit confirmation. On non-Windows hosts the executor fails closed.
|
||
|
||
## Windows Firewall guardrails
|
||
|
||
- `management_allowlist` is mandatory.
|
||
- `blocked_remote_addresses` must be explicit IPs/subnets.
|
||
- Broad block targets such as `Any`, `*`, `LocalSubnet`, `Internet`,
|
||
`Intranet` are refused.
|
||
- The executor does not change Windows Firewall profile defaults.
|
||
- The executor does not disable interfaces, routes, users, services or
|
||
processes.
|
||
- Every plan includes rollback through `Remove-NetFirewallRule -Group ...`.
|
||
- A successful dry-run is not evidence that the workstation has been isolated.
|