Faying Protocol/1.0 — §7 Уровни авторизации

Навигация по тексту протокола: Оглавление | предыдущая §6 Криптография | следующая §8 Жизненный цикл

§7 Уровни авторизации

Эта глава даёт семантику уровневой авторизации Faying Protocol. Faying Protocol не принимает «универсальное делегирование всех полномочий» — каждый Mandate должен явно объявлять уровень, и три столбца каждого уровня (autonomy, требование присутствия, требование к сообщениям) несут точную семантику на уровне протокола; переключения уровня по событиям исчерпывающе и жёстко закодированы под матрицей §7.2; §7.3 фиксирует принцип монотонности «потеря присутствия → обязано ужесточиться»; §7.4 даёт обязательные различия на уровне сообщений; §7.5 вводит подуровни Endorsement Grades, наслаиваемые поверх G1–G4 как слой разрешения офлайн-автономности.

Ортогональное отношение между G0 и G1–G4: G0 Emergency Override не входит в непрерывный спектр уровней G1 ↔ G4; это ортогональный канал переопределения. G1–G4 выражают «непрерывную ось силы автономности»; G0 — это аварийный канал для одностороннего возврата контроля Human Prime, проявляющийся только на уровнях приоритета очереди событий и терминального состояния (Suspended); он не участвует в семантике «повышение / понижение». Любая реализация, трактующая G0 как «непрерывный ярус, строже G1», несогласована с семантикой протокола.

Справка по числовым бюджетам: числа max-staleness в этой главе (G1=5 с / G2=60 с / G3=5 мин / G4=30 мин) соответствуют один к одному записи Presence max-staleness (G1..G4) в Приложении B «Бюджеты параметров по умолчанию»; столбец «По умолчанию» в Приложении B — это референсное значение, используемое в этой главе, а столбец «Верхняя граница» — жёсткая верхняя граница уровня протокола, в пределах которой реализации могут настраиваться.

§7.1 Точные определения уровней

УровеньАвтономностьТребование присутствияТребование к сообщениямПодходит для
G0 Emergency OverrideН/ДН/ДИнициируется HP в одностороннем порядке; единственный эффект: немедленно перевести целевой Mandate в SuspendedАварийный перехват
G1 StrictОчень низкаяНепрерывное присутствие в реальном времени (face / WebAuthn UV, max-staleness ≤ 5 с)Каждый внешний вызов должен нести PresenceSignal ≤ 5 сНеобратимые операции (переводы, подписание, удаление БД, высокопривилегированные команды терминала)
G2 ModerateСредняяПрисутствие на уровне задачи (свежее присутствие требуется перед чувствительными подзадачами, max-staleness ≤ 60 с)PresenceSignal перед чувствительными действиямиСреднечастотные агентские операции (бронирование, перенос, отправка форм)
G3 LooseВысокаяЗапрос на ключевых шагах (intent-ticket перед ключевыми точками решений)Одноразовый intent-ticket несётся на ключевых шагахДолгосрочный низкорисковый агент (сортировка почты, календарь)
G4 AutonomousОчень высокаяПериодический heartbeat (presence-heartbeat, max-staleness ≤ 30 мин)Поддержание heartbeat + периодический аудиторский возвратРутина с автономностью в пределах scope

Проектный выбор: G0 не входит в непрерывный спектр G1 ↔ G4; это ортогональный канал переопределения — его единственная цель: позволить HP немедленно вернуть контроль при любом состоянии.

Соглашение об оси автономности: G0 < G1 < G2 < G3 < G4 (большие значения = выше автономность). Все решения «повышение / понижение» в остальной части этой главы основаны на сравнениях размера между target.autonomy и current.autonomy; G0 не участвует в этом сравнении оси — он односторонне мигрирует в Suspended через последнюю строку матрицы §7.2.

Требование присутствия, выровненное с типами Presence_Signal (см. таблицу типов сигналов §3.2):

  • G1 Strict: типичные сигналы face-continuous или webauthn-uv-fresh, max_staleness_ms = 5_000;
  • G2 Moderate: типичный сигнал fingerprint-tap (перед чувствительными подзадачами), max_staleness_ms = 60_000;
  • G3 Loose: типичный сигнал intent-ticket (одноразовое потребление на ключевых шагах); нет периодической верхней границы max-staleness, но каждый ключевой шаг должен иметь свежий intent-ticket;
  • G4 Autonomous: типичный сигнал presence-heartbeat-only, max_staleness_ms = 1_800_000 (30 мин).

Различия требований к сообщениям (с перекрёстной ссылкой на перечень сообщений §5):

  • GRADE_SWITCH в направлении повышения на G1 / G2: human_witness обязателен (MUST), форма свидетельства по умолчанию — утверждение WebAuthn UV (см. наборы алгоритмов §6.1);
  • G3 / G4: повышения к этим ярусам (которые всё ещё принадлежат пути «ослабления автономности», даже когда target.autonomy ниже исходного уровня) также требуют human_witness; только на пути «активного понижения» human_witness деградирует до MAY;
  • G0: может инициироваться только HP в одностороннем порядке (G0, заменённый IF / MS / SA, отклоняется с E_PROTOCOL); требует проверяемого human_witness; сообщения G0 должны записываться в Attestation Chain и очередь push Revocation Registry с наивысшим приоритетом.

§7.2 Матрица условий-триггеров

Таблица ниже — матрица переходов состояний 6×4 для 6 классов событий-триггеров × 4 текущих уровней не-G0; это обязательное отображение событие → терминальное состояние уровня протокола; пути перехода вне этой таблицы не существует.

СобытиеТекущий G1Текущий G2Текущий G3Текущий G4
Свежесть присутствия истекла→ Suspended→ G3 Loose→ Suspended→ Suspended
Активное повышение HP—→ G1 (требуется свидетельство)→ G2 / G1 (требуется свидетельство)→ G3 / G2 / G1 (требуется свидетельство)
Активное понижение HP→ G2→ G3→ G4—
Обнаружено отклонение Ego→ Revoked→ Revoked→ Revoked→ Revoked
Реестр отзыва недостижимОтклонить вызовОтклонить вызовОтклонить вызовОтклонить вызов
G0 Override→ Suspended→ Suspended→ Suspended→ Suspended

Семантические дополнения к матрице:

  • Асимметрия строки «свежесть присутствия истекла»: G2 → G3 — допустимое «мягкое понижение» (всё ещё на ветви состояния Active); G1 / G3 / G4 → Suspended выражают три разные логики решения — G1, потому что в высокочувствительных сценариях «нет свежего присутствия → действие не разрешено»; G3, потому что в сценариях intent-ticket heartbeat не является основным основанием присутствия, и непрерывное отсутствие свежих сигналов на ключевых шагах рассматривается как недоверенное; G4, потому что heartbeat — его единственное основание присутствия, и потеря heartbeat поглощается напрямую в Suspended (согласовано с исключением §7.3).
  • Строка «активное повышение HP»: «—» при G1 означает, что G1 уже строжайший ярус без пространства для повышения; остальные допускают одноразовые повышения через 1–3 яруса, все требующие human_witness (см. §7.4).
  • Строка «активное понижение HP»: «—» при G4 означает, что G4 уже самый снисходительный ярус без пространства для понижения; направление понижения не требует human_witness, но уведомления RR и записи цепочки AC остаются обязательными.
  • Строка «обнаружено отклонение Ego»: все четыре яруса единообразно входят в терминальное состояние Revoked (Revoked — поглощающее состояние; см. §8 / Property 10); логика решения, запускающая эту строку, совместно задаётся §3.6 Behavior Baseline Service и §9.10.6 T5.
  • Строка «реестр отзыва недостижим»: все четыре яруса единообразно «отклонить вызов»; это не переход состояния — это путь конвергенции Default-Deny для единичного вызова (код ошибки E_RR_UNAVAILABLE); сам Mandate остаётся на текущем уровне; эта строка согласована с инвариантом RR §3.4 I-RR-2.
  • Строка «G0 Override»: инициируется HP в одностороннем порядке; все четыре яруса единообразно поглощаются в Suspended; обрабатывается с наивысшим приоритетом в очереди событий (любое отложенное событие уступает).

§7.3 Принцип монотонности понижения

Без присутствия — строже — это контринтуитивная, но обязательная форма Graceful-Degradation: потеря сигнала присутствия означает «сужение человеческого видения», поэтому автономность должна ужесточаться, а не ослабляться. В числовом выражении: потеря присутствия → значение уровня уменьшается (строже).

Формальное выражение (выровнено с P11):

∀ M ∈ ActiveMandates. PresenceState(M).stale = true ⟹
    next_state(M) ∈ { Degraded(g'), Suspended }
    where g'.autonomy < M.grade.autonomy

То есть: после потери присутствия следующий переход состояния должен мигрировать к уровню со строго меньшей autonomy (меньшее число, выше безопасность) или напрямую мигрировать в Suspended; оставаться на исходном уровне запрещено, переключаться в сторону большей автономности запрещено.

Исключения (ограничения поглощающего состояния):

  • Потеря heartbeat G4 Autonomous → напрямую Suspended: поскольку G4 уже ярус наивысшей автономности без доступного более строгого яруса, прямое поглощение в Suspended — жёсткое ограничение уровня протокола (согласовано со столбцом G4 первой строки матрицы §7.2).
  • Состояние Degraded, превышающее MaxDegradedDuration → напрямую Suspended: избегает того, чтобы «долгое пребывание в подъярусе» стало неявным «путём ослабления»; конкретный порог — в Приложении B MaxDegradedDuration.

§7.4 Различия требований к сообщениям при переключении уровня

Таблица ниже даёт для трёх направлений переключения различия в обязательных полях на уровне сообщений; если какая-либо запись «MUST» отсутствует, соответствующее сообщение переключения единообразно отклоняется с E_PROTOCOL или E_HUMAN_WITNESS_REQUIRED (см. таблицу кодов ошибок §5.4).

Направление переключенияhuman_witnessУведомление RRЗапись цепочки AC
Повышение (выше автономность)MUSTMUSTMUST
Понижение (ниже автономность)MAYMUSTMUST
Emergency OverrideMUSTMUST (push с наивысшим приоритетом)MUST

Семантические дополнения на уровне сообщений:

  • Направление повышения: когда GRADE_SWITCH.target_grade.autonomy > current_grade.autonomy, human_witness обязателен; отсутствие или неверная подпись → E_HUMAN_WITNESS_REQUIRED (код ошибки 1010). Ограничение этой строки полностью выровнено с Requirement 6.1.
  • Направление понижения: human_witness деградирует до MAY, но уведомления RR и записи цепочки AC остаются обязательными — понижения тоже класс изменений состояния, требующих аудита и наблюдаемости; «тихое понижение» запрещено.
  • Emergency Override (G0): human_witness обязателен; уведомления RR должны проталкиваться с наивысшим приоритетом (согласовано с полем приоритета канала push RR §3.4); записи цепочки AC записываются с наивысшим приоритетом.
  • Протокольная семантика «запись цепочки AC обязательна»: каждый GRADE_SWITCH (повышение / понижение / G0 одинаково) порождает AttestationEvent с event_type = "grade-switch" (см. §3.3), дописываемый MS немедленно после завершения переключения; отсутствие → рассматривается как пробел аудита, запуская E_ATTESTATION_INVALID.

§7.5 Подуровни Endorsement Grades

Проектная позиция: Endorsement — не новый уровень, а «слой разрешения офлайн-автономности», наслаиваемый поверх G1–G4. Каждый не-G0 уровень (то есть G1–G4) может иметь наложение endorsement, позволяющее Mandate автономно действовать в ограниченных рамках во время физического обрыва связи (судится по §3.5 Liveness Channel и конечному автомату §4.3). G0 Emergency Override не допускает наложения endorsement — это канал для одностороннего возврата контроля HP, взаимоисключающий с семантикой «офлайн-автономности».

Семантика наложения:

Основной уровеньEndorsement разрешёнЭффект endorsement по умолчанию
G0 Emergency OverrideНе разрешён—
G1 StrictРазрешёнВо время физического обрыва связи → Disconnected; endorsed_scope обычно минимальное подмножество высокочувствительных действий; endorsed_grade по умолчанию = G1 (без понижения)
G2 ModerateРазрешёнendorsed_grade по умолчанию = G2; типичное использование: запланированные задачи / завершение уже начатых транзакций
G3 LooseРазрешёнendorsed_grade по умолчанию = G3; типичное использование: сортировка информации / операции класса чтения при офлайн-продолжении
G4 AutonomousРазрешёнendorsed_grade по умолчанию = G4; типичное использование: долговременное офлайн-агентство + пакетная сверка после переподключения

Жёсткие ограничения подуровней (сцеплены с Requirement 11.2; в конечном счёте фиксируются P16.3):

  • схождение scope: endorsement.endorsed_scope ⊆ Mandate.scope;
  • схождение grade: endorsement.endorsed_grade.autonomy ≤ Mandate.grade.autonomy (то есть endorsed_grade не слабее основного уровня по автономности, безопасность ≥ основного уровня);
  • конечный срок жизни: endorsement.endorsed_lifetime должен быть конечным; ∞ или отсутствие запрещены, и ≤ (Mandate.not_after − Mandate.not_before); Приложение B дополнительно даёт мягкую верхнюю границу Endorsed_Lifetime (по умолчанию 4 ч, верхняя граница 12 ч);
  • перечислимость политики офлайн-отзыва: endorsement.offline_revocation_policy ∈ {"stop-and-audit", "stop-only", "graceful-stop"}; по умолчанию stop-and-audit.

Если какое-либо жёсткое ограничение нарушено, BOOTSTRAP / DELEGATE единообразно отклоняется с E_ENDORSEMENT_INVALID (код ошибки 1013) (см. §5.4); при DELEGATE дополнительно child.endorsement должен сходиться в пределах parent.endorsement — то есть endorsed_scope / endorsed_grade / endorsed_lifetime дочернего Mandate не должны превышать соответствующих полей родительского Mandate.

Координация с конечным автоматом обрыва связи (см. §4.3, §8.4, §9.8):

  • Когда PresenceState.stale = true и Mandate является Endorsed_Mandate → Active → Disconnected (не-Endorsed путь идёт напрямую → Suspended);
  • Во время Disconnected iFay разрешено выполнять действия измерения D только в пределах endorsement.endorsed_scope, ограниченные endorsement.endorsed_grade;
  • Как только endorsement.endorsed_lifetime истекает, мягкий тайм-аут немедленно → Disconnected → Revoked, даже пока iFay остаётся физически отключённой (Requirement 11.3 пункт 3 «жёсткое ограничение мягкого тайм-аута»);
  • Конечная точка несения ответственности — всегда issuer Mandate (Human Prime), не изменяемая существованием endorsement (см. P16.5 Endorsement_Accountability_Invariant и Requirement 11.4).

Взаимоисключение между Endorsement и G0: G0 Emergency Override — это канал для одностороннего возврата контроля HP; его семантика нацелена на состояние Suspended («немедленно остановить все действия измерения D»). Семантика Endorsement нацелена на «подмножество действий измерения D, разрешённых во время физического обрыва связи». Эти двое — взаимоисключающие события в конечном автомате — как только запускается G0, целевой Mandate немедленно поглощается в Suspended; во время Suspended Mandate более не применяет правила пропуска измерения D из endorsement (даже если endorsement ещё не достиг своей точки мягкого тайм-аута по сроку жизни).