zorin-client-intel
Zorin Client Intelligence (ZCI) — self-hosted client-intelligence и device-fingerprinting engine, который объединяет сетевые, TLS, HTTP, QUIC и browser-side сигналы в единый evidence profile.
ZCI не сводит клиента к одному «visitor hash». Каждый observation хранит происхождение данных и независимые component fingerprints, а historical client graph оценивает вероятность того, что новый observation относится к ранее наблюдавшемуся client entity.
Возможности финального релиза 1.0
Заголовок раздела «Возможности финального релиза 1.0»Network / transport
Заголовок раздела «Network / transport»- реальный peer IPv4/IPv6 и socket metadata;
- trusted-proxy mode с allowlist CIDR;
- offline CIDR enrichment: Geo/ASN/organization/network type/VPN/proxy/Tor flags;
- Linux TCP runtime telemetry через
TCP_INFO; - optional XDP/eBPF SYN sensor: TTL/Hop Limit, MSS, window, scale, SACK, timestamps, ECN, TCP option order;
ZTCPfingerprint.
Collector смотрит исходные ClientHello bytes до rustls termination:
- ClientHello через один или несколько TLS records;
- record/legacy/supported TLS versions;
- cipher suites и их порядок;
- extension IDs и детали;
- groups, EC point formats, signature algorithms;
- certificate signature algorithms;
- key shares;
- ALPN и SNI;
- PSK modes, session ticket, early data;
- padding;
- certificate compression;
- GREASE;
- ECH/ALPS indicators;
- raw ClientHello SHA-256;
- JA3;
- JA4;
ZTLS— нормализованный fingerprint;ZTLS-WIRE— order-sensitive fingerprint;- negotiated TLS version/ALPN.
Случайные/секретные TLS values не сохраняются как fingerprint material.
HTTP/1.1 и HTTP/2
Заголовок раздела «HTTP/1.1 и HTTP/2»После TLS termination используется wire-tap до Hyper parser:
- H1 request line;
- точный wire-order заголовков;
- исходный header casing;
- duplicate header observations;
ZH1-WIRE;- HTTP/2 client preface;
- SETTINGS values и wire-order;
- SETTINGS ACK;
- initial WINDOW_UPDATE;
- последовательность первых frames;
ZH2;- нормализованный application-level
ZHTTP.
Credential-bearing header values redacted до хранения.
Native QUIC / HTTP/3
Заголовок раздела «Native QUIC / HTTP/3»Отдельный listener на Quinn + h3:
- UDP peer/local metadata;
- address-validation state;
- original destination connection ID length;
- negotiated H3 ALPN;
- runtime RTT;
- max datagram size;
ZQUIC;ZH3для доступного H3/runtime material;Alt-Svcdiscovery с HTTPS endpoint.
ZCI не выдумывает QUIC-поля, которых выбранный userspace QUIC API не предоставляет. TCP/TLS listener остаётся источником сырого TLS ClientHello/JA3/JA4.
Browser probe
Заголовок раздела «Browser probe»web/probe.js — dependency-free first-party SDK с режимами essential, security, full:
- User-Agent + UA Client Hints/high-entropy values;
- navigator/platform/languages/hardwareConcurrency/deviceMemory/touch;
- screen, viewport, DPR, orientation;
- Intl/timezone/formatting;
- media queries/input/display/privacy preferences;
- WebGL/WebGL2/WebGPU;
- Canvas;
- OfflineAudio;
- font metric inference;
- codecs/media capabilities;
- storage/permissions;
- Network Information API;
- Battery API;
- Performance API;
- browser/platform capability matrix;
- automation indicators;
- speech voices;
- component fingerprints
ZBROWSER,ZGPU,ZCANVAS,ZAUDIO,ZFONTS,ZINTL,ZCAP,ZSCREEN,ZMEDIA,ZAUTO.
Permission-gated/особенно чувствительные probes вынесены в отдельный explicit opt-in: geolocation, Local Font Access, media devices, keyboard layout, WebRTC candidate collection.
Correlation / client graph
Заголовок раздела «Correlation / client graph»Каждый POST /api/v1/observe получает:
- immutable
observation.id; - tenant-scoped
client_id; - resolution
new_client,matched_clientилиambiguous; - weighted similarity probability;
- confidence по доступному evidence;
- matching/conflicting component list;
- consistency/anomaly profile;
- automation/privacy/network risk scores.
Смена IP или одной нестабильной browser/TLS части не обязана создавать нового client entity.
SaaS / operations
Заголовок раздела «SaaS / operations»- PostgreSQL JSONB + in-memory development mode;
- tenant-scoped public site keys и secret admin keys;
- CORS allowlist;
- observation retention;
- Prometheus text metrics;
- self-inspection UI
/inspect; - health/schema endpoints;
- Docker Compose;
- optional eBPF sidecar compose profile;
- CI для Rust, JS и Linux sensor;
- smoke test.
Быстрый запуск
Заголовок раздела «Быстрый запуск»1. Native HTTP-only
Заголовок раздела «1. Native HTTP-only»cargo run -p client-intel-collectorОткрыть:
http://localhost:8080/inspectВ этом режиме browser/HTTP/IP сигналы работают, но TLS и HTTP/3 отсутствуют.
2. HTTPS + HTTP/2 + HTTP/3
Заголовок раздела «2. HTTPS + HTTP/2 + HTTP/3»./scripts/dev-cert.sh
ZCI_TLS_CERT=certs/cert.pem \ZCI_TLS_KEY=certs/key.pem \cargo run -p client-intel-collectorОткрыть:
https://localhost:8443/inspectHTTPS listener использует TCP :8443, native HTTP/3 — UDP :8443. После первого HTTPS-ответа ZCI публикует Alt-Svc для H3 discovery.
3. Docker Compose
Заголовок раздела «3. Docker Compose»cp .env.example .env./scripts/dev-cert.shdocker compose up --buildС Linux SYN sensor:
ZCI_SENSOR_INTERFACE=eth0 docker compose --profile sensor up --buildXDP sidecar требует Linux, BTF и privileged access для attach.
Smoke test
Заголовок раздела «Smoke test»./scripts/smoke.shПолная release-проверка на машине с Rust toolchain:
./scripts/release-check.shИли для другого endpoint:
ZCI_BASE_URL=https://example.test ./scripts/smoke.shBrowser SDK
Заголовок раздела «Browser SDK»Минимально:
<script src="https://intel.example.com/probe.js"></script><script> const observation = await ZCI.observe({ endpoint: "https://intel.example.com/api/v1/observe", siteKey: "PUBLIC_SITE_KEY", mode: "security" });
console.log(observation.client_id, observation.resolution);</script>siteKey предназначен для first-party браузерной интеграции и не считается секретом. Чтение сохранённых observations защищается отдельным admin key.
Explicit sensitive collection запускается только интегратором:
const sensitive = await ZCI.collectSensitive({ geolocation: true, localFonts: true, mediaDevices: true, keyboardLayout: true, webRtcCandidates: true,});Не включайте эти probes без подходящего UX/consent/legal basis.
Основные endpoints:
GET /healthGET /metricsGET /api/v1/schemaGET /probe.jsGET /inspect
POST /api/v1/observeGET /api/v1/observations/:idGET /api/v1/compare/:left/:rightGET /api/v1/clients/:idPOST /api/v1/observeиспользуетX-ZCI-Site-Key, если настроены site keys.- read/compare/client endpoints используют
X-ZCI-Admin-Key, если настроены admin keys.
Подробнее: docs/API.md.
Data model
Заголовок раздела «Data model»ZCI принципиально различает:
- observed — сервер увидел сам;
- claimed — клиент сообщил о себе;
- inferred — движок сделал вероятностный вывод;
- enriched — данные пришли из явно подключённой внешней/offline базы.
Это не позволяет эвристике тихо превратиться в «факт».
Privacy/security defaults
Заголовок раздела «Privacy/security defaults»По умолчанию ZCI:
- не сохраняет значения
Authorization,Proxy-Authorization,Cookie,Set-Cookie, ZCI/API keys; - не сохраняет query values: остаются только path + имена/порядок параметров;
- очищает browser
document.referrerот credentials/query/fragment; - не доверяет
X-Forwarded-For, пока trusted-proxy mode явно не включён; - не запускает permission-gated browser probes автоматически;
- использует finite retention;
- не называет fingerprint криптографическим доказательством личности.
См. SECURITY.md и docs/PRIVACY.md.
Структура
Заголовок раздела «Структура»crates/client-intel-core/ parser, fingerprints, models, correlationservices/collector/ HTTP/TLS/QUIC edge + API + storagesensors/linux-tcp/ optional XDP/eBPF SYN sensorweb/probe.js browser SDKweb/inspect.html self-inspection consolemigrations/ PostgreSQL schemadata/ offline enrichment exampledocs/ architecture/API/deployment/privacy/catalogscripts/ development/smoke helpers