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-плата не оправдана.
- Прятать строки/константы БЕЗ подписки: (а) $0 —
strip.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-сторона, доступна сейчас)¶
- Встроить компиляцию (
compile_core.sh) в build-образ + удаление .py + boot-smoke gate. - Boot integrity self-check (подписанный манифест) — переиспользовать update-подпись.
- Структурная привязка секретов:
HKDF(license ‖ hash(binary) ‖ fingerprint). - Тампер-лог (HMAC-цепочка) + анти-дебаг/Frida телеметрия (лог-only).
- Кворум-матч железа в fingerprint (never-brick).
- (Облако/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/.