Перейти к содержимому
docs.
WORKSPACE

Документации проектов

Открыть каталог проектов
Localzet ServerАсинхронный PHP-серверTriangleФреймворк и компонентыMIX IDИдентификация и интеграцииHack APIПубличные API хакатонаACNПроект и компонентыUserlay / UserNetПроект и компонентыAxiomПроект и компонентыМесседжинг через почтуПроект и компонентыLWT / JWT / JOSEПроект и компонентыФинансовая аналитика KimaiПроект и компонентыМультипарадигмальная БДПроект и компонентыZorin PlatformПроект и компонентыZorin TrustПроект и компонентыFloraScope / VegwatchПроект и компонентыaegis-qДокументация проектаaevumdbДокументация проектаauditДокументация проектаauto-invest-managerАвтотрейдерcaine-companionДокументация проектаcertbot-cloudflareДокументация проектаClusterLocalzet Server / ClustercmdveilДокументация проектаConsolePHP CLICronБиблиотеки Localzet Serverdata-connectorДокументация проектаdevice-controlDevice Controlenn-projectДокументация проектаEventsБиблиотеки Localzet ServerflowsintДокументация проектаforgeДокументация проектаHttpClientБиблиотеки Localzet ServerinterpreterСобственный языкinvariaДокументация проектаkeynotesДокументация проектаknotrouteKnotroutelaravel-personal-analyticsДокументация проектаlocalzet-osДокументация проектаmeridianДокументация проектаMQTTБиблиотеки Localzet Servernano-kernelСобственная ОСNoterДокументация проектаpersonal-analyticsДокументация проектаProxyБиблиотеки Localzet ServerPSRБиблиотеки Localzet ServerPSR-7Библиотеки Localzet Serverrschs-monitorДокументация проектаsemsealДокументация проектаshardsealДокументация проектаSocketIOБиблиотеки Localzet ServerSOCKS5Библиотеки Localzet Serverstandalone-analyticsДокументация проектаstatic-php-cliДокументация проектаStorageБиблиотеки Localzet ServersutureДокументация проектаtempoweaveДокументация проектаttsСинтез речиTunnelБиблиотеки Localzet Serverui-kitUI KitvesperДокументация проектаWebAnalyzerWebAnalyzerzorin-access-brokerДокументация проектаzorin-authority-brokerДокументация проектаzorin-authority-sdk-phpДокументация проектаzorin-authority-sdk-pythonДокументация проектаzorin-authority-sdk-tsДокументация проектаzorin-client-intelДокументация проекта✓zorin-device-core-aospДокументация проектаzorin-host-agentДокументация проектаzorin-native-labДокументация проектаzorin-nodeДокументация проектаzorin-opsДокументация проектаdonstu-python-sdkДокументация проектаfloortraceFloortraceserver-rsLocalzet Server / Cluster
Каталог
Документация/zorin-client-intel

ZCI Architecture 1.0

ZCI отвечает не на вопрос «какой hash у клиента?», а на четыре независимых вопроса:

  1. Что сервер наблюдал на транспортном/TLS/HTTP уровне?
  2. Что клиент заявил через HTTP/browser APIs?
  3. Что движок может вывести из комбинации сигналов?
  4. Насколько новый observation похож на исторические observations того же tenant?

Каждый вывод хранится отдельно от первичного evidence.

┌───────────────────────┐ │ Browser SDK │ │ navigator/render/etc │ └───────────┬───────────┘ │ POST probe ▼Client ── TCP SYN ──► optional XDP sensor ─────┐ │ │ tuple cache ├─ TCP socket ──► TCP_INFO ──────────────────┤ │ │ ├─ TLS records ─► raw ClientHello parser ────┤ │ │ ├─ decrypted H1/H2 ─► wire tap ──────────────┤ │ │ └─ QUIC/H3 ─────► native Quinn/h3 listener ──┤ ▼ ConnectionContext │ ┌─────────────────┼─────────────────┐ ▼ ▼ ▼ enrichment normalization redaction │ │ │ └─────────────────┴─────────────────┘ ▼ component fingerprints │ ▼ consistency engine │ ▼ historical matcher │ ┌───────────┴───────────┐ ▼ ▼ Observation Client entity │ │ └───────────┬───────────┘ ▼ PostgreSQL / API
SVG ↗

Pure/domain layer:

  • serializable models;
  • TLS ClientHello parser;
  • JA3/JA4;
  • ZCI component fingerprints;
  • consistency/profile engine;
  • observation similarity calculation;
  • IP metadata helpers.

Core не зависит от Axum/PostgreSQL/Quinn.

Runtime/edge layer:

  • HTTP development listener;
  • TCP/TLS edge;
  • decrypted wire tap;
  • native QUIC/H3 edge;
  • browser ingestion API;
  • tenant/auth boundary;
  • storage/client graph;
  • enrichment loader;
  • metrics/retention;
  • transport-sensor correlation.

Опциональный Linux-only XDP observer. Userspace TCP socket уже не имеет доступа к исходному SYN packet, поэтому SYN fingerprint material собирается до TCP stack и join-ится по tuple.

First-party browser collector без внешних runtime dependencies. SDK ничего не отправляет сам по себе: интегратор вызывает ZCI.collect() или ZCI.observe().

TCP/TLS listener делает TcpStream::peek() до rustls handshake.

Parser:

  1. читает один или несколько TLS records;
  2. собирает handshake stream;
  3. находит ClientHello;
  4. извлекает структурные поля;
  5. считает raw ClientHello SHA-256;
  6. строит JA3/JA4/ZTLS/ZTLS-WIRE;
  7. не потребляет bytes из socket;
  8. отдаёт тот же stream rustls.

После handshake negotiated TLS metadata объединяется с pre-handshake observation.

Нормализованный fingerprint. Volatile/GREASE элементы исключаются или нормализуются, списки, где порядок не должен определять identity, сортируются.

Order-sensitive fingerprint. Сохраняет wire shape ClientHello и полезен для определения конкретной реализации/маскировки.

Использовать их следует вместе: ZTLS устойчивее, ZTLS-WIRE дискриминирует точнее.

Hyper должен получить уже разобранный transport stream, но ZCI нужен wire shape. Поэтому TapIo стоит между TLS/plain stream и Hyper и копирует только bounded prefix.

Из tap извлекаются:

  • request line;
  • exact header sequence;
  • original casing;
  • duplicate entries;
  • wire header fingerprint.

Body не нужен для wire fingerprint.

Tap распознаёт connection preface и разбирает bounded sequence frames:

  • SETTINGS IDs/values/order;
  • SETTINGS ACK;
  • WINDOW_UPDATE;
  • первые frame type/flags/stream/length tuples.

HPACK payload не сохраняется.

QUIC использует отдельный UDP listener на Quinn.

До handshake сохраняются metadata Incoming, после handshake — runtime metadata Connection, negotiated ALPN и H3 request handling через h3/h3-axum.

QUIC observation намеренно содержит только то, что runtime реально раскрывает. Он не подменяет TCP/TLS ClientHello parser и не утверждает, что видел raw CRYPTO frames, если их не видел.

Alt-Svc на HTTPS UI/SDK responses позволяет браузеру обнаружить H3 endpoint.

SYN packet │ ▼XDP parser │ ├─ remote IP ├─ remote port ├─ local port └─ TCP traits │ ▼Unix datagram │ ▼30s tuple cache │ └── join ─► accepted application connection
SVG ↗

Runtime TCP_INFO поля сохраняются при merge с sensor event.

Каждый inference содержит confidence и evidence refs.

ZCI хранит независимые components:

JA3 / JA4
ZTLS / ZTLS-WIRE
ZTCP
ZHTTP
ZH1-WIRE / ZH2
ZQUIC / ZH3
ZBROWSER
ZGPU
ZCANVAS
ZAUDIO
ZFONTS
ZINTL
ZCAP
ZSCREEN
ZMEDIA
ZAUTO

Нельзя использовать один component как identity proof. Исторический matcher учитывает доступность каждого component и разные веса.

При новом observation:

  1. выбираются recent candidate observations того же tenant за graph_window_days;
  2. рассчитывается component-level similarity;
  3. строятся probability + confidence;
  4. лучший candidate сравнивается с configurable threshold;
  5. близкий второй candidate с другим client_id переводит результат в ambiguous;
  6. иначе создаётся новый или используется существующий client_id.

Это intentionally probabilistic linkage, не криптографическая идентичность.

observations хранит:

  • индексируемые top-level fields;
  • полную immutable JSONB document representation.

clients хранит materialized summary:

  • first/last seen;
  • observation count;
  • latest profile/fingerprints.

Migrations idempotent и выполняются collector при старте. Docker image PostgreSQL также может применить их на пустом volume.

Без DATABASE_URL collector работает в memory mode. Он поддерживает тот же API/client graph, но всё теряется после restart.

Site/admin keys задаются через env mapping:

tenant-a:key-a;tenant-b:key-b
  • site key → ingestion tenant;
  • admin key → read scope tenant;
  • tenant * у admin key даёт global read scope;
  • отсутствие настроенных keys сохраняет local-development behavior.

Collector удаляет credential values до persistence. Browser sensitive APIs отделены explicit method. Historical client_id означает связь observations в рамках tenant и не должен называться реальной личностью.

Текущий 1.0 collector — самодостаточный deployable unit. Для очень большого трафика его state boundaries уже позволяют разнести без изменения data model:

  • stateless edge collectors;
  • external sensor tuple cache;
  • PostgreSQL control/client state;
  • columnar observation/event warehouse;
  • standalone enrichment service.

Такое разбиение является deployment optimization, а не требованием для корректности 1.0.

Исходник