Moatgator Vault
Одно место для секретов вашего бэкенда, CI и мобильного приложения
Поставьте ссылку mg:// туда, где раньше было значение. CLI, GitHub Actions и мобильный SDK подставляют значение при запуске, а ваше приложение получает секрет только на устройстве, прошедшем Attest.
Входит в тарифы начиная со Startup.
$ 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: превратить её в значение может только субъект с доступом.
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_DSN02
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_URL03
Та же ссылка в приложении
В 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 дней по умолчанию, не больше одного года.
- Значения маскируются в логе задания и никогда не становятся выходными данными шагов.
- Если ссылка не разрешается, шаг завершается с ошибкой и ничего не экспортирует.
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 Vault | 1Password | Doppler |
|---|---|---|---|
| Ссылки вместо значений | 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, срок действия необязателен |
| Немедленный отзыв токена | 16 | 15 | |
| 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
Сильные стороны Doppler
Источники
- 1. 1Password CLI — Secret references · проверено
- 2. Doppler — Secrets (referencing) · проверено
- 3. Doppler — Secret injection with templates · проверено
- 4. 1Password CLI — op run · проверено
- 5. Doppler — Accessing secrets (run, --mount) · проверено
- 6. Doppler — GitHub OIDC examples · проверено
- 7. 1Password — Load secrets into config files (op inject) · проверено
- 8. 1Password Environments · проверено
- 9. Doppler — Branch configs · проверено
- 10. Doppler — Config inheritance · проверено
- 11. 1Password — View and restore previous versions of items · проверено
- 12. Doppler — Versioning · проверено
- 13. 1Password CLI — op service-account · проверено
- 14. 1Password CLI — op connect · проверено
- 15. Doppler — Service tokens · проверено
- 16. 1Password — Manage service accounts · проверено
- 17. 1Password — GitHub Actions (load-secrets-action) · проверено
- 18. 1Password Credential Broker — GitHub Actions (public preview) · проверено
- 19. Doppler — Service account identities (OIDC) · проверено
- 20. 1Password — Sync Environments to AWS Secrets Manager (beta) · проверено
- 21. Doppler — Integrations · проверено
- 22. Doppler — GitHub Actions integration · проверено
- 23. 1Password Secrets Automation · проверено
- 24. Doppler — Secrets rotation · проверено
- 25. 1Password — Create, share, and manage vaults · проверено
- 26. Doppler — Project permissions · проверено
- 27. 1Password — Reports (usage reports) · проверено
- 28. Doppler — Access logs · проверено
- 29. 1Password SDKs · проверено
- 30. 1Password Connect · проверено
- 31. Doppler — Future SDKs and integration roadmap · проверено
- 32. 1Password — About the 1Password security model · проверено
- 33. 1Password — About your Secret Key · проверено
- 34. Doppler — Security fact sheet · проверено
- 35. Doppler — Pricing · проверено
1Password и Doppler — товарные знаки их владельцев; они упоминаются только для обозначения сравниваемых продуктов. Сведения о них взяты из их публичной документации на указанную дату. «Не найдено» означает, что мы не нашли это на указанных страницах, а не что у продукта этого нет. Если что-то изменилось, напишите нам, и мы исправим.
Тарифы
Vault входит в тарифы Startup, Scale и Enterprise.
| Тариф | Проектов на организацию | Секретов на окружение |
|---|---|---|
| Startup | 5 | 100 |
| Scale | 50 | 500 |
| Enterprise | 200 | 1 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 или приложение.