Этот справочник помогает администраторам и разработчикам проверить роли пользователей, разрешения 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).
Поля:
| Поле | Смысл |
|---|---|
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 |
Интерфейсы, разрешённые субъекту доступа |
Последовательность получения контекста:
- Повторно использовать
request.state.machine_principal, еслиScopeEnforcementMiddlewareуже проверил API-ключ. - Проверить
X-YC-IAM-Token, если IAM включен. - Проверить JWT Bearer-токен и отклонить отозванные идентификаторы JWT.
- Проверить
X-API-Keyкак машинные учётные данные. - Вернуть контекст без аутентификации, если действительных учётных данных нет.
В обработчиках маршрутов используйте эти зависимости:
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:
| Поле | Смысл |
|---|---|
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-ключей:
| Маршрут | Назначение |
|---|---|
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 |
Отключить учётную запись и отозвать ключи |
Шаблоны политики:
| Шаблон | Разрешения | Интерфейсы |
|---|---|---|
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
Поддерживаемые провайдеры:
| Провайдер | Примечания |
|---|---|
github |
GitHub OAuth |
gitlab |
GitLab OAuth, настраиваемый адрес сервера |
google |
Google OIDC |
keycloak |
Keycloak OIDC, настраиваемые сервер и realm |
sourcecraft |
Провайдер SourceCraft на базе Yandex ID |
gitverse |
Провайдер GitVerse |
Маршруты:
| Маршрут | Назначение |
|---|---|
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
Маршруты:
| Маршрут | Назначение |
|---|---|
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.ANALYSTscopes=["scenarios:read", "query:execute", "review:execute"]auth_method="iam"
Результаты проверки кешируются на настроенный срок действия кеша IAM-токенов.
Проверка разрешений машинных учётных записей
ScopeEnforcementMiddleware добавляется в src/api/main.py, когда security.api_key_scope_enforcement=true. Он проверяет запросы с X-API-Key до вызова обработчика маршрута.
Процесс:
- Проверить ключ пользователя или сервисной учётной записи.
- Сохранить
MachinePrincipalвrequest.state.machine_principal. - Определить запрошенную область проекта из
X-Project-Id. - Проверить необязательный заголовок контракта машинного доступа.
- Проверить необязательную привязку mTLS для сервисной учётной записи.
- Выполнить
authorize_machine_request(). - Записать событие аудита машинного доступа.
- Вернуть
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:
| Префикс | Требуемое разрешение |
|---|---|
/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 |
Необязательное ограничение группы или проекта для сервисных учётных записей |
Маршруты администратора для управления доступом:
| Маршрут | Назначение |
|---|---|
GET /api/v1/admin/identity/users/{user_id}/access |
Прочитать системную роль и назначения групп и проектов |
PUT /api/v1/admin/identity/users/{user_id}/access |
Заменить системную роль и назначения групп и проектов |
Назначьте роль и проекты через интерфейс
Для этого нужны права администратора, созданный пользователь и группа с проектами. В интерфейсе группа называется «Тенант».
- Откройте раздел «Пользователи» и выберите карточку пользователя.
- Заполните «Тенант аудита» и «Причина изменения»: они сохраняют контекст административной операции.
- В разделе «Системная роль» выберите роль по таблице разрешений выше, сохраните её и подтвердите изменение.
- На вкладке «Доступ» добавьте тенант и выберите роль в нём: «Наблюдатель», «Редактор» или «Администратор».
- В поле «Охват проектов» выберите «Выбранные проекты» и отметьте хотя бы один проект этого тенанта. Для доступа ко всем его проектам выберите «Все проекты».
- Проверьте выбранные назначения, нажмите «Сохранить доступ» и подтвердите запись. Повторно откройте карточку и сверьте тенант, роль и проекты с сохранёнными значениями.
- Войдите заново под пользователем, чтобы получить токен с текущей ролью.
Откройте разрешённый проект и выполните
операцию, которую допускает его системная роль. Для проверки ограничения
используйте тестового пользователя с единственным назначением
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:
| Поле | По умолчанию |
|---|---|
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().
Поддерживаемые платформы:
| Платформа | Заголовок подписи или токена | Заголовок времени |
|---|---|---|
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
Действия, связанные с авторизацией:
| Категория | Действия |
|---|---|
| Аутентификация | 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 |
Разрешённые отпечатки по идентификатору сервисной учётной записи |
Операционные рекомендации
Для администраторов:
- Используйте
adminтолько для администрирования платформы. - Для повседневной сегрегации предпочитайте роли группы
GroupRoleи доступ к выбранным проектам. - Используйте сервисные учётные записи для CI, ботов, порталов, MCP-клиентов и длительного машинного доступа.
- Берите шаблоны политики как основу и добавляйте только необходимые scope вызывающей стороны.
- Выпускайте новые ключи сервисной учётной записи до отзыва старых.
- Оставляйте загрузку кеша отозванных JWT включённой при запуске приложения.
- Держите проверку путей и scope API-ключей включёнными в общих средах.
Для разработчиков:
- Используйте
require_permission()илиrequire_role()для проверки доступа пользователей к маршрутам. - Используйте
require_scope()только когда контракт требует проверки строк scope. - Добавляйте новые маршруты машинного доступа в
API_ROUTE_SCOPE_MAPилиMCP_ROUTE_SCOPE_MAP. - Сохраняйте согласованность REST/MCP через общие сервисы, без дублирования логики авторизации.
- Никогда не авторизуйте операции, зависящие от группы, по переданному пользователем
db_path. - Для изменяющих состояние маршрутов локального плагина требуйте именованного исполнителя и подтверждение задачи.
- Не записывайте в журналы Bearer-токены, API-ключи, секреты сервисных учётных записей и webhook или исходные запросы к модели.
Связанные документы
- Обзор корпоративной безопасности
- Интеграция OAuth2/OIDC и LDAP/AD
- Интеграция с SIEM
- Защита данных с помощью DLP
- Справочник REST API
Версия: 3.0 | Май 2026