Skip to content

Iris — Схема максимальной защиты продукта (компиляция · анти-тампер · ЭЦП · дистрибуция)

Синтез brainstorm’а (4 грани, с веб-исследованием 2025–2026). Цель — реалистичный максимум защиты для продукта, который: Python 3.13 + onnxruntime-gpu + Docker, требует NVIDIA CUDA, работает на железе клиента (часто VPS = виртуалка) под Docker, обычно с root, должен работать офлайн и никогда не «кирпичить» (это система видеонаблюдения).

ГЛАВНОЕ (честно)

У клиента root на своей машине → любую userspace-защиту достаточно мотивированный реверсер обойдёт (дамп памяти /proc/<pid>/mem, патч бинаря, Frida, снапшот VM). Поэтому наша цель — не «неломаемо», а: ① поднять стоимость с «правка readable .py за 5 минут» до «реверс скомпилированного бинаря, часы-дни»; ② сделать тампер обнаруживаемым и доказуемым (для юр-спора); ③ никогда не добавить проверку, которая ложно сработает на легальном офлайн-VPS и остановит запись. Финальный барьер — договор/право.

Анти-VM / анти-sandbox / анти-Docker — НЕ делаем. Наш основной сценарий установки — VPS (виртуалка) + Docker; любая проверка «не запускаться в VM/контейнере» бьёт по реальным клиентам и тривиально патчится. ⛔ Themida/VMProtect/Denuvo — не тот таргет (они для нативных PE/ELF-игр, не для Python/Docker). ⛔ Обязательный phone-home — ломает офлайн.


Слой 1 — Компиляция ядра (что реально работает)

  • Nuitka --module компилирует crown-jewels (reid/, faces/, audit/, discovery/, workers/camera_worker.py, licensing/) в нативные .so (Python→C). Импортируется как обычный модуль → совместимо с динамическими импортами/опц.роутерами. Скрипт уже есть (scripts/compile_core.sh) — осталось встроить в сборку и запустить в build-образе.
  • Платный Nuitka Commercial (€250/год) — НЕ берём. Он добавляет лишь шифрование констант; но публичный ключ прятать незачем (он публичный), а калиброванные пороги — безконтекстные числа в stripped-бинаре. Выгода маргинальна, recurring-плата не оправдана.
  • Прятать строки/константы БЕЗ подписки: (а) $0strip .so + домашняя обфускация пары самых чувствительных порогов (хранить XOR’нутыми/bytes.fromhex, расшифровывать в рантайме — слабо, но выше планки strings); вынести их в отдельный компилируемый модуль. (б) разовый ~$89–158 (PyArmor Pro/Group — НЕ подписка, навсегда) — встроенное mix-str (прячет строки) + BCC; долгосрочно дешевле €250/год. Не прогонять Nuitka+PyArmor по одним модулям.
  • НЕ компилируем main.py, FastAPI-роутеры, config.py целиком (это «водопровод» + live-настройки; ломается и пользы ноль). Защищаем алгоритмы, не плумбинг.
  • Гигиена: strip .so, --no-docstrings, удалить исходные .py после компиляции, не везти __pycache__.

Итог слоя: $0 (free Nuitka + strip + домашняя обфускация). Опц. разовый PyArmor ~$89, если захочешь сильнее. Превращает «копировать папку .py» в «реверсить нативный C».


Слой 2 — Runtime-целостность и анти-тампер (без «кирпича»)

Центр — самопроверка целостности при старте по подписанному манифесту (переиспользуем уже готовую инфраструктуру подписи обновлений — один корень доверия): 1. На сборке: посчитать SHA-256 всех защищаемых артефактов (.so, входной shim, ONNX-модели, публичные ключи) → manifest.jsonподписать офлайн-релиз-ключом. 2. На старте (до воркеров): проверить подпись встроенным публичным ключом (ключ — в скомпилированной константе Nuitka Commercial, не в файле!), затем сверить хеши.

Структурная привязка (A2) — самое ценное: ключ шифрования секретов at-rest выводить как HKDF(license_secret ‖ hash(binary) ‖ hw_fingerprint). Тогда патч бинаря или подделка лицензии ломают расшифровку секретов структурно — это не if, который можно занопить. Разнести 2–3 проверки по жизненному циклу (старт / первый кадр / maintenance-поток).

Тампер-лог («фиксация»): при несовпадении хеша/подписи — подписанная append-only запись (HMAC-цепочка) в data/; при наличии heartbeat — выгрузка. Офлайн-безопасно, это улика.

Анти-дебаг / анти-Frida — ТОЛЬКО как лог-телеметрия, никогда не gate: /proc/self/status TracerPid, скан /proc/self/maps на frida-*. Тривиально обходятся → ценность = сигнал + небольшой speed-bump. ≤1–2 дня работы, не больше.

Never-brick политика (незыблемо)

Сигнал Действие
Подпись манифеста невалидна / хеш .so или shim не сошёлся Единственный fail-closed. Отказ старта, громко, в лог. (На легальном боксе не случается случайно.)
Хеш модели не сошёлся Предупредить + degraded/eval; запись не останавливать (это качество, не подделка)
Лицензия невалидна/истекла Существующий grace, без мгновенного кирпича
TracerPid≠0 / Frida / VM / Docker Только лог. Никогда не gate
Heartbeat недоступен Продолжать (grace)
  • Кворум железа (например, 3-из-5 факторов; стабильные: CPU-модель + machine-id + серийник диска, НЕ MAC/IP на VPS) — чтобы миграция/ребут VPS не залочила платящего клиента.
  • Запись — последнее, что выключаем. Если деградируем — режем платные «экстры» (аналитика/Re-ID/мультикамера) раньше, чем когда-либо остановим запись с камеры.

Слой 3 — Цифровая подпись (ЭЦП) + автоматизация · ⚠️ САНКЦИИ

Подпись — это целостность поставки + UX установки, НЕ анти-пиратство и никогда не runtime-gate (иначе истёкший TSA / перекос часов / air-gap → кирпич).

  • Docker-образ (это и есть продукт) → Sigstore Cosign. Бесплатно, офлайн-проверяемо (cosign sign --bundle / verify --offline), ноль санкционной зависимости, полностью автоматизируется в CI. Это бэкбон. (Своя пара ключей / keyed-режим + TUF-корень — лучше keyless для офлайна.)
  • Лицензия + манифесты обновлений — оставляем как есть (наш RSA, уже готов). Три разные роли — не схлопывать в один ключ.
  • Windows Authenticodeтолько для инсталлятора/.ps1/нативного лаунчера (сам образ внутри WSL2 — Linux, его покрывает Cosign). RFC-3161 timestamp обязателен (сертификаты с 1 марта 2026 ≤458 дней — без таймстампа уже отгруженное «протухнет»).

⚠️ Санкционная реальность (для разделения РФ/мир)

Российское юрлицо НЕ может надёжно получить/удержать публично-доверенный Authenticode-серт. DigiCert и Sectigo приостановили выпуск для RU/BY и скринят по OFAC; Azure Artifact Signing ($9.99/мес — самый дешёвый и автоматизируемый) доступен только орг-ам US/CA/EU/UK. Серт могут и отозвать позже. Варианты по приоритету: 1. Подписывать Windows под не-РФ юрлицом (ЕС/ОАЭ/Казахстан/Сербия), которому принадлежит дистрибуция Iris → открывает Azure Artifact Signing $10/мес. Чистый путь. 2. Нет иностранного юрлица → отказаться от публичного Authenticode, везти Windows-артефакты с самоподписанным сертом + разовый ручной импорт доверия клиентом (некрасивый UX, но ноль санкций и не кирпичит). 3. Cosign для Docker-образа не требует ничего из этого — а это и есть реальный продукт.

Российский домен­ный УЦ (Минцифры) выдаёт TLS, не глобальный Authenticode — SmartScreen у зарубежных клиентов он не закроет.

РЕШЕНО (путь A): ключ выпускается под польским юрлицом (ЕС)Azure Artifact Signing $9.99/мес доступен, автоматизируется в CI без токена. Серт привязан к издателю (польская компания), а не к месту запуска, поэтому работа приложения в РФ на валидность подписи не влияет. Экспортно-санкционный комплаенс польского юрлица при поставке RU-клиентам — отдельный вопрос к юристу, решается позже.

Без токенов (USB-токен не автоматизируется в CI + санкционная логистика) → только cloud-HSM. Настроить один раз (подписка на один сервис ИЛИ решение «не подписывать»), дальше каждый git tag подписывает всё автоматически.


Слой 4 — Кросс-платформенная дистрибуция, обновление, контроль

  • Один подписанный Docker-бандл + два тонких OS-инсталлятора (вся защита — в образе/лиц-слое, инсталлятор без секретов и логики):
  • Linux: .deb + .rpm через nfpm (один YAML) + systemd (ставит Docker + NVIDIA Toolkit, сервис, таймер агента).
  • Windows: Inno Setup-бутстрап (включает WSL2 + VirtualMachinePlatform, ставит WSL2-ядро, проверяет Windows-NVIDIA-драйвер (Linux-драйвер в WSL НЕ ставить!), ставит Docker Engine в WSL, регистрирует сервис, smoke docker run --gpus all … nvidia-smi). НЕ MSIX (его песочница враждебна включению фич/WSL/драйверов/сервиса).
  • Агент управления (Tauri, Rust) — трей на Windows / headless-демон на Linux (~3–10 МБ vs Electron 80–150 МБ): читает лицензию, онлайн проверяет канал обновлений, применяет health-gated апдейт, показывает статус. Никакой второй enforcement-логики (двойной enforcement = двойной кирпич-вектор).
  • Доверие обновлений: TUF-метадата (что ставить) + Cosign (сам образ). Root-ключ TUF — офлайн; отдельный online targets-ключ → ролевое разделение + защита от downgrade/replay. (Docker Content Trust/Notary v1 ретайрится с авг-2025 — не строить на нём.)
  • Каналы РФ/мир = маршрутизация контента, не enforcement: два репозитория (ru/world) за нашим VPS; канал зашит в лицензию/конфиг агента при провижининге; air-gap пинит локально.
  • Поэтапный rollout оффлайн: ринг = HMAC(hardware_id) vs кольца в манифесте → без серверной координации, работает у офлайн-клиентов. Не удалять образ N-1, пока N не прошёл health.
  • Контроль флота — pull-only, opt-in, не control-plane: агенты POST-ят подписанный heartbeat (версия/канал/лицензия/health) когда онлайн; remote-действия — флаг в следующем манифесте (агент сам забирает), без входящих портов. Дашборд — self-host на нашем VPS (метаданные видеонаблюдения нельзя в чужой SaaS). Готовое: Portainer (free ≤3 нод) / OpenBalena, или тонкая своя heartbeat-страница.

Бюджет (минимальный — оптимизирован под «без recurring»)

  • Компиляция кода — $0 (free Nuitka --module + strip + домашняя обфускация порогов). €250/год Commercial НЕ берём. Опц. разовый PyArmor Pro/Group ~$89–158 (навсегда), если захочешь сильнее спрятать строки.
  • Cosign $0 (бэкбон подписи Docker-образа — это и есть продукт).
  • Windows-подпись: Azure Artifact Signing $9.99/мес только при не-РФ юрлице, иначе $0 (самоподпись + ручной импорт доверия). Это отдельный, опциональный слой — не про компиляцию.
  • Инсталляторы / агент / TUF / дашборд — OSS, $0 (только время + VPS).

Итого обязательных лицензий: $0. Опционально: разовый PyArmor ~$89 и/или $10/мес Windows-подпись (при не-РФ юрлице). Никаких €250/год.


Что переиспользуем из уже готового

Подпись (RSA, офлайн-verify) ✅, hardware fingerprint ✅, enforcement (cap+модули) ✅, heartbeat+grace ✅, шифрование секретов ✅, signed-update + host apply/rollback ✅, compile_core.sh (написан) 🟡. Этот brainstorm в основном связывает их вместе и переиспользует один корень доверия.

Поэтапный план реализации (device-сторона, доступна сейчас)

  1. Встроить компиляцию (compile_core.sh) в build-образ + удаление .py + boot-smoke gate.
  2. Boot integrity self-check (подписанный манифест) — переиспользовать update-подпись.
  3. Структурная привязка секретов: HKDF(license ‖ hash(binary) ‖ fingerprint).
  4. Тампер-лог (HMAC-цепочка) + анти-дебаг/Frida телеметрия (лог-only).
  5. Кворум-матч железа в fingerprint (never-brick).
  6. (Облако/CI) Cosign-подпись образа + TUF-метадата; (Windows) решение по юрлицу/самоподписи.

Остаточный риск (честно)

Root-клиент в итоге пройдёт защиту (дамп памяти после расшифровки констант, патч + ре-подпись своим ключом). Структурная привязка (HKDF) и компиляция поднимают стоимость до «часы-дни + оставляет улики», что для одно-авторского вертикального продукта — корректный, соразмерный максимум. Дальше (kernel anti-debug, anti-VM) — теряем реальных клиентов ради маржинального прироста против атакующего, который с root всё равно победит. Барьер — право+договор.


Связано: docs/DISTRIBUTION_AND_UPDATES.md, docs/LICENSE_SERVER_SPEC.md, docs/APPLIANCE_HARDENING.md, scripts/compile_core.sh, app/licensing/, app/updates/.