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: избегает того, чтобы «долгое пребывание в подъярусе» стало неявным «путём ослабления»; конкретный порог — в Приложении BMaxDegradedDuration.
§7.4 Различия требований к сообщениям при переключении уровня
Таблица ниже даёт для трёх направлений переключения различия в обязательных полях на уровне сообщений; если какая-либо запись «MUST» отсутствует, соответствующее сообщение переключения единообразно отклоняется с E_PROTOCOL или E_HUMAN_WITNESS_REQUIRED (см. таблицу кодов ошибок §5.4).
| Направление переключения | human_witness | Уведомление RR | Запись цепочки AC |
|---|---|---|---|
| Повышение (выше автономность) | MUST | MUST | MUST |
| Понижение (ниже автономность) | MAY | MUST | MUST |
| Emergency Override | MUST | MUST (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 «жёсткое ограничение мягкого тайм-аута»); - Конечная точка несения ответственности — всегда
issuerMandate (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 ещё не достиг своей точки мягкого тайм-аута по сроку жизни).
