Управление секретами: безопасное хранение паролей и ключей в проектах
Коротко: API-ключи, пароли и сертификаты не должны находиться в репозитории Git; храните их в переменных окружения или менеджерах секретов и регулярно ротируйте.
Подробнее: Секрет (secret) — любая информация, дающая доступ: пароль базы данных, API-ключ, токен, закрытый ключ. Почти ежедневно ключи собираются из публичных репозиториев (боты сканируют GitHub за секунды) и используются для злоупотреблений (счета за облако, вывод данных).
Подробности
Что не работает
- Секреты в исходном коде или в файлах конфигурации в репозитории.
- В образах Docker или во фронтенд-коде (видит каждый пользователь).
- В чате, электронной почте, тикетах, скриншотах.
- Одни и те же ключи для разработки и production, для всех сервисов.
- Бессрочно действующие, слишком мощные ключи.
Как сделать лучше
- Переменные окружения (файл
.envлокально, в.gitignore), секреты CI (GitHub Actions secrets), настройки хостинга (Vercel, Netlify). - Менеджеры секретов: HashiCorp Vault, AWS Secrets Manager, Azure Key Vault, Google Secret Manager, 1Password/Bitwarden Secrets, Doppler, SOPS (зашифрованные файлы в репозитории).
- Наименьшие привилегии: ключи с минимальными правами, раздельные для окружений и сервисов.
- Ротация: регулярное обновление, короткоживущие токены, немедленный отзыв при подозрении.
- Журналируйте и отслеживайте доступ.
- Два уровня доступа (не один ключ на всё).
Защита от утечек
- Хуки pre-commit и сканеры: gitleaks, trufflehog, secret scanning GitHub и защита push.
- При случайном коммите: немедленно отозвать/обновить ключ (удаления из истории недостаточно, данные уже скопированы); последующая очистка истории (
git filter-repo) — только как дополнительная мера. - Проверяйте журналы, чтобы в них не выводились секреты; не делайте сообщения об ошибках слишком подробными.
- Предоставляйте файлы-примеры (
.env.example) без реальных значений.
Практика для небольших проектов
Используйте .env локально и настройки платформы хостинга для production. Создавайте отдельные ключи на каждый сервис, записывайте их в менеджер паролей (не в файлы), задавайте оповещения о бюджете в облачных сервисах и по возможности ограничения по IP или привязку к домену для API-ключей. Публичный ключ браузера (например, для карт) должен быть ограничен вашим доменом.
См. также: Файлы env, Наименьшие привилегии, Менеджер паролей