Все мы сделали это в какой-то момент своей жизни. Вы только что реализовали блестящую новую функцию в своем публичном репо, вы завершаете свою последнюю фиксацию, запускаете все тесты и нажимаете. Вы идете на кухню, чтобы выпить заслуженный кофе, и как только вы собираетесь сделать первый глоток, вас осенило: вы поместили свой (пароль | API-ключ | API-секрет) в свой общедоступный репозиторий.

Ваш первый инстинкт - удалить конфиденциальную информацию из проекта и снова нажать, что, как мы все знаем, бесполезно, поскольку фиксация все еще присутствует в истории. Единственное, что нужно сделать, - это аннулировать открытую конфиденциальную информацию и как можно скорее выпустить новую, а затем исправить репозиторий. Предполагая, что вы быстро осознали свою ошибку, вы, вероятно, уйдете от нее невредимым. Но что произойдет, если вы этого не сделаете?

Интернет полон историй о людях, которые по ошибке передают свою конфиденциальную информацию и страдают из-за этого. Большинство из них связаны с злоумышленниками, которые крадут токены доступа S3 и накапливают тысячи долларов в счетах. У вас не так много времени после нажатия кнопки - в некоторых случаях эти так называемые хакеры могут получить ваши ключи и злоупотребить ими менее чем за десять минут. Но как?

Оказывается, сканирование конфиденциальной информации довольно просто, если вы знаете, как использовать GitHub. Вы можете буквально просто искать коммиты, которые содержат в своем сообщении« Удалить ключ API », и вы увидите тысячи и тысячи коммитов, которые содержат конфиденциальную информацию в различии, как день. Было бы тривиально написать бота, который очищает эти результаты. Есть также такие инструменты, как gitrob и truffleHog, которые сделают это за вас. Я думаю, можно с уверенностью сказать, что как только вы отправляете конфиденциальные данные, вы должны считать их скомпрометированными.

Расскажу о гитликах.

Gitleaks - это инструмент для сканирования как локальных, так и удаленных репозиториев на предмет любой конфиденциальной информации. Это быстро, легко и легко настраивается.

Чтобы запустить его в удаленном репозитории:

gitleaks --repo=https://github.com/path/to/your/repo

Чтобы запустить его локально:

gitleaks --repo-path=path/to/your/repo

Чтобы увидеть больше примеров, посетите вики-страницу. Для наших целей мы хотим запускать его в нашем локальном репозитории перед каждым нажатием. Поскольку gitleaks реализует довольно последовательные коды возврата (0 означает отсутствие утечек, а 1 означает наличие утечек), это на самом деле очень легко сделать; вместо git push мы можем просто сделать:

gitleaks --repo-path=path/to/your/repo -v && git push

Для тех из вас, кто не знает bash, && позволяет запустить команду, если предыдущая команда была выполнена правильно. В нашем примере git push будет запускаться только в том случае, если утечек не обнаружено. Мы также поместили туда -v, чтобы иметь возможность видеть больше информации о любых текущих утечках.

Вот пример того, как я запускаю его в репозитории с зафиксированным (поддельным) ключом AWS:

Как видите, поскольку gitleaks обнаружил утечку (ключ AWS в keys.go), git push не запустился. Мы в безопасности!

А вот пример того, как я запустил его после удаления ключа AWS:

Поскольку конфиденциальной информации больше не осталось, мы можем нажать.

Чтобы максимально упростить этот процесс, хорошей идеей будет присвоить нашей новой команде псевдоним git push, поскольку вводить его каждый раз, когда вы собираетесь нажимать, затруднительно. Один из способов сделать это - создать псевдоним, например:

alias gl="gitleaks --repo-path=path/to/your/repo -v && git push"

Это сработает, однако это не оптимально, поскольку мы хотим, чтобы наша команда была запечена в git push. Нам не следовало менять наш рабочий процесс. Поэтому лучший вариант - создать функцию-оболочку вокруг команды git:

Теперь это больше похоже на это! Это будет запускать gitleaks перед каждым git push без каких-либо изменений в нашем рабочем процессе. При таком подходе все параметры git push (такие как -f и -v) также будут работать, поскольку все флаги и аргументы передаются вместе . Мы можем с радостью git push, зная, что наши секреты в безопасности.

Вот и все - простой и беспроблемный способ аудита вашего репозитория перед каждым нажатием. Если вы работаете в команде, лучше всего настроить это в своем инструменте CI (вы действительно используете инструмент CI, верно?). Вы также можете настроить ловушку git, которая отклоняет коммиты при обнаружении утечек. Удачного кодирования!