Карта / Секреты / env, .env не в репо

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, не захардкожены) ротация = просто обновить значение в одном месте, перезапустить приложение.

🎤 Закрыл тему, если можешь объяснить:
• почему нельзя класть секреты в git даже "временно";
• как правильно передавать секреты в Spring Boot приложение через переменные окружения (если дошёл до 2-го слоя).