# Модель машинной аутентификации и уровней защиты операций

## 1. Назначение документа

Этот документ фиксирует целевую модель машинного доступа к опубликованным инструментам платформы. Модель строится вокруг двух принципов:

- длинноживущий машинный доступ принадлежит конкретному AI-агенту, а не рабочей области в целом;
- требуемый уровень защиты определяется характером данных конкретной операции.

Именно поэтому в системе должны быть одновременно:

- ключ AI-агента как базовый машинный credential;
- режимы выдачи токенов разной строгости;
- обязательная политика защиты на уровне операции.

## 2. Базовая идея

Внутри платформы нужно различать:

1. чем клиент подтверждает право подключиться к агенту;
2. какой уровень защиты требует операция;
3. достаточно ли текущего машинного доступа для вызова этой операции.

Следовательно, решение нельзя строить только вокруг одного универсального токена. Оно должно учитывать и тип credential, и чувствительность самой ручки.

## 3. Уровни защиты операции

Каждая операция получает обязательный уровень защиты.

### 3.1. `standard`

Используется для обычных данных и типовых интеграционных вызовов.

Разрешенный доступ:

- статический ключ AI-агента;
- короткоживущий токен;
- одноразовый токен.

### 3.2. `elevated`

Используется для чувствительных внутренних данных, для которых постоянного ключа уже недостаточно.

Разрешенный доступ:

- короткоживущий токен;
- одноразовый токен.

Статический ключ AI-агента для такого уровня уже недостаточен.

### 3.3. `strict`

Используется для максимально чувствительных данных, например содержащих коммерческую тайну, персональные данные высокой категории риска или иные критичные сведения.

Разрешенный доступ:

- только одноразовый токен на вызов.

Ни статический ключ, ни обычный короткоживущий токен для такого вызова не должны считаться достаточными.

## 4. Виды машинного доступа

### 4.1. Статический ключ AI-агента

Это длинноживущий ключ, принадлежащий одному агенту.

Свойства:

- привязан к одному `workspace`;
- привязан к одному `agent`;
- не используется для административных действий;
- может быть отозван и перевыпущен;
- в открытой редакции является основным механизмом подключения.

### 4.2. Короткоживущий токен

Это временный токен, выдаваемый на ограниченный срок.

Свойства:

- небольшой срок жизни;
- ограниченная область действия;
- может обновляться через стандартный поток OAuth 2.0;
- подходит для платформенного размещения, где важен баланс удобства и безопасности.

### 4.3. Одноразовый токен

Это токен, который разрешает один вызов конкретной операции или одной логической единицы доступа.

Свойства:

- очень короткий срок жизни;
- один допустимый вызов;
- после первого использования считается исчерпанным;
- предназначен для максимально чувствительных операций.

## 5. Правило сопоставления

Для вызова операции сервер сравнивает:

- уровень машинного доступа клиента;
- обязательный уровень защиты операции.

Правило простое:

- если уровень доступа ниже, чем требует операция, вызов запрещается;
- если уровень доступа равен или выше, вызов разрешается.

Именно это правило делает политику защиты независимой от того, в каком агенте опубликована операция.

## 6. Роль AI-агента

AI-агент:

- группирует операции;
- формирует MCP-поверхность;
- имеет собственный ключ подключения.

AI-агент не должен:

- ослаблять уровень защиты операции;
- переопределять критичность данных;
- разрешать более слабый способ вызова, чем требует сама операция.

Если в одном агенте опубликованы и обычные, и критичные операции, правила доступа к ним все равно различаются по уровню защиты самих операций.

## 7. Поддержка по редакциям продукта

### 7.1. Community

Открытая редакция должна поддерживать только один режим:

- статический ключ AI-агента.

Соответственно, в Community допустимы только операции уровня:

- `standard`.

### 7.2. Cloud или управляемая платформа

Для платформенного размещения должны поддерживаться:

- статический ключ AI-агента как режим совместимости;
- короткоживущие токены по OAuth 2.0 как рекомендуемый режим.

Реализация этого режима должна рассматриваться как коммерческий контур и не должна требовать размещения private token-issuer logic в public repository.

Соответственно, платформа может обслуживать операции уровня:

- `standard`;
- `elevated`.

### 7.3. Enterprise

Для корпоративной редакции должны поддерживаться все три режима:

- статический ключ AI-агента;
- короткоживущий токен;
- одноразовый токен.

Enterprise-реализация должна поставляться через private delivery и опираться на capability-gated integrations в public codebase.

Соответственно, допускаются операции уровня:

- `standard`;
- `elevated`;
- `strict`.

## 8. Потоки аутентификации

### 8.1. Community

1. Пользователь создает AI-агента.
2. Платформа выдает статический ключ AI-агента.
3. Клиент `Codex`, `Claude Code` или другой MCP-клиент использует этот ключ как bearer token при подключении к MCP endpoint.

Это самый простой и совместимый вариант.

### 8.2. Cloud или управляемая платформа

1. Пользователь или клиент проходит машинную аутентификацию.
2. Сервер авторизации выдает короткоживущий токен доступа.
3. Клиент использует его при работе с MCP endpoint.
4. По истечении срока действия токен обновляется через стандартный механизм обновления.

Этот вариант должен опираться на OAuth 2.0 и обычный механизм refresh.

### 8.3. Enterprise

1. Клиент получает разрешение на вызов чувствительной операции.
2. Сервер выдает одноразовый токен.
3. Клиент выполняет один вызов.
4. Токен становится недействительным.

Этот режим должен использоваться только там, где характер данных действительно требует такого уровня защиты.

## 9. Опорные стандарты

Для реализации расширенных режимов разумно опираться на готовые стандарты.

### OAuth 2.0

Используется как основа для короткоживущих токенов и их обновления.

### RFC 8693

Может использоваться как ориентир для схемы обмена одного вида machine credential на другой токен доступа.

### RFC 9449

Может использоваться как ориентир для будущей привязки токена к ключевой паре клиента, если потребуется дополнительная защита от повторного использования перехваченного токена.

## 10. Модель данных

Для этой схемы достаточно следующих базовых сущностей.

### `AgentKey`

Поля:

- `id`
- `workspace_id`
- `agent_id`
- `name`
- `prefix`
- `secret_hash`
- `status`
- `created_at`
- `last_used_at`
- `expires_at`

### `IssuedAgentToken`

Поля:

- `id`
- `workspace_id`
- `agent_id`
- `token_kind`
- `status`
- `expires_at`
- `used_at`
- `max_uses`
- `used_count`
- `created_at`

### Поля операции

На уровне операции должна появиться обязательная политика:

- `security_level`

Допустимые значения:

- `standard`
- `elevated`
- `strict`

## 11. Административный интерфейс

Настройка должна быть максимально простой.

На этапе создания или редактирования операции пользователь выбирает:

- `Обычный`
- `Повышенная защита`
- `Максимальная защита`

Смысл вариантов:

- `Обычный` — стандартный уровень для обычных данных;
- `Повышенная защита` — короткоживущий токен;
- `Максимальная защита` — одноразовый токен.

Пользователь не должен вручную настраивать детали OAuth или внутреннюю механику выдачи токенов на уровне операции.

## 12. Практический итог

Целевая модель машинного доступа для Crank должна строиться так:

- в Community — статический ключ AI-агента;
- в управляемой платформе — короткоживущие токены;
- в Enterprise — при необходимости одноразовые токены;
- уровень защиты определяется операцией, а не агентом;
- агент никогда не ослабляет обязательную защиту опубликованной операции.

## 13. Public contract seam

В public Community-коде должны существовать стабильные HTTP contracts для будущего token service:

- `POST /mcp-auth/v1/token`
- `POST /mcp-auth/v1/token/one-time`

На первом этапе Community может не содержать private issuer implementation, но должна:

- сохранить DTO и shape ответов;
- возвращать предсказуемый `403 forbidden` для short-lived и one-time token flows;
- явно сообщать через structured context, что для выбранного `machine_access_mode` требуется расширенная редакция.

Это позволяет:

- не менять public API при подключении private реализации;
- держать open-core границу на уровне реализации, а не на уровне transport contract;
- не смешивать Community static agent-key flow с commercial `elevated/strict` реализацией.
