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

Moatgator Vault

Одно место для секретов вашего бэкенда, CI и мобильного приложения

Поставьте ссылку mg:// туда, где раньше было значение. CLI, GitHub Actions и мобильный SDK подставляют значение при запуске, а ваше приложение получает секрет только на устройстве, прошедшем Attest.

Входит в тарифы начиная со Startup.

terminalПример
$ moatgator secrets run --env-file .env.tpl -- npm start$ moatgator secrets inject -i .env.tpl -o .env$ moatgator secrets get mg://api/prod/DATABASE_URL

Ссылки mg://

Коммитьте ссылку, а не значение

Ссылка указывает проект, окружение и секрет, например mg://api/prod/DATABASE_URL. Её можно хранить в Git: превратить её в значение может только субъект с доступом.

  1. 01

    Файл .env.tpl в вашем репозитории

    Храните один шаблон со ссылками. moatgator secrets inject записывает .env с правами 0600 и не перезаписывает существующий файл без --force.

    .env.tplПример
    # .env.tpl: safe to commitDATABASE_URL=mg://api/prod/DATABASE_URLSTRIPE_KEY=mg://api/prod/STRIPE_KEYSENTRY_DSN=mg://api/prod/SENTRY_DSN
  2. 02

    moatgator secrets run

    Запускает вашу команду с секретами в переменных окружения и скрывает их значения в выводе команды. moatgator secrets get читает одну ссылку.

    terminalПример
    $ moatgator secrets run --env-file .env.tpl -- npm start$ moatgator secrets inject -i .env.tpl -o .env$ moatgator secrets get mg://api/prod/DATABASE_URL
  3. 03

    Та же ссылка в приложении

    В Android SDK вызов Moatgator.vault.get("mg://mobile/prod/PARTNER_KEY") читает окружение, привязанное к приложению в консоли. Значение никогда не попадает в APK.

    KotlinПример
    // Android (Kotlin), off the main threadMoatgator.startSession(playIntegrityProvider)val key = Moatgator.vault.get("mg://mobile/prod/PARTNER_KEY")

Проекты, окружения и версии

  • Проекты и окружения

    Каждый проект создаётся с окружениями dev, staging и prod. Добавляйте свои окружения, когда они понадобятся.

  • Наследование и переопределение

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

  • Защищённые окружения

    Окружение prod изначально защищено: читать его значения и записывать в него могут только владельцы и администраторы.

  • Версии и откат

    Каждое изменение создаёт версию с историей. Откат создаёт новую версию, поэтому история никогда не переписывается.

  • Немедленный отзыв

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

  • Роли

    Роли владельца, администратора, разработчика и читателя определяют, кто видит значения и кто их меняет.

Только на аттестованных устройствах

Тот же секрет попадает в ваше мобильное приложение только на устройстве, прошедшем Attest

Менеджеры секретов обычно обслуживают серверы, разработчиков и CI. Vault обслуживает и приложение в руках ваших пользователей: SDK запрашивает секрет во время работы, API проверяет Attest устройства (Play Integrity или App Attest, плюс сигналы RASP от Moatgator) и отправляет значение, зашифрованное для эфемерного ключа этой сессии. В бинарный файл ничего не попадает.

SDK хранит значение только в памяти, никогда на диске или в логах. Ссылки mg:// доступны в Android SDK.

Политики для каждого секрета

  • Минимальный вердиктВыберите самый низкий вердикт Attest, при котором устройство может получить каждый секрет.
  • Обязательная аттестация платформыТребуйте результат аттестации платформы, а не только сигналы самого SDK.
  • Максимальный возраст аттестацииОтказывайте в секрете, если аттестация устройства старше, чем вы допускаете.

CI и серверы

В вашем CI не хранится долгоживущий токен

GitHub Action moatgator-hq/github-action/vault обменивает OIDC-токен задания на токен чтения, который действует 15 минут. Pull request никогда не получает токен. Где OIDC недоступен, используйте сервисный токен.

  • Сервисные токены (mgvt_…) дают доступ только на чтение и привязаны к одному проекту и выбранным вами окружениям.
  • Срок действия обязателен: 90 дней по умолчанию, не больше одного года.
  • Значения маскируются в логе задания и никогда не становятся выходными данными шагов.
  • Если ссылка не разрешается, шаг завершается с ошибкой и ничего не экспортирует.
.github/workflows/deploy.ymlПример
permissions: { contents: read, id-token: write }steps:  - uses: moatgator-hq/github-action/vault@v1    with:      project-id: vpj_…      secrets: |        DATABASE_URL=mg://api/prod/DATABASE_URL  - run: ./deploy.sh   # $DATABASE_URL, *** in the log

Синхронизация и ротация

Доставляйте секреты туда, где вы деплоите, и меняйте их по расписанию

Синхронизация поддерживает копию окружения, с учётом наследования, в секретах GitHub Actions, в Railway или в Vercel. Она запускается при создании и затем после каждого изменения в этом окружении или в окружении, от которого оно наследует.

  • Секреты GitHub Actions

    Синхронизация с репозиторием или с окружением GitHub. Каждое значение шифруется открытым ключом репозитория, прежде чем покинуть Moatgator.

  • Railway

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

  • Vercel

    Синхронизация с переменными production, preview или development проекта Vercel, которые хранятся как зашифрованные переменные.

  • Явное разрешение и статус

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

Ротация по расписанию

  • Новое случайное значение по расписаниюДля секретов, которые использует только ваша компания, например ключей HMAC и секретов сессий: Moatgator генерирует новое значение, создаёт версию и запускает синхронизации.
  • Напоминание о ключах других провайдеровДля ключа, выданного другим сервисом, владельцы и администраторы получают письмо, когда подходит срок, а консоль показывает ротацию как просроченную, пока не будет сохранено новое значение.

Синхронизация только записывает в место назначения и удаляет там только те секреты, которые записала сама. Удаление синхронизации оставляет место назначения как есть.

Шифрование для каждой организации, аудит каждого чтения

  • Конвертное шифрование для каждого тенанта

    У каждой организации свой ключ, обёрнутый мастер-ключом.

  • Шифротекст привязан к своему месту

    Каждый шифротекст привязан к своему проекту, окружению, имени и версии, поэтому его нельзя перенести в другой секрет.

  • Значения не попадают в логи

    Значения секретов никогда не записываются в наши логи, а CLI и Action скрывают их в вашем выводе.

  • Журнал аудита каждого чтения

    Для каждого чтения: кто прочитал, откуда, какую версию и с каким результатом.

Сравнение

Moatgator Vault, 1Password и Doppler

1Password и Doppler — зрелые менеджеры секретов, и оба умеют многое из того, что умеет Vault. Таблица показывает, как обстоят дела у каждого, и для каждой ячейки о них указаны публичный источник и дата нашей проверки. Vault не менеджер паролей для людей: он ориентирован на приложения, CI и мобильные устройства.

Возможности управления секретами в сравнении
ВозможностьMoatgator Vault1PasswordDoppler
Ссылки вместо значений

mg://project/environment/NAME, в том числе в мобильном SDK

1

op://vault/item/field

Частично23

ссылки ${…} внутри Doppler; шаблоны {{.NAME}} для файлов

Запуск команды с секретами в переменных окружения

значения скрыты в выводе

4

op run, значения по умолчанию маскируются в выводе

56

doppler run; маскирование вывода в CLI не задокументировано

Генерация файла из шаблона

файл записывается с правами 0600

7

op inject

3

secrets substitute и --mount

Окружения с наследованием

до 3 уровней, переопределение по имени

Частично8

Environments есть, но они независимы друг от друга

910

branch configs наследуют от корневого config; наследование между configs в Team и Enterprise

История версий и откат

откат создаёт новую версию

11

история элемента и восстановление

12

откат из логов

Машинные токены с ограниченным доступом и сроком действия

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

1314

service accounts с правами на уровне vault и необязательным сроком действия

15

service tokens для config, срок действия необязателен

Немедленный отзыв токена1615
CI с OIDC, без хранимого токена

GitHub Actions, токен на 15 минут

Частично1718

load-secrets-action использует хранимый токен; Credential Broker с OIDC в публичной предварительной версии

196

service account identities, тарифы Team и Enterprise

Синхронизация с GitHub Actions, Railway и Vercel

после каждого изменения; только записывает, удаляет только то, что записала сама

Частично820

синхронизация Environments с AWS Secrets Manager (beta); GitHub, Railway и Vercel не найдены

2122

интеграции с GitHub, Vercel и Railway отправляют секреты автоматически

Ротация по расписаниюЧастично

новое случайное значение для ваших собственных секретов; напоминание по почте для сторонних ключей

Не найдено в публичной документации2316

токены service account меняются вручную; ротация хранимых секретов по расписанию не найдена

24

автоматическая ротация поддерживаемых сервисов, например баз данных, в Team и Enterprise

Роли и защищённый продакшн

владелец, администратор, разработчик и читатель; prod защищён

258

права на vault и Environment

26

роли на уровне проекта и окружения

Аудит каждого чтения секрета

кто, откуда, версия и результат

27

отчёты об использовании в 1Password Business

Частично28

журнал доступа хранит первое и последнее чтение для каждого субъекта

Выдача мобильному приложению только на аттестованном устройстве

Attest плюс RASP, шифрование для каждой сессии

Не найдено в публичной документации2930

не найдено в документации SDK и Connect

Не найдено в публичной документации3121

не найдено в документации SDK и интеграций

Сильные стороны 1Password

  • Сквозное шифрование с Secret Key, который никогда не передаётся в 1Password.3233
  • op run по умолчанию маскирует значения секретов в выводе команды.4
  • Официальные SDK для Go, JavaScript и Python.29

Сильные стороны Doppler

  • Задокументированный список нативных интеграций с облачными и CI-платформами.21
  • doppler run --mount передаёт секреты через эфемерный именованный канал (named pipe), а не через файл на диске.5
  • Отдельный ключ шифрования для каждого workplace и ключи под управлением клиента (EKM) в тарифе Enterprise.3435

Источники

  1. 1. 1Password CLI — Secret references · проверено
  2. 2. Doppler — Secrets (referencing) · проверено
  3. 3. Doppler — Secret injection with templates · проверено
  4. 4. 1Password CLI — op run · проверено
  5. 5. Doppler — Accessing secrets (run, --mount) · проверено
  6. 6. Doppler — GitHub OIDC examples · проверено
  7. 7. 1Password — Load secrets into config files (op inject) · проверено
  8. 8. 1Password Environments · проверено
  9. 9. Doppler — Branch configs · проверено
  10. 10. Doppler — Config inheritance · проверено
  11. 11. 1Password — View and restore previous versions of items · проверено
  12. 12. Doppler — Versioning · проверено
  13. 13. 1Password CLI — op service-account · проверено
  14. 14. 1Password CLI — op connect · проверено
  15. 15. Doppler — Service tokens · проверено
  16. 16. 1Password — Manage service accounts · проверено
  17. 17. 1Password — GitHub Actions (load-secrets-action) · проверено
  18. 18. 1Password Credential Broker — GitHub Actions (public preview) · проверено
  19. 19. Doppler — Service account identities (OIDC) · проверено
  20. 20. 1Password — Sync Environments to AWS Secrets Manager (beta) · проверено
  21. 21. Doppler — Integrations · проверено
  22. 22. Doppler — GitHub Actions integration · проверено
  23. 23. 1Password Secrets Automation · проверено
  24. 24. Doppler — Secrets rotation · проверено
  25. 25. 1Password — Create, share, and manage vaults · проверено
  26. 26. Doppler — Project permissions · проверено
  27. 27. 1Password — Reports (usage reports) · проверено
  28. 28. Doppler — Access logs · проверено
  29. 29. 1Password SDKs · проверено
  30. 30. 1Password Connect · проверено
  31. 31. Doppler — Future SDKs and integration roadmap · проверено
  32. 32. 1Password — About the 1Password security model · проверено
  33. 33. 1Password — About your Secret Key · проверено
  34. 34. Doppler — Security fact sheet · проверено
  35. 35. Doppler — Pricing · проверено

1Password и Doppler — товарные знаки их владельцев; они упоминаются только для обозначения сравниваемых продуктов. Сведения о них взяты из их публичной документации на указанную дату. «Не найдено» означает, что мы не нашли это на указанных страницах, а не что у продукта этого нет. Если что-то изменилось, напишите нам, и мы исправим.

Тарифы

Vault входит в тарифы Startup, Scale и Enterprise.

ТарифПроектов на организациюСекретов на окружение
Startup5100
Scale50500
Enterprise2001 000
Посмотреть все тарифы

Часто задаваемые вопросы

Нужно ли менять код, чтобы использовать Vault?

На серверах и в CI — нет: ваш код по-прежнему читает переменные окружения, а процесс вы запускаете через moatgator secrets run или GitHub Action. В Android-приложении вызовите Moatgator.vault.get со ссылкой.

Может ли тот, у кого есть мой APK, прочитать секрет из Vault?

Значения нет в APK. API отправляет его только устройству, прошедшему Attest по политике секрета, в зашифрованном для этой сессии виде, а SDK хранит его только в памяти. Устройство может быть скомпрометировано и после успешной проверки, поэтому для всего, что связано с движением денег, сохраняйте проверки на сервере.

Что будет, если сервисный токен утечёт?

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

Заменяет ли Vault 1Password или Doppler?

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

В какие тарифы входит Vault?

Startup, Scale и Enterprise. Проектов на организацию: 5, 50 и 200. Секретов на окружение: 100, 500 и 1 000.

Начните с одного секрета

Создайте проект, добавьте секрет и получите его значение через CLI, ваш CI или приложение.