Перейти к основному содержимому

Удалённая идентификация пользователей

Статус: принято 26 июля 2026 года.

Реализация: серверная идентификация удалённых пользователей добавлена 26 июля 2026 года. Настройка провайдера идентификации выполняется отдельно при развёртывании.

Контекст

GigaLoom может читать рабочие каталоги и запускать процессы с правами своей учётной записи операционной системы. Поэтому локальный UI использует одноразовый OS-local claim и серверные браузерные сессии. Такой bootstrap доказывает близость к одной OS-учётной записи, но не удалённую идентичность пользователя, tenant-границу, роль или проверяемого организационного principal.

Прежний remote opt-in обменивал один общий environment bearer на одну process-local cookie. Даже с TLS, проверкой Host, защитой CSRF и secure-cookie он не позволял различить операторов, отозвать одного пользователя, связать аудит с идентичностью или безопасно восстановить multi-user deployment.

Решение

Удалённый многопользовательский интерфейс требует серверной идентификации и отдельной настройки при развёртывании. Поддерживается один статически заданный издатель OpenID Connect на один экземпляр GigaLoom.

GigaLoom выступает confidential Backend for Frontend (BFF):

  • OpenID Connect Authorization Code flow с PKCE S256;
  • client credentials, коды, ID/access/refresh tokens не попадают в браузерный JavaScript или browser storage;
  • браузер получает только opaque host-only cookie с Secure, HttpOnly и SameSite=Strict;
  • сессии и их revocation хранятся на сервере;
  • browser API ограничен тем же origin GigaLoom;
  • issuer, client id, внешний HTTPS origin и callback URI задаются точно.

Допускаются только metadata и алгоритмы, явно проверенные identity runtime. Исключены выбираемый пользователем issuer, dynamic client registration, implicit и password flows, локальная база паролей, social-login aggregation и вставка bearer-token через форму.

Идентичность и роли

Стабильный remote actor — точная пара (iss, sub) из проверенного ID token. Email, display name, domain и другие изменяемые claims не являются ключами идентичности.

Remote identity runtime реализует две роли:

  • viewer: только чтение ограниченного product state без mutation, execution, approval, secret resolution или изменения интеграций;
  • operator: то же чтение и доступ к mutation entry points, по-прежнему ограниченный независимой системой action authority и approvals.

Subject или группа без mapping получает отказ. Роли задаются deployment-owned default-deny mapping по точным подписанным claims; роль нельзя выводить из суффикса email. Изменение роли отзывает или вращает активные сессии. Ни одна роль не меняет filesystem/process ceiling service account, поэтому tenant isolation требует отдельных экземпляров GigaLoom и OS isolation.

Audit receipt содержит стабильный недисплейный actor id, производный от проверенных issuer и subject, допущенную роль, session id и время аутентификации. Display claims можно показать временно, но нельзя использовать для авторизации.

Login и сессии

Каждая login transaction получает одноразовые expiring state, nonce и PKCE verifier, связанные с инициирующим браузером. Callback проверяет issuer, signature, algorithm, audience, authorized party при необходимости, expiry, issued-at, nonce и точный redirect URI до создания сессии. Неизвестный алгоритм, metadata drift, ошибка получения ключа, replay и недопустимый clock skew закрываются fail-closed.

Browser binding использует host-only cookie Secure, HttpOnly, SameSite=Lax, ограниченную callback path, чтобы top-level redirect от issuer мог завершиться. Полученная session cookie остаётся SameSite=Strict.

Remote session имеет абсолютный и более короткий idle lifetime и вращается при login, изменении привилегий и recovery. OAuth material не возвращается UI API и не попадает в project state, logs, diagnostics, screenshots, traces или audit receipts.

Каждый изменяющий запрос требует custom CSRF header и точной same-origin проверки вместе с session cookie. Одного SameSite недостаточно.

Logout, revocation и recovery

Локальный logout сначала отзывает серверную сессию GigaLoom и только затем при наличии проверенной capability может перейти к RP-initiated logout провайдера.

Remote identity runtime должен поддержать глобальный, actor-specific и session-specific revoke. Проверенный OIDC back-channel logout token может отозвать сессии по issuer и sid или sub; replay, неверная подпись, тип или audience закрываются fail-closed. Issuer без допущенной logout capability получает только ограниченный lifetime GigaLoom session и честный статус degraded.

Bootstrap recovery остаётся OS-local и не создаёт удалённую browser session. Он может проверить identity config, повернуть session keys GigaLoom и отозвать все remote sessions. При недоступности issuer или trusted proxy remote login недоступен; local bootstrap не становится remote break-glass credential.

Proxy и origin

Public origin — одна точная комбинация HTTPS scheme, host и port. Прямой удалённый HTTP не поддерживается. Forwarded host, scheme и client address игнорируются, если immediate peer не совпадает с явной trusted-proxy конфигурацией. Конфликтующие или недопустимые multi-hop значения отвергаются.

Allowed Hosts, callback URL, post-logout redirect и CORS — точные allowlists. Wildcard и redirect target из request запрещены. TLS termination, HSTS, лимиты размера и частоты запросов и trusted-proxy config остаются обязанностью deployment и проверяются doctor до remote startup.

Threat model

УгрозаОбязательный контроль
Утечка или replay общего bootstrapУдалить его из remote auth; отвергать non-loopback startup до настройки identity runtime.
Перехват или injection authorization codeExact redirect URI, одноразовая transaction state, Authorization Code, PKCE S256 и nonce.
Issuer mix-up или token substitutionОдин точный issuer; проверка iss, signature, algorithm, aud, azp, nonce и key provenance.
CSRF или login CSRFBrowser-bound одноразовый state, PKCE/nonce, exact Origin, strict cookie и custom mutation header.
Session fixation или кража cookieРотация opaque server-side session; host-only secure HttpOnly strict cookie; idle и absolute expiry.
Подмена proxy headers или HostForwarded fields доверяются только явным proxy peers; exact public origin и Host allowlist.
Role escalation через mutable claimsDefault-deny exact mapping; никакого email inference; revoke при изменении mapping.
Доступ после logout или инцидентаLocal, actor и global revoke; back-channel logout; bounded lifetime.
XSS или скомпрометированный assetНет OAuth tokens в browser, нет runtime third-party assets, CSP, encoding и server authorization каждого request.
Доступ одного пользователя к OS-ресурсам другого tenantВне scope одного instance; отдельные service accounts и deployments.
Недоступность IdP или потеря configFail-closed; только OS-local doctor и recovery ключей/revocation.

Операционное решение

Стоимость приемлема только для этого ограниченного single-issuer BFF profile. Он переиспользует серверную границу GigaLoom и не отдаёт provider tokens браузеру. При этом необходимы durable session/revocation storage, проверенная OIDC validation, rotation, proxy policy, role enforcement, audit identity, hermetic fixtures и deployment documentation.

Стоимость не принята для multiple issuers, tenant isolation внутри одного OS process, собственного IdP, SCIM, dynamic registration, local password recovery или live provider onboarding.

Переход и gates

Remote identity runtime реализует этот profile с hermetic issuer fixtures. Non-loopback startup теперь требует полной статической OIDC configuration и явного --allow-remote; partial config, legacy bootstrap-token input и Host allowlist работают fail-closed. OS-local команда giga ui-identity проверяет profile без запроса к issuer и может отозвать все sessions с ротацией server-side session generation.

Live client registration, provision secrets, users/groups, public callback, reverse-proxy deployment и запуск listener с реальным identity provider остаются явными внешними gates.

Основные стандарты

Последствия

Обмен общего remote bearer больше не является продуктным режимом. Identity runtime предоставляет принятую identity/session boundary, но не регистрирует и не настраивает issuer, не развёртывает proxy, не публикует listener, не выдаёт action authority, network/GitHub access и не разрешает live OIDC traffic. Локальные first-run, logout, rotation и recovery не меняются.