
Antigena (Darktrace) → мост Aruba ClearPass CoA — модельно-управляемый, карантин пользователей/устройств в реальном времени. Ноль кликов SOC. Гексагональная архитектура, 82% покрытие тестами.
Antigena (Darktrace) → Aruba ClearPass CoA bridge — управляемая моделями изоляция пользователей/устройств в реальном времени. Ноль кликов SOC между обнаружением и сдерживанием.
Санитизированная эталонная реализация интеграционного паттерна NDR↔NAC, эксплуатировавшегося в масштабе финансового сектора (многотысячные конечные точки, круглосуточный SOC). Клиентские части заменены синтетическими фикстурами; архитектура, поток принятия решений и операционные паттерны — настоящие.
Обещание NDR (Darktrace, ExtraHop, Vectra) — обнаружение за секунды. Реальность в большинстве банков: обнаружение за секунды, сдерживание за часы — потому что передача от SOC к командам NAC/брандмауэров выполняется вручную.
Этот набор инструментов закрывает разрыв, соединяя Antigena (модуль автономного реагирования Darktrace) с Aruba ClearPass через REST API ClearPass. Когда срабатывает модель Darktrace выше заданного порога серьезности, набор:
Сквозная медианная задержка от срабатывания модели до активации VLAN карантина: менее 5 секунд.
zero-touch-containment/
├── README.md ← Вы здесь
├── LICENSE
├── .gitignore
├── docs/
│ ├── architecture.md ← Полное погружение в архитектуру + SOLID
│ └── lessons-learned.md ← 10 уроков из эксплуатации в продакшене
│
├── webhook/ ← Входящий HTTP-уровень (разделение по SRP)
│ ├── app.py ← Только FastAPI-роуты + время жизни
│ ├── auth.py ← verify_hmac() — проверка HMAC-SHA1
│ ├── replay.py ← ReplayCache — LRU-защита от повторов
│ └── models.py ← Схема AntigenaEvent (pydantic)
│
├── engine/ ← Движок принятия решений на YAML
│ ├── decision.py ← DecisionEngine (зависит от протокола QuarantineReader)
│ ├── rules.py ← Загрузчики YAML для маппинга и белого списка
│ └── models.py ← Action + MappingRule + ActionKind
│
├── clearpass/ ← Адаптер NAC (реализует протокол CoAClient)
│ ├── client.py ← ClearPassClient — операции CoA через REST
│ ├── ports.py ← Протокол CoAClient — порт для любого NAC-бэкенда
│ └── auth.py ← OAuth2 TokenCache
│
├── ledger/ ← SQLite-журнал (реализует 5 портов — применён ISP)
│ ├── store.py ← SqliteLedger — монолитная реализация
│ ├── ports.py ← EventStore + QuarantineWriter + QuarantineReader
│ │ + ReleaseManager + HealthChecker (разделены)
│ └── schema.py ← SQL DDL-константа
│
├── cli/ ← CLI для операций SOC
│ └── soc.py ← `ztc release-expired` + планируемые команды
│
├── config/
│ ├── mapping.example.yaml ← Маппинг «серьёзность → действие»
│ └── allowlist.example.yaml ← Список VIP / «никогда не изолировать»
│
├── deploy/
│ ├── docker-compose.yml
│ ├── Dockerfile
│ └── .env.example
│
├── tests/ ← 60 тестов, покрывающих каждый слой
│ ├── test_decision.py
│ ├── test_ledger.py
│ ├── test_webhook_helpers.py
│ ├── test_clearpass_client.py
│ ├── test_protocols.py ← Структурные тесты соответствия ISP/DIP
│ └── fixtures/sample_event.json
│
├── requirements.txt
└── pyproject.toml
git clone https://gitlab.com/zimlama/zero-touch-containment.git
cd zero-touch-containment
python3 -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
cp config/mapping.example.yaml config/mapping.yaml
cp config/allowlist.example.yaml config/allowlist.yaml
cp deploy/.env.example .env # заполните CLEARPASS_HOST, учётные данные OAuth, секрет HMAC
# Запустите приёмник вебхуков
uvicorn webhook.app:app --host 0.0.0.0 --port 8080
# В другом терминале: воспроизведите пример события
curl -X POST http://localhost:8080/antigena \
-H "Content-Type: application/json" \
-H "X-Darktrace-Signature: sha1=$(echo -n @tests/fixtures/sample_event.json | openssl dgst -sha1 -hmac "$HMAC_SECRET" | awk '{print $2}')" \
--data @tests/fixtures/sample_event.json
Вебхук проверяет HMAC-SHA1, запускает движок принятия решений из mapping.yaml и либо:
┌──────────────┐ 1. вебхук ┌──────────────────┐ 2. проверка ┌──────────────────┐
│ Darktrace │ ──────────────▶ │ Приёмник │ ───────────────▶ │ Движок │
│ Antigena │ HMAC-SHA1 │ вебхуков │ разбор + аут. │ принятия │
│ срабатывает │ │ (FastAPI) │ │ решений │
│ модель │ └──────────────────┘ │ (на YAML) │
└──────────────┘ └─────────┬────────┘
│
▼
3. разрешение действия
(белый список + лимит)
│
┌───────────────────────┬───────────────────────┼────────────────────────┐
▼ ▼ ▼ ▼
┌──────────────┐ ┌────────────────┐ ┌──────────────┐ ┌─────────────┐
│ ClearPass │ │ SQLite- │ │ Slack/Teams │ │ SIEM │
│ REST API │ │ журнал │ │ уведомление │ │ (структур. │
│ - смена роли │ │ - состояние │ │ │ │ логи) │
│ - отключение │ │ - автовыпуск │ │ │ │ │
└──────────────┘ └────────────────┘ └──────────────┘ └─────────────┘
См. docs/architecture.md для полного разбора.
Представленные паттерны выросли из многолетнего внедрения NDR + NAC в финансовом учреждении Tier-1 в Латинской Америке:
Этот инструмент — дистиллированная и санитизированная версия той интеграции. Имена моделей, идентификаторы арендаторов, конечные точки ClearPass, IP-планы заменены синтетическими эквивалентами.
docs/lessons-learned.md10 вещей, которые я хотел бы знать до первого дня продакшн-развёртывания Antigena↔ClearPass — охватывающие надёжность вебхуков, особенности REST API ClearPass, разницу между сменой роли и отключением, штормы ложноположительных изоляций и проектирование передачи операторам.
Гексагональная структура с явными протокольными портами между конкретными адаптерами и кодом оркестрации:
См. docs/architecture.md для полного разбора.
python3 -m venv .venv && source .venv/bin/activate
pip install -e ".[test]"
HMAC_SECRET=test-secret python -m pytest tests/ -v
60 тестов, покрывающих движок принятия решений, SQLite-журнал, проверку HMAC, кеш повторов, клиент ClearPass (асинхронный, respx-мокированный) и структурное соответствие протоколам.
list, release, quarantine, audit (уровень Tier-2)Leonardo Mejía — старший архитектор кибербезопасности и SD-WAN · 15+ лет Zero Trust · Гибридные облака · NDR · Корпоративный SD-WAN
MIT — см. LICENSE.
Паттерны в этом репозитории — санитизированные абстракции, а не проприетарный клиентский код. Используйте свободно; атрибуция приветствуется.
| Уровень | Инструменты |
|---|
| Язык | Python 3.11+ |
| Веб | FastAPI + Uvicorn (приёмник вебхуков) |
| HTTP-клиент | httpx (async) + tenacity (повторы с откатом) |
| Аутентификация | Входящая: HMAC-SHA1 (Darktrace) · Исходящая: OAuth2 client_credentials (ClearPass) |
| Конфигурация | YAML — маппинг серьёзность → действие + белый список |
| Состояние | SQLite + WAL — журнал карантина + автовыпуск |
| Логирование | structlog — JSON-вывод для приёма в SIEM |
| Тестирование | pytest + respx (мок httpx) + записанные фикстуры |
| Развёртывание | Docker Compose, подходит для одной ВМ |
| Принцип | Реализация |
|---|
| SRP | webhook/ разделён на auth + replay + models + роутинг. clearpass/ разделён на client + auth + ports. ledger/ разделён на store + ports + schema. |
| OCP | Новые NAC-бэкенды реализуют протокол CoAClient — без изменений в вебхуке или движке. |
| LSP | Тесты используют поддельные объекты в памяти, удовлетворяющие тем же протоколам. Поведение конвейера не меняется. |
| ISP | Журнал разделён на 5 изолированных портов (EventStore, QuarantineWriter, QuarantineReader, ReleaseManager, HealthChecker). Вебхук зависит только от первых двух; движок — только от QuarantineReader. |
| DIP | webhook/app.py и engine/decision.py зависят от протоколов, никогда от конкретных классов. |