Всем привет! Я тут только учусь, но уже успел накосячить по-крупному. Сидел вчера, ковырял свой первый проект на Flask, и в файле config.py были настоящие пароли от базы данных. Думал, что всё почистил, сделал коммит, запушил на GitHub... А сегодня утром открываю репозиторий и вижу — пароль висит в открытом доступе! 😰
Сразу выпал в осадок. Вспомнил, что на курсах говорили про .gitignore, но я его не добавил. Или добавил, но не туда? Короче, файл с секретами попал в коммит. Удалил его из папки, сделал новый коммит, но на гитхабе старая версия всё ещё видна. Как так? Думал, если удалить файл локально, то он исчезнет и на сервере...
Погуглил — оказывается, надо переписывать историю коммитов с git filter-branch или BFG Repo-Cleaner. Но я боюсь сломать весь репозиторий, там уже 20 коммитов, и один из них с паролем. Если я перепишу историю, другие разработчики (пока никого нет, но вдруг?) не смогут пуллить? Или все потеряется?
Пароль уже сменил, конечно, на продакшене. Но сам факт — теперь любой может увидеть мой старый пароль в коммитах. Есть ли способ навсегда удалить этот файл из истории Git, чтобы даже в логах его не было? Или это как-то через force push делается?
Кстати, теперь понял, что надо юзать переменные окружения или .env файлы, которые в .gitignore. Но как правильно организовать хранение секретов в маленьком проекте? Может, есть какие-то туториалы на эту тему?
И еще вопрос: если я уже залил пароль, но сменил его — опасно ли это? Вдруг кто-то склонировал репозиторий и сохранил себе старые данные? Или GitHub автоматически сканирует коммиты на секреты? Слышал про токены, которые блокируются, но про пароли не знаю.
В общем, сижу теперь и трясусь. Кто сталкивался — подскажите, как правильно откатить эту ситуацию? И может, есть жизнь после такого косяка?) Спасибо за советы, а то я уже думаю удалить весь репозиторий и начать с нуля...
P.S. Теперь буду читать дока по Git и безопасности перед каждым коммитом. Даже кофе не помогает успокоиться 😅
О, классика. 20 коммитов — роскошь, а не проблема, но ты прав, filter-branch или BFG тут твой единственный друг. BFG проще, он просто выпиливает файл из всей истории, и после force push’а в логах останется только пустота. Проблема с другими разработчиками — если их нет, то и переживать не о чем. Если появятся, просто скажешь им сделать git fetch и сбросить свои локальные ветки на новую историю.
Про GitHub-сканирование: да, у них есть Secret Scanning, но он больше для API-ключей и токенов, а не для паролей от БД. Так что надеяться на автоматическую блокировку не стоит — пароль уже утек, и кто-то мог склонировать репозиторий. Смена пароля — это минимум, но если база была доступна извне, лучше ещё и логи проверить на подозрительные подключения. А вообще, да, .env + .gitignore — это база, но если хочешь быть уверенным, используй vault или хотя бы python-dotenv, и никогда не храни секреты в репозитории даже в закомментированном виде. Жизнь после такого косяка есть, но лучше сразу привыкнуть к паранойе — она продлевает жизнь продакшену.
👎 1
BFG — норм вариант, но я бы ещё добавил: если репозиторий публичный, считай, что пароль уже у всех, кто успел форкнуть или склонировать. GitHub не удаляет старые коммиты из форков, даже если ты перепишешь историю. Так что смена пароля — это единственное, что реально фиксит утечку. Сделал — уже молодец.
По организации: для маленького проекта .env + .gitignore — это святое, но ещё советую сразу завести git-secrets или pre-commit хуки, которые не пропустят коммит с секретами. Это проще, чем потом разгребать filter-branch. И да, не парься, каждый через это проходил. Главное — запомнил урок и не забудь завести привычку смотреть git status перед каждым commit -m "fix".
👍 1
Ну давай разберем. BFG — это действительно самое правильное решение для твоего случая, он просто выпилит файл из всей истории целиком, не заставляя тебя разбираться с filter-branch. Force push после этого — обязателен, и да, если других разработчиков нет, проблем с синхронизацией не возникнет. Но добавлю к сказанному: даже после чистки истории считай, что пароль гуляет по интернету, если репозиторий хоть секунду был публичным. GitHub индексирует коммиты почти мгновенно, и боты скрейпят такие вещи быстрее, чем ты успеешь налить кофе. Смена пароля — это хорошо, но проверь еще и доступ к базе по IP: если она висела на 0.0.0.0, а не на localhost, могли и прямой коннект попробовать.
По организации: .env + .gitignore — база, но добавь туда еще pre-commit хук с `git-secrets` или `detect-secrets`. Они тупо не дадут тебе сделать коммит, если в диффе есть что-то похожее на пароль или ключ. И да, привычка смотреть `git diff --cached` перед каждым коммитом спасет тебе не один вечер. Все через это проходили, жизнь после такого косяка есть, но теперь ты официально посвящен в культ паранойи — добро пожаловать.