Безопасность по построению

Безопасность — часть каждого релиза.

Версия 0.4.4 закрыла прямую публикацию storage и построила контролируемую delivery boundary. Версия 0.4.5 распространила tenant isolation, owner checks и recovery guarantees на durable uploads, bindings и cleanup.

Текущая модель 0.4.5

Service identity → namespace → owner → operation/binding → catalog → delivery.

Trusted backend проверяет пользователя и бизнес-права. Pulse Media аутентифицирует backend, назначает namespace, применяет exact-owner policy, проверяет lifecycle transition, разрешает media через catalog и только затем открывает bytes из storage.

Защищаемые активы

Не только bytes.

Security model охватывает identities, namespace, catalog, signing keys, upload operations, bindings, processing profiles, audit и backups.

Private media

Message images, будущие documents, originals и generated artifacts.

Контекст доступа

Service credentials, namespace, exact owner, resource mapping, visibility и signing keys.

Целостность платформы

Catalog, migrations, operation history, bindings, audit, cleanup, reconciliation и backups.

Secure Delivery 0.4.4

Защищённая выдача уже реализована.

Private catalog policy применяется к фактической выдаче каждого artifact, а filesystem больше не является HTTP API.

STORAGE

Закрытый storage root

  • raw FileServer удалён;
  • arbitrary paths не принимаются;
  • originals, SQLite и directory listing недоступны;
  • physical path не включается в URL.
PRIVATE

Короткоживущий доступ

  • HMAC-SHA256 signature;
  • namespace, media ID и variant защищены подписью;
  • expiry и key ID;
  • tampering и unknown key отклоняются до catalog lookup.
PUBLIC

Отдельная public policy

  • stable catalog URL;
  • выдаётся только `visibility=public`;
  • private media скрывается как `404`;
  • долгосрочный immutable cache.
ISOLATION

Tenant boundary

  • несколько trusted service identities;
  • namespace назначается server-side;
  • cross-namespace access отклоняется;
  • service tokens не попадают client.
Attachment Lifecycle 0.4.5

Lifecycle не ослабляет security boundary.

Durable operations, bindings и cleanup используют тот же authenticated namespace и не доверяют namespace, owner или service identity из client payload.

IDEMPOTENCY

Scoped retry

Уникальность key ограничена namespace, service identity и operation type. Повтор с другим fingerprint получает conflict.

OWNER

Exact-owner transitions

Upload status, activate и release доступны только при точном совпадении namespace и owner context.

INTEGRITY

Composite namespace links

Catalog relations используют namespace-scoped queries и составную referential integrity, блокируя cross-tenant linkage.

RECOVERY

Ambiguous commit handling

Durable operation сохраняет terminal result, а uncertain response восстанавливается через status/replay без duplicate media.

CLEANUP

Удаление только без holders

Media не переходит в deleting, пока существует хотя бы один pending или active binding. Retention отделяет release от физического удаления.

RECONCILIATION

Сначала отчёт, потом repair

Startup reconciliation работает в dry-run режиме. Destructive repair не выполняется автоматически, legacy media исключено из lifecycle cleanup.

Проверяемые инварианты

Что гарантирует runtime 0.4.5.

Позитивный сценарий недостаточен: защита подтверждается negative, concurrency, recovery и end-to-end tests.

Visibility isolation

Public route не выдаёт private media, signed route не выдаёт public media.

Проверка подписи первой

Invalid signature и unknown key не превращают endpoint в oracle существования media ID.

Exact variant

Variant разрешается по catalog kind, а не строится из client-controlled path.

Idempotency conflict

Один key нельзя повторно использовать с другим файлом, owner, resource type или processing context.

Transition safety

Pending, active и released меняются только по разрешённым переходам; повторные activate/release идемпотентны.

Crash-safe deletion

Deleting state возобновляется после restart, отсутствие уже удалённого файла обрабатывается идемпотентно, history и tombstone сохраняются.

Следующие gates

Безопасность растёт вместе с продуктом.

Каждая новая поверхность добавляет новую trust boundary и не выпускается без negative, recovery и abuse model.

Batch

Защита от enumeration

Limits, per-object policy и partial results без раскрытия чужих media.

PAME

Защищённая обработка

Decoder allowlist, pixel/resource budgets, immutable profiles и artifact inheritance.

Direct upload

Scoped upload grants

Service token не попадает client, replay ограничен, quota применяется до processing.

External

Независимые clients

Scopes, quotas, targeted revoke, credential lifecycle и cross-tenant test suite.

Обязательные controls

Что проверяется в каждом релизе.

Security review является частью обычного development flow.

Access

Кто authenticated, какой namespace установлен, какой owner/resource и operation разрешены.

Abuse

Body, pixels, rate, concurrency, temporary storage и aggregate quota.

Revocation

Что происходит после delete, release, key compromise или policy change.

Recovery

Partial failure, backup, restore, migration, reconciliation и rollback.

Audit

Стабильные события без secrets, raw signatures и unsafe filenames.

Negative tests

Cross-tenant access, tampering, expiry, replay, fingerprint conflict, traversal и invalid transitions.

Правило выпуска

Новая capability появляется только после своего security gate.

Private Preview может показывать направление продукта. Production API, direct upload или multi-tenant service выпускаются только после закрытия соответствующих trust boundaries, abuse controls и recovery scenarios.