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

RBAC и авторизация

Назначьте роли и разрешения пользователям CodeGraph. Настройте корпоративную идентификацию и проверьте доступ через API, интерфейс и MCP.

Корпоративная эксплуатация

Этот справочник помогает администраторам и разработчикам проверить роли пользователей, разрешения API и доступ машинных учётных записей. Роль пользователя, область проекта и разрешения машинной учётной записи проверяются отдельными слоями авторизации.

Как проверить доступ

Для пользователя выберите системную роль по таблице разрешений ниже, затем назначьте группу и доступные проекты. Для автоматизации создайте сервисную учётную запись и задайте разрешения scope, интерфейсы и проект. Scope — строка разрешения, например query:execute; её значение в настройках и запросах сохраняется без перевода.

Проверьте два запроса: разрешённую операцию и операцию вне назначенных прав. Сопоставьте пользователя или сервисную учётную запись, проект, нужное разрешение и результат в журнале аудита. Так можно определить, какой уровень доступа нужно изменить: роль, назначение проекта или разрешения машинной учётной записи.

Для настройки корпоративного входа используйте руководство OAuth/OIDC и LDAP, а для URL и форматов запросов — справочник REST API.

Модель авторизации

CodeGraph использует три связанных слоя авторизации:

Модель авторизации
Слой Что контролирует Что настраивает администратор
Роль пользователя Операции, доступные пользователю viewer, analyst, reviewer или admin
Разрешения машинной учётной записи Операции через API и MCP Scope и разрешённые интерфейсы ключа или сервисной учётной записи
Доступ к группам и проектам Проекты, с которыми работает учётная запись Членство в группах и доступ ко всем или выбранным проектам

Аутентификация определяет пользователя или машинного субъекта доступа. Авторизация проверяет разрешения роли, строки scope, разрешённые интерфейсы, ограничения группы и проекта. Middleware выполняет дополнительные проверки безопасности.

Пользовательские роли и разрешения

Роли

Системная роль задаёт базовый набор действий пользователя:

Роли
Роль Значение Смысл
VIEWER viewer Доступ к продукту для чтения
ANALYST analyst Права viewer, выполнение запросов и сценариев, запись сессий, создание API-ключей и базовая работа с задачами цифровых сотрудников
REVIEWER reviewer Права analyst, интеграции ревью и операции цифровых сотрудников с повышенным риском
ADMIN admin Администратор платформы

Проверка минимальной роли использует иерархию: viewer < analyst < reviewer < admin.

Проверка разрешений

Permission сейчас содержит 31 значение, включая admin:all.

Правила предоставления разрешений:

  • Роль admin разрешает любые операции из каталога.
  • Явный scope предоставляет разрешение, если его строка совпадает со значением в каталоге.
  • Scope admin:all разрешает все операции при проверке ролевых и машинных разрешений.

Проверка ролевого разрешения

Из корня исходного репозитория CodeGraph с установленными Python-зависимостями сохраните пример в check_rbac.py и выполните python check_rbac.py:

from src.api.auth.permissions import Permission, Role, has_permission

assert has_permission(Role.VIEWER, Permission.SCENARIOS_READ)
assert not has_permission(Role.VIEWER, Permission.SCENARIOS_EXECUTE)
assert has_permission(Role.ANALYST, Permission.SCENARIOS_EXECUTE)
assert not has_permission(Role.ANALYST, Permission.REVIEW_EXECUTE)
assert has_permission(Role.REVIEWER, Permission.REVIEW_EXECUTE)
print("Role permission checks passed")

Ожидаемый результат — Role permission checks passed и код завершения 0. Ошибка AssertionError означает расхождение ожидаемого разрешения с реализацией. Пример проверяет только ролевую функцию, без токенов, HTTP и ограничений проекта.

Каталог разрешений

Каталог разрешений
Разрешение Имя в перечислении Viewer Analyst Reviewer Admin
scenarios:read SCENARIOS_READ x x x x
scenarios:execute SCENARIOS_EXECUTE x x x
query:execute QUERY_EXECUTE x x x
query:validate QUERY_VALIDATE x x x
review:execute REVIEW_EXECUTE x x
review:github REVIEW_GITHUB x x
review:gitlab REVIEW_GITLAB x x
sessions:read SESSIONS_READ x x x x
sessions:write SESSIONS_WRITE x x x
sessions:delete SESSIONS_DELETE x x x
history:read HISTORY_READ x x x x
history:export HISTORY_EXPORT x x x
users:read USERS_READ x
users:write USERS_WRITE x
users:delete USERS_DELETE x
api_keys:read API_KEYS_READ x x x
api_keys:write API_KEYS_WRITE x x x
api_keys:delete API_KEYS_DELETE x
stats:read STATS_READ x x x x
metrics:read METRICS_READ x
digital_employees:read DIGITAL_EMPLOYEES_READ x x x
digital_employees:task:write DIGITAL_EMPLOYEES_TASK_WRITE x x x
digital_employees:task:high_risk DIGITAL_EMPLOYEES_HIGH_RISK_TASK x x
digital_employees:handoff:write DIGITAL_EMPLOYEES_HANDOFF_WRITE x x
digital_employees:approval:write DIGITAL_EMPLOYEES_APPROVAL_WRITE x x
digital_employees:audit:write DIGITAL_EMPLOYEES_AUDIT_WRITE x x
digital_employees:external_publish:write DIGITAL_EMPLOYEES_EXTERNAL_PUBLISH x x
digital_employees:lifecycle:write DIGITAL_EMPLOYEES_LIFECYCLE_WRITE x
digital_employees:control_tower:repair DIGITAL_EMPLOYEES_CONTROL_TOWER_REPAIR x
digital_employees:admin DIGITAL_EMPLOYEES_ADMIN x
admin:all ADMIN_ALL x

ROLE_PERMISSIONS сейчас не включает USERS_*, API_KEYS_DELETE, METRICS_READ, разрешения цифровых сотрудников только для администратора и ADMIN_ALL для ролей без прав администратора. На практике они доступны через Role.ADMIN или явное разрешение scope admin:all.

Вспомогательные функции разрешений

Для проверки роли и scope используйте src.api.auth.permissions:

from src.api.auth.permissions import (
    Permission,
    Role,
    get_default_scopes_for_api_key,
    get_role_permissions,
    has_all_permissions,
    has_any_permission,
    has_permission,
    validate_scopes,
)

Ключевое поведение:

  • get_default_scopes_for_api_key() возвращает scenarios:read, scenarios:execute, query:execute, sessions:read, sessions:write, history:read.
  • validate_scopes() фильтрует неизвестные строки по перечислению Permission.
  • has_permission() сначала учитывает разрешения роли, затем явные строки scope.

Контекст аутентификации FastAPI

AuthContext определён в src/contracts/auth_context.py и доступен через src.api.auth.middleware. Контекст объединяет субъекта доступа (AuthSubject) и его область разрешений (AuthScope).

Поля:

Контекст аутентификации FastAPI
Поле Смысл
user_id Идентификатор пользователя, если он определён
subject_id Идентификатор субъекта доступа: пользователя или сервисной учётной записи
subject_type user или service_account
username Отображаемое имя или имя пользователя
role Необязательная роль Role пользователя
scopes Строки разрешений и scope
auth_method jwt, api_key, service_account_api_key, iam, local_plugin или none
group_id Необязательная область группы
project_id Необязательная область проекта сервисной учётной записи
service_account_id Идентификатор сервисной учётной записи при машинной аутентификации
credential_id Идентификатор API-ключа или учётных данных сервисной учётной записи
allowed_interfaces Интерфейсы, разрешённые субъекту доступа

Последовательность получения контекста:

  1. Повторно использовать request.state.machine_principal, если ScopeEnforcementMiddleware уже проверил API-ключ.
  2. Проверить X-YC-IAM-Token, если IAM включен.
  3. Проверить JWT Bearer-токен и отклонить отозванные идентификаторы JWT.
  4. Проверить X-API-Key как машинные учётные данные.
  5. Вернуть контекст без аутентификации, если действительных учётных данных нет.

В обработчиках маршрутов используйте эти зависимости:

from src.api.auth.middleware import (
    get_auth_context,
    get_current_user,
    get_optional_user,
    require_admin,
    require_analyst,
    require_any_permission,
    require_auth,
    require_auth_or_localhost,
    require_permission,
    require_reviewer,
    require_role,
)

require_auth_or_localhost() разрешает запросы локального плагина только при security.local_dev_unauthenticated_surfaces_enabled=true и обращении через loopback. Запросы, изменяющие состояние, должны содержать X-Actor-Agent-Id и X-Task-Id; общие идентификаторы агентов, например codex или codex-headless, отклоняются.

src/api/dependencies.py также содержит зависимости, которые читают базу данных и возвращают ORM-объекты User. Маршруты аутентификации используют их для управления учётными записями и API-ключами.

Методы аутентификации

Вход по имени пользователя и паролю

Маршруты доступны под /api/v1/auth:

Вход по имени пользователя и паролю
Маршрут Назначение
POST /token Основной маршрут выдачи токена по имени пользователя и паролю
POST /refresh Заменить refresh-токен и выдать новые токены
POST /oauth/token Выдача по паролю и обновление токена по RFC 6749

Администратор создаёт локальную учётную запись через POST /api/v1/admin/identity/users и задаёт её роль; значение по умолчанию — analyst. Ответ содержит одноразово раскрываемый пароль. Локальные пароли хешируются через bcrypt. Для выхода вызовите DELETE /api/v1/me/logout с текущим Bearer-токеном: маршрут добавит токен в список отозванных.

JWT Bearer-токены

Поля TokenPayload:

JWT Bearer-токены
Поле Смысл
sub Идентификатор пользователя — субъекта токена
jti Идентификатор JWT
exp Срок истечения
iat Время выдачи
type access или refresh
scopes Строки разрешений scope
role Необязательная строка роли пользователя
group_id Необязательная область группы
iss Необязательный издатель токена
aud Необязательная аудитория: строка или список строк
resource Необязательный идентификатор ресурса по RFC 8707
client_id Необязательный идентификатор публичного OAuth-клиента
project_id Необязательный проект, связанный с согласием пользователя

Значения по умолчанию:

  • Срок действия access-токена: настройка access_token_expire_minutes в JWT-конфигурации, если expires_delta не передан. Резервное значение — 30 минут.
  • Срок действия refresh-токена: 7 дней.
  • Настройки подписи берутся из src/api/config.py (API_JWT_ALGORITHM, определение секрета JWT).

Отзыв:

  • blacklist_token() сохраняет отпечаток SHA-256 от JTI в памяти и в таблице token_blacklist.
  • is_token_blacklisted() сначала проверяет память, затем базу данных.
  • load_blacklist_cache() загружает неистёкшие записи об отзыве при запуске.
  • _blacklist_sync_task() периодически обновляет кеш в памяти.

API-ключи пользователей

API-ключи пользователей создаются через /api/v1/me/api-keys и передаются как X-API-Key.

Формат:

rag_<8 hex chars>_<48 hex chars>

Детали реализации:

  • generate_api_key() возвращает (full_key, prefix, key_hash).
  • Префикс начинается с rag_.
  • Секрет генерируется через secrets.token_hex(24).
  • Сохранённый хеш: SHA-256.
  • verify_api_key() использует secrets.compare_digest().
  • ApiKey.group_id может ограничить ключ одной группой.
  • API-ключи пользователей аутентифицируются как MachinePrincipal(subject_type="user", auth_method="api_key").
  • API-ключи пользователей по умолчанию разрешают интерфейсы api и mcp.
  • ApiKeyInfo — модель ответа без секрета.
  • ApiKeyWithSecret расширяет ApiKeyInfo и возвращается только при создании ключа.

Создание, чтение и отзыв API-ключей:

API-ключи пользователей
Маршрут Назначение
POST /api/v1/me/api-keys Создать ключ текущего пользователя
GET /api/v1/me/api-keys Список ключей текущего пользователя без секретов
DELETE /api/v1/me/api-keys/{key_id} Отозвать собственный ключ

Запрос создания по умолчанию использует ["scenarios:read", "query:execute"]; вспомогательная функция нижнего уровня get_default_scopes_for_api_key() возвращает более широкий исторический набор. Для запроса к API используйте значения по умолчанию обработчика маршрута.

Сервисные учётные записи

Сервисные учётные записи используют тот же заголовок X-API-Key, но другой префикс ключа:

svc_<8 hex chars>_<48 hex chars>

Сервисные учётные записи хранятся в service_accounts, их учётные данные — в service_account_credentials.

Средства контроля:

  • Управление сервисными учётными записями только для администратора.
  • Шаблоны политики: ci, portal, bot, agent.
  • Явные scopes и allowed_interfaces.
  • Необязательные ограничения group_id или project_id.
  • Сроки действия учётной записи и учётных данных.
  • Выпуск новых учётных данных без немедленного отзыва старых.
  • Ограничение количества активных ключей через security.service_account_max_active_credentials.
  • Отзыв ключей и отключение учётной записи.
  • Заголовок контракта машинного доступа: X-CodeGraph-Machine-Contract, сейчас 2026-03-v1.
  • Необязательная привязка mTLS с завершением TLS на прокси для настроенных интерфейсов.
  • Единые события аудита машинного доступа через AuditAction.MACHINE_ACCESS.

Маршруты администратора:

Сервисные учётные записи
Маршрут Назначение
GET /api/v1/admin/identity/service-accounts/action-catalog Вернуть разрешения маршрутов, контракт машинного доступа, шаблоны политики и ограничения безопасности
POST /api/v1/admin/identity/service-accounts Создать сервисную учётную запись и первые учётные данные
GET /api/v1/admin/identity/service-accounts Список сервисных учётных записей
GET /api/v1/admin/identity/service-accounts/{service_account_id} Прочитать сервисную учётную запись и метаданные ключей
POST /api/v1/admin/identity/service-accounts/{service_account_id}/rotate Выдать новые учётные данные
POST /api/v1/admin/identity/service-accounts/{service_account_id}/credentials/{credential_id}/revoke Отозвать один ключ
POST /api/v1/admin/identity/service-accounts/{service_account_id}/deactivate Отключить учётную запись и отозвать ключи

Шаблоны политики:

Сервисные учётные записи, таблица 2
Шаблон Разрешения Интерфейсы
ci query:execute, scenarios:read, mcp:access api, mcp
portal stats:read, history:read api
bot query:execute, scenarios:read, mcp:access api, mcp
agent query:execute, scenarios:execute, review:execute, mcp:access, digital_employees:read, digital_employees:task:write api, mcp

OAuth2/OIDC

Поддерживаемые провайдеры:

OAuth2/OIDC
Провайдер Примечания
github GitHub OAuth
gitlab GitLab OAuth, настраиваемый адрес сервера
google Google OIDC
keycloak Keycloak OIDC, настраиваемые сервер и realm
sourcecraft Провайдер SourceCraft на базе Yandex ID
gitverse Провайдер GitVerse

Маршруты:

OAuth2/OIDC, таблица 2
Маршрут Назначение
GET /api/v1/auth/oauth/providers Список настроенных провайдеров и сформированных адресов авторизации
GET /api/v1/auth/oauth/{provider} Начать OAuth-авторизацию
GET /api/v1/auth/oauth/{provider}/callback Обменять код, создать или найти пользователя, выдать JWT

Пользователи OAuth получают JWT с ролью, сохранённой в базе данных.

LDAP/Active Directory

Маршруты:

LDAP/Active Directory
Маршрут Назначение
POST /api/v1/auth/ldap Проверить пользователя в LDAP/AD и выдать JWT
GET /api/v1/auth/ldap/status Вернуть доступность LDAP и состояние соединения

LDAPAuthenticator.map_groups_to_role() читает LDAPConfig.role_mapping и нормализует DN/CN-алиасы групп. При нескольких совпадениях выбирается первая роль в порядке admin, reviewer, analyst, viewer. Если совпадений нет, возвращается analyst. Это значение по умолчанию имеет больше разрешений, чем viewer; проверьте сопоставление групп до подключения LDAP.

Yandex Cloud IAM

Проверка IAM находится в src/api/auth/providers/iam.py и инициализируется из настроек API, когда IAM включен.

Заголовок запроса:

X-YC-IAM-Token: <token>

Когда токен действителен, get_auth_context() возвращает:

  • role=Role.ANALYST
  • scopes=["scenarios:read", "query:execute", "review:execute"]
  • auth_method="iam"

Результаты проверки кешируются на настроенный срок действия кеша IAM-токенов.

Проверка разрешений машинных учётных записей

ScopeEnforcementMiddleware добавляется в src/api/main.py, когда security.api_key_scope_enforcement=true. Он проверяет запросы с X-API-Key до вызова обработчика маршрута.

Процесс:

  1. Проверить ключ пользователя или сервисной учётной записи.
  2. Сохранить MachinePrincipal в request.state.machine_principal.
  3. Определить запрошенную область проекта из X-Project-Id.
  4. Проверить необязательный заголовок контракта машинного доступа.
  5. Проверить необязательную привязку mTLS для сервисной учётной записи.
  6. Выполнить authorize_machine_request().
  7. Записать событие аудита машинного доступа.
  8. Вернуть 403 insufficient_scope при отказе в доступе.

Выдержка из карты разрешений маршрутов API:

Проверка разрешений машинных учётных записей
Префикс Требуемое разрешение
/review review:execute
/metrics metrics:read
/security scenarios:execute
/code query:execute
/import scenarios:execute
/documentation scenarios:execute
/edit scenarios:execute
/optimize scenarios:execute
/compliance scenarios:execute
/dashboard stats:read
/context query:execute
/admin/runtime/acp scenarios:execute
/workflows scenarios:execute
/webhooks Отдельный scope не задан
/health Отдельный scope не задан
/auth Отдельный scope не задан
/admin/workforce admin:all
/groups admin:all
/projects admin:all
/digital-employees digital_employees:read
/employee-lanes digital_employees:read
/employee-tasks digital_employees:read
/demo Отдельный scope не задан
/ws Отдельный scope не задан

Каждый маршрут выполняет свои проверки аутентификации, подписи webhook и зависимостей обработчика. authorize_machine_request() проверяет разрешённый интерфейс и ограничения проекта или группы сервисной учётной записи для любого пути. Карта scope добавляет требуемое разрешение для перечисленных выше префиксов.

Карта разрешений маршрутов MCP:

Проверка разрешений машинных учётных записей, таблица 2
Префикс Требуемое разрешение
/mcp mcp:access

Только для MCP разрешение mcp:access может подтверждаться альтернативными scope: query:execute, scenarios:read, scenarios:execute, review:execute, stats:read, history:read и admin:all.

Явная проверка scope в обработчике:

В приложении FastAPI импортируйте Depends из fastapi и создайте объект router типа APIRouter. Добавьте обработчик из примера и подключите маршрутизатор к приложению. После настройки аутентификации отправьте запросы от учётных записей с требуемым scope и без него, чтобы проверить оба результата доступа.

from src.api.auth.tokens.scope_enforcement import require_scope

@router.get("/example")
async def example(auth=Depends(require_scope("query:execute"))):
    ...

require_scope() проверяет строки AuthContext.scopes; admin:all обходит эту проверку.

Доступ к группам и проектам

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

Перечисления и таблицы:

Доступ к группам и проектам
Элемент Значения или назначение
GroupRole viewer, editor, admin
ProjectScopeMode all, selected
project_groups Записи групп
user_group_access Членство пользователя и роль в группе
user_project_access Список разрешённых проектов при режиме членства selected
api_keys.group_id Необязательное ограничение группы для API-ключей пользователей
service_accounts.group_id / project_id Необязательное ограничение группы или проекта для сервисных учётных записей

Маршруты администратора для управления доступом:

Доступ к группам и проектам, таблица 2
Маршрут Назначение
GET /api/v1/admin/identity/users/{user_id}/access Прочитать системную роль и назначения групп и проектов
PUT /api/v1/admin/identity/users/{user_id}/access Заменить системную роль и назначения групп и проектов

Назначьте роль и проекты через интерфейс

Для этого нужны права администратора, созданный пользователь и группа с проектами. В интерфейсе группа называется «Тенант».

  1. Откройте раздел «Пользователи» и выберите карточку пользователя.
  2. Заполните «Тенант аудита» и «Причина изменения»: они сохраняют контекст административной операции.
  3. В разделе «Системная роль» выберите роль по таблице разрешений выше, сохраните её и подтвердите изменение.
  4. На вкладке «Доступ» добавьте тенант и выберите роль в нём: «Наблюдатель», «Редактор» или «Администратор».
  5. В поле «Охват проектов» выберите «Выбранные проекты» и отметьте хотя бы один проект этого тенанта. Для доступа ко всем его проектам выберите «Все проекты».
  6. Проверьте выбранные назначения, нажмите «Сохранить доступ» и подтвердите запись. Повторно откройте карточку и сверьте тенант, роль и проекты с сохранёнными значениями.
  7. Войдите заново под пользователем, чтобы получить токен с текущей ролью. Откройте разрешённый проект и выполните операцию, которую допускает его системная роль. Для проверки ограничения используйте тестового пользователя с единственным назначением selected: выбранный проект должен открываться, а другой проект — возвращать отказ.

Этот экран редактирует прямые назначения пользователя. Доступ через группы тенанта проверяйте в разделе «Тенанты». При автоматизации передайте в PUT tenant_id, change_reason, system_role и список assignments. Каждое назначение содержит group_id, role, project_scope_mode и allowed_project_ids. Запрос заменяет список назначений: включите в него все назначения, которые нужно сохранить, затем прочитайте результат через GET.

Ограничения:

  • Администратор платформы не может отключить собственную учётную запись.
  • Нельзя отключить последнего активного администратора платформы или понизить его роль.
  • Нельзя удалить последнего администратора группы или понизить его роль, если в группе нет другого администратора.
  • Область selected должна включать хотя бы один проект. Все выбранные проекты должны принадлежать назначенной группе.
  • Область all не может включать явные идентификаторы проектов.

Определение проекта и операции, зависящие от группы, должны использовать ProjectContext и разрешённую область проекта, а не путь базы данных от пользователя.

Middleware проверки путей

PathValidationMiddleware проверяет поля db_path и source_path в JSON-телах запросов POST, PUT и PATCH.

Правила:

  • Пустые строки и байты NUL отклоняются.
  • Относительные пути отклоняются, если path_validation_deny_relative=true.
  • Компоненты пути нормализуются перед проверкой расположения файла.
  • Пути приводятся к фактическому расположению через os.path.realpath().
  • Полученный путь должен находиться внутри разрешённого базового каталога.

Разрешённые каталоги определяются по:

  • security.path_validation_allowed_base_dirs
  • родительским каталогам db_path зарегистрированных проектов
  • каталогам source_path зарегистрированных проектов

Поля конфигурации определены в SecurityConfig:

Middleware проверки путей
Поле По умолчанию
path_validation_enabled true
path_validation_deny_symlinks true
path_validation_deny_relative true
path_validation_allowed_base_dirs ["data/projects/"]

Аутентификация webhook

Проверка webhook находится в src/api/auth/machine/webhook_auth.py. Основная функция проверки — verify_webhook_signature().

Поддерживаемые платформы:

Аутентификация webhook
Платформа Заголовок подписи или токена Заголовок времени
sourcecraft X-SourceCraft-Signature X-SourceCraft-Timestamp
gitverse X-GitVerse-Signature; резервные варианты включают X-Gitea-Signature, X-Gogs-Signature, X-Hub-Signature-256, X-Hub-Signature X-GitVerse-Timestamp
github X-Hub-Signature-256 X-Hub-Timestamp
gitlab X-Gitlab-Token отсутствует

sourcecraft, gitverse и github проверяют подпись HMAC. gitlab сравнивает токен за постоянное время. Проверка возраста использует security.webhook_max_age_seconds, только если запрос содержит непустой заголовок времени поддерживаемой платформы. Отсутствующий заголовок не отклоняется этой проверкой. Она не ведёт список уже принятых событий и сама по себе не предотвращает повторную отправку в допустимом окне. GitLab не имеет такой проверки времени.

Аудит и события для SIEM

Действия, связанные с авторизацией:

Аудит и события для SIEM
Категория Действия
Аутентификация auth.login.success, auth.login.failure, auth.logout, auth.token.refresh, auth.token.revoked
OAuth и LDAP oauth.login.*, ldap.login.*
API-ключи api_key.created, api_key.revoked, api_key.deleted, api_key.used
Сервисные учётные записи service_account.created, service_account.rotated, service_account.credential_revoked, service_account.disabled
Машинный доступ machine.access
Администрирование пользователей и групп user.created, user.updated, user.role.changed, user.tenant.*, user.project.scope.changed
Безопасность security.permission.denied, security.rate_limit.exceeded, security.token.invalid, security.path_violation, security.idor_attempt, security.webhook.replay_rejected, security.mcp.auth_failure

Записи аудита машинного доступа содержат тип и идентификатор субъекта, интерфейс, операцию, ресурс, результат и идентификатор учётных данных. Также могут присутствовать идентификатор сервисной учётной записи, версия контракта, идентификаторы проекта и группы.

Справочник конфигурации

Основные поля текущей конфигурации:

Справочник конфигурации
Поле Назначение
security.api_key_scope_enforcement Включает middleware проверки scope машинных API-ключей
security.local_dev_unauthenticated_surfaces_enabled Включает ограниченное исключение аутентификации локального плагина для loopback-запросов
security.webhook_max_age_seconds Допустимый возраст подписи webhook с отметкой времени
security.auth_rate_limit_* Ограничения частоты входа, регистрации, обновления токена и LDAP-запросов
security.service_account_token_ttl_days Срок действия сервисной учётной записи и её учётных данных по умолчанию
security.service_account_default_interfaces Интерфейсы сервисных учётных записей по умолчанию
security.service_account_max_active_credentials Ограничение количества активных ключей при ротации
security.service_account_rotation_overlap_seconds Период одновременного действия старых и новых учётных данных при ротации
security.service_account_rotation_warning_days Период предупреждения о возрасте и сроке действия учётных данных
security.service_account_revoke_sla_seconds Ориентир SLA отзыва
security.service_account_mtls_enabled Включает проверку привязки mTLS сервисной учётной записи
security.service_account_mtls_required_interfaces Интерфейсы, требующие mTLS при включённой проверке
security.service_account_mtls_subject_header Заголовок прокси с субъектом сертификата
security.service_account_mtls_fingerprint_header Заголовок прокси с отпечатком сертификата
security.service_account_mtls_bindings Разрешённые отпечатки по идентификатору сервисной учётной записи

Операционные рекомендации

Для администраторов:

  1. Используйте admin только для администрирования платформы.
  2. Для повседневной сегрегации предпочитайте роли группы GroupRole и доступ к выбранным проектам.
  3. Используйте сервисные учётные записи для CI, ботов, порталов, MCP-клиентов и длительного машинного доступа.
  4. Берите шаблоны политики как основу и добавляйте только необходимые scope вызывающей стороны.
  5. Выпускайте новые ключи сервисной учётной записи до отзыва старых.
  6. Оставляйте загрузку кеша отозванных JWT включённой при запуске приложения.
  7. Держите проверку путей и scope API-ключей включёнными в общих средах.

Для разработчиков:

  1. Используйте require_permission() или require_role() для проверки доступа пользователей к маршрутам.
  2. Используйте require_scope() только когда контракт требует проверки строк scope.
  3. Добавляйте новые маршруты машинного доступа в API_ROUTE_SCOPE_MAP или MCP_ROUTE_SCOPE_MAP.
  4. Сохраняйте согласованность REST/MCP через общие сервисы, без дублирования логики авторизации.
  5. Никогда не авторизуйте операции, зависящие от группы, по переданному пользователем db_path.
  6. Для изменяющих состояние маршрутов локального плагина требуйте именованного исполнителя и подтверждение задачи.
  7. Не записывайте в журналы Bearer-токены, API-ключи, секреты сервисных учётных записей и webhook или исходные запросы к модели.

Связанные документы

Версия: 3.0 | Май 2026