API-ключи
Типы API-ключей, области, модель хранения, ротация и отзыв.
API-ключи
AACsearch выпускает три семейства API-ключей. У всех одно правило хранения: в БД хранится только SHA-256-хэш ключа. Исходный ключ показывается ровно один раз при создании. Если его потерять — нужно создать новый: восстановить старый мы не можем.
Семейства ключей
| Префикс | Семейство | Где использовать |
|---|---|---|
ss_search_… | Search / ingest / admin | Серверная сторона. Создаются в дашборде. Хранятся в виде хэша. |
ss_connector_… | Ключ CMS-коннектора | Серверная сторона, выпускается CMS-модулем. Одно хэш-пространство со ss_search_*. |
ss_scoped_… | Браузерный токен | Клиент. Короткий TTL. HMAC-подпись, в БД не хранится. См. Scoped-токены. |
ss_connector_* ключи существуют, чтобы CMS-плагин мог ротироваться независимо от ключа дашборда мерчанта. Хэш у них совпадает со ss_search_* с тем же телом — это операционное, а не криптографическое разделение.
Области (scopes)
У каждого постоянного ключа одна или несколько областей:
| Scope | Что разрешает |
|---|---|
search | Только чтение через эндпоинты search и suggest. |
ingest | Загрузка, обновление и удаление документов в ваших индексах. |
admin | Управление индексами — создание, настройка, реиндекс, удаление. |
connector_write | Зарезервировано для CMS-коннекторов. Запись в рамках индекса. |
scim_admin | Провизионинг через SCIM 2.0. См. SSO и SCIM. |
Области проверяются на каждом запросе. search-ключ при обращении к ingest-эндпоинту получает 403. Чего вы не выдали — того у ключа нет.
Никогда не кладите ключ с ingest, admin или scim_admin в браузерный код. Браузерные
ключи — это либо search с allow-list по Origin и жёстким rate limit, либо scoped-токен.
Модель хранения
При создании ключа сервер:
- Генерирует 32 случайных байта и кодирует их в base64url.
- Добавляет префикс семейства (
ss_search_,ss_connector_, …). - Сохраняет
sha256(rawKey)(hex) вsearch_api_key.hash. - Сохраняет первые 12 символов в поле
prefix, чтобы дашборд показывал, например,ss_search_AB…. - Возвращает исходный ключ в ответе один раз.
Исходный ключ нигде не логируется, не пишется на диск открытым текстом и не покидает строку БД, в которой лежит его хэш. Если БД скомпрометируют — атакующий получит хэши, но не сможет ими пользоваться против API.
Сравнение хэшей — константное по времени (crypto.timingSafeEqual), чтобы API не подсказывал, какие ключи существуют.
Создание ключа
В дашборде:
- Откройте Project → API keys.
- Нажмите Create key.
- Назовите ключ по имени системы, которая будет им пользоваться (
frontend-search-eu,ingest-worker-prod). - Выберите минимально необходимые области.
- Опционально: ограничьте список индексов.
- Опционально: задайте allow-list по Origin. См. Allow-list по Origin.
- Опционально: задайте rate limit в минуту.
- Опционально: укажите дату истечения.
- Нажмите Create, скопируйте ключ один раз и сохраните в secret-менеджере.
Программно — POST /api/orpc/searchApiKey.create.
Ротация
Любой ключ с admin-областью ротируйте минимум раз в 90 дней. Браузерные ключи можно чаще.
Рекомендуемая процедура (без downtime):
- Создайте новый ключ с теми же областями и ограничениями.
- Выкатите новый ключ в конфигурацию приложения (env, secret-менеджер). Старый ключ пока оставьте.
- Проверьте в дашборде в колонке «Last used», что новый ключ принимает трафик, а старый затих.
- Отзовите старый ключ.
Если ключ возможно скомпрометирован — пропускайте плавный путь и сразу идите к Отзыву.
Отзыв
Отзыв проставляет revokedAt в строке. Следующая верификация возвращает invalid_or_revoked_key (HTTP 401). Никакого grace period и кэша, который нужно подождать, нет.
В дашборде: Project → API keys → Revoke. Программно: POST /api/orpc/searchApiKey.revoke.
Если ключ утёк
- Сразу отзовите. Не нужно ждать расследования.
- Выпустите замену с теми же областями и выкатите.
- Проверьте журнал аудита. См. Аудит. Отфильтруйте по префиксу ключа, поищите неожиданных вызывающих.
- Просканируйте аналитику на запросы, не похожие на вашу нагрузку.
- Переиндексируйте данные, которые мог затронуть
adminилиingestключ.
Частые ошибки
- Коммит ключей в Git. Добавьте
ss_search_,ss_connector_,ss_scoped_в правила секрет-сканера. - Один admin-ключ повсюду. Одна утечка ломает все окружения. Заводите по ключу на сервис и окружение.
adminв браузерном коде. Браузерный ключ —search+ allow-list по Origin или scoped-токен. Иначе любой посетитель получает право мутировать ваши данные.- Забыли про allow-list по Origin. Без него атакующий, выдрав ключ из JS-бандла, сможет ходить к API откуда угодно. См. Allow-list по Origin.
См. также
- Scoped-токены — короткоживущие токены поверх API-ключа
- Allow-list по Origin — ограничение по источникам
- Аудит — кто и когда пользовался ключом
- Best practices — общий чек-лист