env, .env не в репо
Секрет в git = секрет, которого нет. Коммит с паролем останется в истории навсегда — даже если его удалить в следующем коммите. История Git не перезаписывается обычными командами. Если репозиторий когда-либо был публичным — считайте, секрет скомпрометирован.
Правило: никаких секретов в коде и конфигурационных файлах в репозитории.
Вместо этого — переменные окружения:
# application.yml — в репозитории (безопасно)
spring:
datasource:
url: ${DB_URL}
username: ${DB_USER}
password: ${DB_PASSWORD}
jwt:
secret: ${JWT_SECRET}
# Локально: .env файл (НЕ в репо) или экспорт в терминале
export DB_PASSWORD=my_secret_password
export JWT_SECRET=very-long-random-string-256-bit
.env файл используют для локальной разработки — список KEY=VALUE, читается библиотеками (dotenv). Обязательно добавьте .env в .gitignore:
# .gitignore
.env
.env.local
*.env
Копнуть глубже
GitHub Secret Scanning — GitHub автоматически сканирует новые коммиты на наличие известных форматов секретов (AWS ключи, GitHub tokens, Stripe ключи и т.д.) и уведомляет владельца репозитория. Многие провайдеры (AWS, GitHub) автоматически аннулируют ключи, найденные в публичных репозиториях. Это хорошо, но это не повод класть секреты в репо — не все форматы распознаются.
git-secrets, gitleaks — инструменты для локальной защиты: pre-commit хук, который не даёт закоммитить строки, похожие на секреты (по регулярным выражениям). Устанавливается в проект, проверяет каждый git commit.
Как передать секреты на продакшн:
- Переменные окружения контейнера: в docker-compose или Kubernetes Secret → env var
- Kubernetes Secrets: специальный объект кластера, монтируется как env или файл
- CI/CD секреты: GitHub Actions Secrets, GitLab CI Variables — зашифрованы, доступны только в pipeline
- Secrets Manager: AWS Secrets Manager, Vault (см. тему «Vault»)
Ротация секретов. Хорошая практика — менять секреты регулярно (паролей к БД, API-ключей). При правильной архитектуре (секреты через env/Vault, не захардкожены) ротация = просто обновить значение в одном месте, перезапустить приложение.
• как правильно передавать секреты в Spring Boot приложение через переменные окружения (если дошёл до 2-го слоя).