ВойтиКонтактыНачать бесплатно
Enterprise Controls and Trust30 июля 2026 г.Flatkey Team

Безопасное управление API-ключами для AI-продуктов

Практическое руководство для продакшена: хранение AI API-ключей, ограниченные идентификаторы, безопасное логирование запросов, ротация без простоя, реагирование на утечки и управление несколькими провайдерами.

Безопасное управление API-ключами для AI-продуктов

Безопасное управление API-ключами для AI-продуктов — это не просто помещение учетных данных провайдера в хранилище. AI-приложения передают промпты, файлы, извлеченный контекст, аргументы инструментов и ответы моделей через системы, которые часто охватывают нескольких провайдеров и сред. Ключ может быть идеально зашифрован в состоянии покоя, но при этом окружающий путь запроса все равно может раскрывать чувствительные данные через браузерные бандлы, отладочные логи, вывод CI, экспорт для поддержки или сервис маршрутизации с избыточными правами.

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

Это руководство дает командам платформы, безопасности и AI-продуктов операционную модель, которую можно внедрить. Оно включает модель угроз, шаблон инвентаризации ключей, архитектуру плоскости управления, регламент ротации без простоя, правила логирования, меры защиты CI/CD, рабочий процесс реагирования на инциденты и контрольный список для production.

The five boundaries an AI key can cross

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

Boundary Typical failure Required control
Client to application A provider key is embedded in a browser bundle, mobile binary, desktop app, or extension Keep provider keys server-side; issue short-lived user or session credentials to clients
Application to gateway Every service shares one unrestricted key Use workload identities, scoped gateway tokens, quotas, and explicit route policy
Gateway to provider One credential can access every model, project, or environment Separate keys by provider, environment, workload, and risk tier where supported
Request to logs Authorization headers, prompts, files, or outputs appear in traces Denylist secret fields, minimize payload logging, tokenize identifiers, and test redaction
Human operations Keys are pasted into tickets, chat, runbooks, or support tools Use controlled access workflows, audited retrieval, break-glass procedures, and automatic expiry

Эта карта границ меняет вопрос проектирования с «Где хранить ключ?» на «Какая идентичность может делать какой запрос, с какими данными, через какой маршрут, и какие свидетельства остаются после этого?»

Use a server-side key custody model

Долгоживущие учетные данные провайдера не следует передавать клиентам браузера, мобильных устройств, десктопов или расширений. Все, что поставляется на устройство конечного пользователя, следует считать доступным для извлечения этим пользователем или вредоносным ПО, работающим с теми же привилегиями.

Более безопасный подход таков:

  1. Клиент аутентифицируется в вашем backend с помощью пользовательской сессии, учетных данных устройства или краткоживущего токена приложения.
  2. Ваш backend авторизует запрошенную функцию и применяет ограничения на пользователя или на арендатора.
  3. Шлюз или серверная интеграция выбирает одобренного провайдера и модель.
  4. Ключ провайдера извлекается во время выполнения или становится доступным доверенной рабочей нагрузке через платформу развертывания.
  5. Ответ провайдера возвращается через ту же границу политики.

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

Для coding agents и локальных инструментов разработчика используйте тот же принцип с осознанной моделью исключений. Разработчику может понадобиться локальные учетные данные, но это должны быть учетные данные продукта или шлюза с возможностью отзыва, атрибуцией использования и ограниченной областью действия — а не общий ключ провайдера на уровне организации, скопированный в dotfiles по всей компании.

Создайте инвентаризацию ключей, прежде чем что-либо ротировать

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

Как минимум фиксируйте:

Поле Пример Почему это важно
Secret ID prod-support-chat-anthropic-01 Стабильная внутренняя ссылка, которая не является значением секрета
Provider and project Учетная запись провайдера + идентификатор проекта Определяет внешний радиус поражения
Environment Разработка, staging, production Не позволяет тестовым системам наследовать полномочия production
Workload support-chat-api Обеспечивает атрибуцию и целевой отзыв
Owner Команда и on-call ротация Создает ответственность во время инцидентов
Storage location Путь в secret manager или привязка развертывания Показывает, где находится источник истины
Allowed models/routes Одобренное семейство моделей или политика шлюза Ограничивает неожиданное использование
Spend and request limits Бюджет рабочей нагрузки, RPM, TPM или ограничения конкурентности Ограничивает злоупотребления и неконтролируемую автоматизацию
Created and last rotated Метки времени Делает устаревшие учетные данные видимыми
Rotation method Двойной ключ, алиас версии или окно обслуживания Предотвращает импровизированные изменения
Revocation dependency Сервисы, которые необходимо обновить первыми Защищает доступность
Data classification Public, internal, confidential, regulated Связывает политику ключей с управлением prompt'ами

Не помещайте значение ключа в инвентаризацию. Храните только метаданные и ссылку на управляемый секрет.

Разделяйте идентичности по среде, рабочей нагрузке и риску

Самый распространенный антипаттерн — один production-ключ, которым пользуется каждый сервис. Это удобно, пока один репозиторий, тестовый раннер, ноутбук подрядчика или support transcript не утечет. Тогда команда не сможет отозвать ключ, не нарушив работу несвязанных продуктов.

Предпочитайте отдельные идентичности для:

  • Production, staging, development и локальное тестирование.
  • Трафик, ориентированный на клиентов, внутренние инструменты, пакетные задания и конвейеры оценки.
  • Высокорисковые рабочие процессы, которые могут вызывать инструменты или обрабатывать конфиденциальные данные.
  • Разные бизнес-подразделения или арендаторы, когда договорные границы требуют разделения.
  • Аварийный доступ или break-glass access, который должен оставаться отключенным или строго контролируемым в обычном режиме работы.

Если провайдер предлагает ограничения, применяйте их. Ограничения могут включать разрешенные API, модели, исходные сети, проекты, referrer’ы, приложения или квоты. Например, рекомендации Google Cloud по API-ключам советуют ограничивать ключи, изолировать их, удалять ненужные ключи, избегать коммитов в репозиторий и отслеживать их использование.

Если провайдер не предлагает достаточно гранулярных механизмов управления, обеспечьте их на своем шлюзе. Центральный шлюз может проверять вызывающую рабочую нагрузку, сопоставлять ее с одобренным маршрутом, применять бюджеты и ограничения скорости, а также держать учетные данные вендора за одним проверенным серверным барьером. См. более широкий руководство по архитектуре AI API gateway для проектирования маршрутизации и отказоустойчивости.

Treat prompt and log governance as part of key management

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

Перед маршрутизацией запроса классифицируйте полезную нагрузку и применяйте правило минимально необходимого доступа:

  • Удаляйте учетные данные, токены, cookies, закрытые ключи и строки подключения.
  • Исключайте поля, которые модели не нужны.
  • Токенизируйте или псевдонимизируйте прямые идентификаторы, когда задача может быть выполнена без них.
  • Отклоняйте неподдерживаемые регулируемые или договорно ограниченные данные.
  • Разделяйте системные инструкции и недоверенный пользовательский или полученный контент.
  • Проверяйте аргументы инструментов до того, как агент сможет вызывать внешние системы.

Для логов нужна явная схема. Не полагайтесь на то, что разработчики сами помнят не логировать объект запроса. Определите, какие поля разрешены, а затем удаляйте или преобразуйте все остальное.

Полезное производственное событие может содержать:

{
  "request_id": "req_01J...",
  "tenant_id_hash": "tnt_7f2...",
  "workload": "support-chat-api",
  "route_policy": "support-low-risk-v3",
  "provider": "selected-provider",
  "model": "selected-model",
  "input_tokens": 842,
  "output_tokens": 211,
  "latency_ms": 1370,
  "status": 200,
  "key_version": "v12",
  "redaction_policy": "customer-support-v4"
}

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

OWASP Logging Cheat Sheet предоставляет полезную базовую рекомендацию по исключению access tokens, паролей, ключей шифрования и других конфиденциальных данных из логов приложений.

Design zero-downtime API key rotation

Ротация — это мера контроля только в том случае, если её можно безопасно выполнить. Процедуру, вызывающую простой, будут откладывать до чрезвычайной ситуации.

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

  1. Создайте новый ключ провайдера. Примените те же или более строгие ограничения, что и к старому ключу.
  2. Сохраните его как новую версию секрета. Не перезаписывайте старое значение на месте, если ваша платформа поддерживает версии или псевдонимы.
  3. Разверните потребителей, которые принимают новую версию. Обновите gateway или рабочие нагрузки так, чтобы они разрешали текущий псевдоним или версию.
  4. Перенаправьте трафик и наблюдайте. Подтвердите успешные запросы, ожидаемые модели, расходы, лимиты запросов и частоту ошибок, используя новую версию ключа.
  5. Удалите старых потребителей. Проверьте инвентари развертываний, задачи, воркеры и среды аварийного восстановления.
  6. Отзовите старый ключ. Не просто переставайте его использовать; сделайте его недействительным у провайдера.
  7. Проверьте отклонение. Контролируемый тест должен подтвердить, что старые учетные данные больше не работают.
  8. Зафиксируйте доказательства. Сохраните временные метки, владельцев, затронутые рабочие нагрузки, результаты проверки и дату следующего пересмотра.

Для системы, поддерживающей выбор версии ключа, приложение должно ссылаться на стабильный псевдоним, а не жестко задавать версию секрета:

type ProviderCredential = {
  value: string;
  version: string;
};

async function loadProviderCredential(): Promise<ProviderCredential> {
  const activeVersion = await secretStore.resolveAlias("ai/provider/active");
  const value = await secretStore.readVersion("ai/provider", activeVersion);

  return { value, version: activeVersion };
}

Не выводите value, не сериализуйте возвращённый объект и не прикрепляйте его к ошибке. Логируйте только не-секретный идентификатор версии.

OWASP Secrets Management Cheat Sheet рекомендует планировать полный жизненный цикл секрета, включая создание, ротацию, отзыв, срок действия, аудит, резервное копирование и аварийный доступ break-glass. В нём также подчёркивается, что ротацию следует по возможности автоматизировать.

Не допускайте попадания секретов в репозитории и логи CI

Менеджеры секретов не помогают, если учетные данные были скопированы в исходный код, фикстуру, артефакт сборки или транскрипт CI.

Используйте меры контроля на трёх этапах:

Перед коммитом

  • Предоставляйте файлы .env.example с заполнителями, а не рабочими учетными данными.
  • Храните локальные файлы секретов вне системы контроля версий.
  • Запускайте быстрый сканер секретов в pre-commit hooks для распространённых шаблонов провайдеров и значений с высокой энтропией.
  • Объясняйте разработчикам, что удаление секрета в более позднем коммите не удаляет его из истории.

При push и pull request

  • Включите secret scanning репозитория и защиту от push, если это доступно.
  • Добавьте пользовательские шаблоны для внутренних gateway-токенов, которые публичные сканеры не распознают.
  • Требуйте документированную причину обхода и направляйте обходы на проверку службой безопасности.
  • Сканируйте сгенерированные файлы, ноутбуки, тестовые снимки и инфраструктурные планы — не только исходный код приложения.

GitHub описывает push protection как способ выполнять сканирование в процессе push и блокировать обнаруженные секреты до того, как они попадут в репозиторий. Обнаружение — не повод сохранять ключ: считайте любой подтверждённый закоммиченный учётный секрет скомпрометированным и немедленно выполните его ротацию.

Во время CI/CD

  • Предпочитайте workload identity или короткоживущую федерацию вместо сохранённых облачных учётных данных.
  • Предоставляйте секрет только тому заданию и тому шагу, которым он нужен.
  • Маскируйте известные значения секретов, но не полагайтесь на маскирование как на основной механизм защиты.
  • Отключайте shell tracing вокруг получения секретов.
  • Не позволяйте недоверенному коду из fork-репозиториев получать доступ к секретам развёртывания.
  • Проверяйте артефакты, кэши, дампы сбоев и отчёты тестов на случайный захват секретов.

Отслеживайте использование, не логируя секрет

Хороший мониторинг отвечает на вопрос «кто использовал какие права?» без записи самих этих прав.

Отслеживайте:

  • Нагрузку, окружение, tenant или проект и версию ключа.
  • Провайдера, модель, маршрутную политику и путь fallback.
  • Количество запросов, объём токенов, расходы, задержку и класс ошибок.
  • Исходную сеть или идентичность развёртывания, где это полезно.
  • Доступ к secret manager, включая отклонённые попытки чтения.
  • Создание ключа, изменения ограничений, ротацию, отзыв и удаление.
  • Внезапное использование из неожиданного окружения, географии, модели или временного окна.

Настраивайте оповещения по поведению, а не только по общим расходам. Украденный ключ с небольшим лимитом всё равно может раскрывать промпты или использоваться для проверки внутренних рабочих процессов. И наоборот, легитимная пакетная задача может вызвать всплеск расходов без компрометации учётных данных. Сопоставляйте использование у провайдера с идентификаторами запросов приложения, решениями policy на шлюзе, событиями развёртывания и audit logs менеджера секретов.

Для контроля трафика, дополняющего контроль учётных данных, используйте руководство по лимитам запросов LLM и практическое руководство по fallback-маршрутизации API LLM.

Используйте инцидентный таймер от компрометации до отзыва

Когда ключ может быть скомпрометирован, первая цель — локализация, а не доказательство того, использовал ли его злоумышленник.

Выполните эту последовательность:

  1. Объявите учетные данные скомпрометированными. Зафиксируйте, когда и где они могли быть раскрыты.
  2. Создайте замену по обычному контролируемому пути. Не вставляйте новый ключ в чат, чтобы ускорить инцидент.
  3. Переведите легитимные нагрузки на замену. Используйте подготовленную процедуру ротации.
  4. Отзовите подозрительный ключ. Если немедленный отзыв создаст неприемлемый ущерб, изолируйте маршруты и уменьшите лимиты, пока завершаете переключение.
  5. Проверьте все места, где есть копии. Проверьте историю исходного кода, логи CI, артефакты, слои контейнеров, системы поддержки, дашборды, ноутбуки, локальные конфигурации и резервные копии.
  6. Проверьте разрешенные пути данных. Определите, к каким запросам, ответам, файлам, инструментам или моделям мог иметь доступ ключ — не только к его биллинговой области.
  7. Сопоставьте активность. Сравните использование у провайдера, логи шлюза, развертывания, чтения секретов и активность пользователей.
  8. Уведомите нужных владельцев. Привлеките команды безопасности, платформы, юристов, приватности и клиентов в соответствии с данными и контрактами, которые затронуты.
  9. Устраните первопричину. Добавьте отсутствующий сканер, ограничение, границу идентичности или фильтр логов.
  10. Измерьте время. Зафиксируйте время до обнаружения, замены, переключения трафика, отзыва и проверки.

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

Референсная архитектура для AI-продуктов с несколькими провайдерами

Безопасную многопровайдерную конфигурацию можно организовать в пять уровней:

  1. Уровень идентичности клиента: аутентифицирует пользователя, устройство, агента или приложение, не раскрывая учетные данные провайдера.
  2. Уровень авторизации приложения: проверяет права продукта, границы тенанта, доступ к функциям и бюджеты.
  3. Уровень политики данных: классифицирует и редактирует запросы, файлы, полученный контекст и аргументы инструментов.
  4. Уровень шлюза и маршрутизации: выбирает одобренные модели, применяет квоты, записывает не секретную атрибуцию и обрабатывает отказоустойчивость.
  5. Уровень учетных данных провайдера: хранит изолированные учетные данные вендора, ротирует версии и предоставляет их только доверенной рабочей нагрузке маршрутизации.

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

Позиционирование продукта Flatkey заключается в одном OpenAI-совместимом endpoint и унифицированном доступе к нескольким поставщикам моделей. Это может сократить число интеграций, специфичных для отдельных вендоров, которые поддерживает приложение, но шлюз не снимает с вас ответственности за защиту аутентификации клиентов, классификацию данных запросов, настройку логов, назначение владельцев и тестирование отзыва. Оцените точный набор контролей, доступных для вашей учетной записи и архитектуры, до вывода в production. Вы можете начать с руководства по интеграции Flatkey и ознакомиться с актуальным доступом к моделям и ценами.

Чек-лист для production

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

Хранение и идентификация

  • Ни один долгоживущий ключ поставщика не вшит в код браузера, мобильного приложения, desktop-приложения или расширения.
  • У каждой production-нагрузки есть идентифицируемый владелец и путь учетных данных.
  • Production, staging, development, evaluation и локальный доступ разделены.
  • Общие человеческие ключи по возможности заменены на идентичности нагрузки или шлюза.
  • Ограничения поставщика и шлюза настроены на максимально узкую практически применимую область.

Хранение и доставка

  • Источником истины является управляемое хранилище секретов или контролируемая привязка развертывания.
  • Приложения получают секреты только во время выполнения и не выводят их в лог и не сериализуют.
  • CI-задачи получают только те секреты, которые требуются для соответствующего шага.
  • Доступ к секретам и административные изменения аудируются.
  • Доступ break-glass документирован, ограничен по времени и протестирован.

Данные и наблюдаемость

  • Заголовки авторизации и значения ключей исключены из логов, трассировок, ошибок и экспортов для поддержки.
  • Логирование prompt, output, file и аргументов tool следует схеме allowlist.
  • Редакция происходит до маршрутизации по нескольким поставщикам.
  • Использование можно атрибутировать по нагрузке, окружению, маршруту, поставщику, модели и версии ключа.
  • Алерты охватывают необычные маршруты и идентичности, а также расходы.

Ротация и реагирование

  • Существует протестированный runbook для ротации с двумя ключами или версионированным секретом.
  • Старые ключи отозваны у поставщика и проверены как неработающие.
  • Сканирование секретов и push protection охватывают репозитории и сгенерированные артефакты.
  • Предполагаемая утечка запускает немедленную локализацию без ожидания доказательства злоупотребления.
  • Время от раскрытия до отзыва измеряется после учений и инцидентов.

FAQ

Что такое безопасное управление API-ключами для AI-продуктов?

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

Следует ли хранить AI API-ключ в переменной окружения?

Переменная окружения может быть механизмом доставки, но это не полноценная система управления. Секрет по-прежнему нуждается в контролируемом источнике истины, ограниченном доступе к развертыванию, ротации, аудите и защите от дампов процессов, логов, debug-endpoint'ов и унаследованных дочерних процессов. Отдавайте предпочтение платформенной инъекции секретов или извлечению во время выполнения, если это улучшает эти контролы.

Как часто следует ротировать AI API-ключи?

Используйте возможности провайдера, вашу модель угроз, контракты и внутреннюю политику, чтобы определить интервал. Важнее, чем выбрать произвольное число в календаре, — доказать, что ротация автоматизирована или отработана, старые ключи отозваны, подозрительные ключи можно заменить немедленно, а устаревшие учетные данные не могут оставаться незамеченными.

Может ли браузер напрямую вызывать AI-провайдера с ограниченным ключом?

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

Безопаснее ли один ключ шлюза, чем много ключей провайдеров?

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

Что делать, если API-ключ появился в истории Git?

Считайте его скомпрометированным. Отзовите или ротируйте его, замените легитимных потребителей, проверьте активность провайдера и шлюза, удалите значение из активных веток и соответствующих артефактов, а также добавьте превентивное сканирование. Переписывание истории не делает все еще действующий учетный данные безопасными.

Источники и дополнительное чтение