Назад в архив
II. Клинический AI и медицинские платформыдополнительноучастникклиент анонимизирован

Anon Service — PII ↔ PHI Bridge

Внутренний микросервис, который поддерживает взаимно-однозначное соответствие между «каноническими» PII-идентификаторами пользователей и анонимными UUID для PHI-записей; шифрование через HashiCorp Vault, авторизация service-to-service через Keycloak.

Статус
активный
Период
2025-10-13 → 2025-12-09
AI-сессий
Стек
Языки
TypeScript
Фреймворки · Инфра
BunElysiaDrizzle ORMPostgresHashiCorp Vault (node-vault)Keycloak/jose JWTBiome
§01

Обзор

  • Что это: микросервис приватности/анонимизации внутри healthcare-экосистемы healthcare-platform (realm healthcare-platform-internal-service). Принимает piiUserId → возвращает детерминированный анонимный UUID (anonUserId); поддерживает обратную ре-идентификацию (строго ограниченную), ротацию и удаление по GDPR. Взаимодействует с соседними сервисами pii-service и phi-service (тоже в очереди на анализ — #46, #44).
  • Тип / статус / роль: api (внутренний REST-микросервис) / active (последний коммит 2025-12-09, CI/деплой на месте) / contributor — основную доменную логику написал Ramiro (28+1 коммитов), пользователь Davron Yuldashev — 11 коммитов, преимущественно DevOps/инфраструктура.
  • Активный период: 2025-10-13 → 2025-12-09 (~2 месяца), 40 коммитов, активная разработка с веткой fix/health-endpoints и merge-флоу.
§02

Стек

  • Языки: TypeScript (strict), рантайм Bun.
  • Фреймворки/библиотеки (из `package.json` и кода):
  • Elysia 1.4 (+ @elysiajs/cors, @elysiajs/openapi/Swagger) — HTTP-фреймворк поверх Bun.
  • Drizzle ORM 0.44 + drizzle-kit + postgres (postgres.js) — доступ к Postgres и миграции.
  • HashiCorp Vault через node-vault — Transit-шифрование (AES-256-GCM) + KV + AppRole.
  • Keycloak + jose 6 — верификация RS256 JWT через JWKS для service-to-service авторизации.
  • Biome — линт/форматирование (вместо ESLint/Prettier).
  • Инфра/деплой: Docker multi-stage (bun:1.3.3-slim, non-root пользователь), отдельный Dockerfile.migrate, docker-compose.yml + docker-compose-dev.yml с healthcheck'ами. CI: GitLab CI (.gitlab/ci/_common.yml, build.yml, deploy.yml) + GitHub workflows. Vault-хост https://vt.ksa.healthcare-platform.com.
  • Данные: PostgreSQL. 2 таблицы (drizzle/schema.ts): id_mappings (шифротексты + bytea blind index, status-enum active/rotated/deleted, версия, soft-delete deletedAt) и mapping_audit (аудит-лог: caller, action, realm, только индексы — без plaintext). Кастомный тип bytea через customType (из коробки Drizzle его не поставляет).
  • Заметный тулинг: OpenAPI-спека (docs/openapi.yaml), архитектурная документация с Mermaid (docs/ARCHITECTURE.md, DATA_FLOW.md, SEQUENCE_DIAGRAMS.md).
§03

Что реализовано

Хронология по всему проекту (для контекста) и отдельно — что сделал пользователь.

Проект в целом (в основном Ramiro):

  • Инициализация сервиса, ядро: app/db/vault/health (cd4658a, 366813a).
  • Auth + шифрование + метрики: верификация JWT, HMAC, Transit encrypt/decrypt (b8f608f).
  • Контроллер mappings → переименован в identities (GDPR-семантика), эндпоинты create/lookup/delete (f8fa0c2, e8c5c3d).
  • Service-to-service авторизация через Keycloak + RBAC-плагины (f08945b), CORS + внутренние роуты (e97f8ff).
  • Конфиг Vault/Keycloak, init/status-скрипты (d0935fe); кастомный bytea + boolean success + индекс по created_at (4b67b1a).

Вклад пользователя (git log --author="Davron", 11 коммитов — с уклоном в DevOps/инфру):

  • CI/CD + Docker dev-окружение (1d99301, 8 файлов): пайплайн GitLab CI (стадии build/deploy), docker-compose-dev.yml с Postgres, Dockerfile.migrate, multi-stage Dockerfile.
  • Хардненинг контейнера (37c72d8, b9081c0): non-root пользователь (groupadd/useradd), фикс ownership, bun:1.3-slim для builder и prod.
  • Health-пробы (f0ae025, 385+/1492−): liveness/readiness эндпоинты с типизированными схемами ответов + OpenAPI-описания; обновление зависимостей (пересборка bun.lock).
  • Swagger/конфиг (e674d63, c2b1e1a, 47bbfc2), docker-compose depends_on/healthcheck (bc95012), финальные правки CI/деплоя (ae86fe6).
  • Vault-путь + debug-логирование (4a1a524) — ⚠️ см. «Технические челленджи».
  • Объём: 11/40 коммитов (~28%), сосредоточены в инфраструктуре и операционной готовности, а не в доменной крипто-логике.
§04

Технические челленджи

Только то, что подтверждено в коде (с путями/хешами).

  • Детерминированный поиск по зашифрованным данным → паттерн blind index: pii_user_id хранится в зашифрованном виде (Vault Transit, crypto.ts/mapping-service.ts:62), а для поиска вычисляется HMAC-SHA256(key, value) (services/hmac.ts:23) и кладётся в bytea-колонку. Поиск идёт через индекс (mapping-service.ts:41-44), без plaintext в БД. Сильное решение в области privacy-engineering (уровень Senior) — *авторство Ramiro*.
  • Аудит без утечки PII → таблица mapping_audit пишет только blind-индексы и метаданные (caller, action, success), а не сами идентификаторы (schema.ts:43-55, mapping-service.ts:8-28). GDPR-friendly. *Авторство Ramiro.* ⚠️ audit() глотает ошибки пустым catch {} — сбои записи аудита остаются незамеченными.
  • Service-to-service RBAC на Keycloakmiddleware/service-auth.ts: верификация RS256 через createRemoteJWKSet, проверка iss, требование service-account (preferred_username начинается с service-account-), извлечение realm- и client-ролей; компонуемые Elysia-плагины requireServiceRole/requireServiceClient/requireServiceClientWithRole. Чисто и хорошо типизировано. *Авторство Ramiro.*
  • Soft-delete + машина статусов → enum active/rotated/deleted, версионирование, deletedAt (GDPR-удаление как маркер, mapping-service.ts:120-173).
  • Вклад пользователя — операционная готовность: контейнеризация (multi-stage, non-root), CI/CD-пайплайн (GitLab), liveness/readiness-пробы в стиле Kubernetes с OpenAPI-схемами, healthcheck-зависимости в compose. Реальный DevOps/platform-скилл для security-критичного сервиса.
  • ⚠️ Найденные проблемы безопасности (честно — НЕ показывать публично как есть): 1. config/vault.ts:31-33strictSSL: false / rejectUnauthorized: false: проверка TLS до Vault отключена. 2. services/hmac.ts:8,11,19-22 и mapping-service.ts:35-37console.log печатает HMAC-ключ, plaintext `piiUserId`, blind index и ответ Vault. В логи утекает ровно то, что сервис существует защищать; README явно декларирует «No raw IDs in logs». Эти debug-логи добавил пользователь в коммите 4a1a524 («Added console logging ... of piiUserId and computed indices», «Enhanced logging in hmac service»). Реальный баг + репутационный риск.
§05

AI-разработка

  • Найдено сессий: 0. Проверено по ключу нормализации полного пути для этого проекта — совпадений нет. (Стиль commit-сообщений и .cursor/ в репозитории намекают на возможное использование Cursor, но прямых свидетельств в локальной директории сессий Claude Code нет.)
  • Что было сделано с AI: данных нет.
  • Паттерны AI-воркфлоу: отсутствуют.
  • Сессий нет.
§06

Достижения и метрики

Из кода/документации, без домыслов:

  • 5 ролевых операций маппинга идентичностей (write/read/reidentify/delete/rotate), привязанных к Keycloak-ролям anon:*.
  • 2 таблицы + 3 миграции; enum-машина статусов + версионирование + soft-delete.
  • Полный набор health-проб: /health/live, /health/ready, /api/v1/internal/health (+ статус JWKS).
  • Интеграция с 3 системами: Vault (Transit+KV+AppRole), Keycloak (JWKS/JWT), Postgres.
  • CI/CD на 2 платформах (GitLab + GitHub Actions), Docker multi-stage + образ для миграций.
  • Метрик нагрузки/масштаба нет (внутренний проприетарный сервис).
§07

Контрибьюторы

git shortlog · все ветки

  1. Dave9311
  2. Ramiro29
2 контрибьютора40 коммитов всего
Сейчас

Открыт к ролям Senior / Staff инженера и избранному фрилансу — продакшн-AI, платформы и full-stack разработка.

Связаться