Не допускайте попадания секретов в Git

GitBeginner
Практиковаться сейчас

Введение

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

Вы изучите рабочую область Git, область подготовки и снимок коммита; отделите приватные настройки от передаваемых примеров и воспользуетесь подготовленным сканером учётных данных. Вам не нужны учётная запись Git, удалённый репозиторий или предварительные знания Git.

Найдите рабочую область и область подготовки

На этом шаге вы определите, какие файлы Git готовится сохранить.

Git записывает выбранные версии файлов в репозитории. Его рабочее дерево содержит файлы, которые вы редактируете. Область подготовки хранит следующий снимок, который вы намерены включить в коммит. Коммит сохраняет подготовленный снимок в локальной истории; он ничего не загружает автоматически.

cd /home/labex/project/desklite-git

git status сравнивает эти области:

git status

Подготовленный терминал может выделять категории файлов цветом; важна формулировка. Найдите две разные категории. private.env находится среди изменений для коммита: его содержимое уже в области подготовки. service/app.py находится среди изменений, не подготовленных к коммиту: его бизнес-изменение пока только в рабочем дереве. Название ветки может отличаться и не влияет на задачу.

git ls-files перечисляет отслеживаемые пути, включая новые файлы, добавленные в область подготовки для первого коммита:

git ls-files

Приватный файл появляется в списке, хотя ещё не был включён в коммит. Именно сейчас можно предотвратить утечку. Исходная история коммитов чистая. Пока не создавайте коммит: сначала проверьте, что в него попадёт.

Сравните два вида изменений

На этом шаге вы сравните бизнес-изменение с подготовленной приватной конфигурацией.

git --no-pager diff показывает неподготовленные изменения. Глобальный параметр --no-pager оставляет вывод прямо в терминале, поэтому отдельный просмотрщик закрывать не придётся. Ограничьте вывод бизнес-файлом, указав его путь:

git --no-pager diff service/app.py

Строки, начинающиеся с -, показывают старое содержимое, а строки с + — новое. Новая программа выводит DeskLite tickets ready. Сохраните это нужное бизнес-изменение.

git --no-pager diff --cached, напротив, показывает подготовленное содержимое. Параметр --cached выбирает область подготовки:

git --no-pager diff --cached

Вы должны увидеть private.env и ключи SERVICE_NAME и API_TOKEN. Токен вымышленный и нигде за пределами курса не работает. Тем не менее он представляет значение такого типа, который должен оставаться приватным.

Подготовленный снимок может отличаться от файла, который сейчас находится на диске. Поэтому проверка только рабочего дерева может пропустить то, что уже подготовлено для коммита. Перед коммитом проверяйте оба вида изменений.

В репозитории уже настроены локальные примерные данные автора. Вам не придётся указывать личные сведения или подключать Git к внешнему сервису.

Прочитайте результат обнаружения со скрытым значением

На этом шаге вы запустите подготовленный сканер для приватного файла и разберёте результат.

Gitleaks обнаруживает текстовые шаблоны, связанные с учётными данными. Учебная команда запуска course-secrets запускает Gitleaks 8.24.2 с одним фиксированным локальным правилом для нашего синтетического формата токенов labex_. Она скрывает совпавшие значения и не отправляет сетевых запросов. Это ограниченное учебное правило не является полноценной политикой обнаружения секретов для рабочей системы.

Передайте команде файл или каталог, чтобы просканировать его текущее содержимое:

course-secrets private.env

Ожидается обнаружение с идентификатором desklite-practice-token, именем файла/номером строки и скрытым секретом. Команда намеренно завершается с кодом 1, поскольку нашла учётные данные. Обнаружение отличается от ошибки запуска самого инструмента.

Эта команда сканирует текущий файл независимо от того, отслеживает ли его Git. Сканирование истории, с которым вы познакомитесь позже, проверяет изменения в коммитах. Чистая история не делает этот незакоммиченный файл безопасным для добавления в область подготовки.

Здесь приватное значение находится только в подготовленном/рабочем содержимом. Если бы реальные учётные данные уже раскрыли, исключение из нового коммита не сделало бы их недействительными и не стёрло бы старые копии: владельцу пришлось бы отозвать или заменить их. Это упражнение не обучает переписыванию истории.

Отделите приватные настройки от примера

На этом шаге вы исключите приватные настройки из отслеживания Git, добавите узкое правило игнорирования и создадите пригодный для использования публичный пример.

git rm --cached удаляет путь из области подготовки/отслеживания, сохраняя локальный файл. Здесь команда отменяет случайную подготовку нового приватного файла:

git rm --cached private.env

Откройте .gitignore, который сообщает Git, какие неотслеживаемые пути нужно исключать:

nano .gitignore

Введите это единственное правило, затем сохраните с помощью Ctrl+O, Enter, Ctrl+X:

/private.env

Начальный / привязывает правило к корню этого репозитория. Не игнорируйте service/: в нём находятся файлы для передачи. Правила игнорирования не удаляют автоматически уже отслеживаемые файлы или старые коммиты; поэтому предыдущая команда была необходима.

Создайте публичный пример с теми же ключами конфигурации:

nano service/config.example.env

Сохраните:

SERVICE_NAME=DeskLite
API_TOKEN=REPLACE_ME

Пример сообщает будущему оператору, какие настройки нужны, не предоставляя действующие учётные данные. Сохраните исходный приватный файл локально.

ls private.env
git status

Приватный путь больше не должен быть подготовлен к коммиту или указан среди неотслеживаемых файлов. .gitignore и публичный пример должны быть неотслеживаемыми и готовыми к осознанному добавлению в область подготовки. Существующее бизнес-изменение остаётся неподготовленным.

Подготовьте только передаваемые файлы

На этом шаге вы подготовите именно те файлы, которые должны войти в следующий коммит.

git add копирует текущее содержимое указанных путей в область подготовки. Явно перечислите каждый файл, который нужно передать:

git add service/app.py service/config.example.env .gitignore

Проверьте и категории файлов, и подготовленное содержимое:

git status
git --no-pager diff --cached

Ожидаются ровно нужное бизнес-изменение, узкое правило игнорирования и безопасный пример. Приватного токена быть не должно. Если вы снова редактируете файл после git add, перед коммитом нужно подготовить обновлённое содержимое; Git не заменяет предыдущий подготовленный снимок автоматически.

Снова выведите отслеживаемые пути:

git ls-files

Три передаваемых пути должны появиться; private.env — нет. Эта проверка отвечает на другой вопрос, чем ls: локальный приватный файл всё ещё существует, но Git его не отслеживает.

На следующем шаге сканируется передаваемый каталог. Сканирование намеренно ограниченной области передачи не доказывает, что все остальные файлы на машине свободны от секретов.

Просканируйте передаваемое содержимое

На этом шаге вы проверите каталог исходного кода для передачи, сохранив приватные локальные настройки.

Запустите тот же сканер с фиксированным правилом для каталога service:

course-secrets service

Ожидаются no leaks found и успешное завершение. Сканер обрабатывает реальное содержимое исходного кода и примера. Он не опирается на вручную отредактированный отчёт.

Приватная конфигурация находится в корне репозитория, вне передаваемого каталога. Повторное сканирование этого приватного файла по-прежнему обнаружило бы токен; это ожидаемо. Мы разделили доступ для разных пользователей, а не объявили, что конфиденциальные данные перестали существовать.

Ещё раз проверьте подготовленный снимок:

git --no-pager diff --cached

Сканирование каталога проверяет текущие файлы, а diff — то, что сохранит Git. Обе проверки должны соответствовать нужному передаваемому содержимому. Отсутствие находок подтверждает результат только для настроенного правила и области проверки — оно не доказывает отсутствие всех возможных секретов или проблем безопасности.

Теперь у вас есть проверенный подготовленный снимок. Следующий шаг сохранит его в локальном коммите.

Сохраните локальный коммит

На этом шаге вы сохраните проверенный подготовленный снимок в локальной истории.

git commit записывает область подготовки. Параметр -m задаёт короткое сообщение с описанием изменения; кавычки объединяют его слова:

git commit -m "Deliver ticket message and safe configuration example"

Ожидается сводка коммита с тремя изменёнными путями. Идентификаторы коммитов и статистика файлов могут отличаться, поэтому смотрите на состав коммита.

git status

Ожидается чистое рабочее дерево. Игнорируемый приватный файл всё ещё существует, хотя git status его не перечисляет.

Коммит локальный. Ничего не отправлено, не загружено и не передано удалённому сервису. Этого достаточно, чтобы потренироваться готовить безопасную передачу без личной учётной записи.

Если Git сообщает, что коммитить нечего, сравните git status, git ls-files и подготовленный diff с предыдущими шагами. Не исправляйте неожиданное состояние удалением репозитория или существующей истории.

Проверьте историю и бизнес-изменение

На этом шаге вы просканируете историю коммитов и запустите небольшую программу, которую сохранили.

Параметр команды запуска --history выбирает сканирование истории Git в Gitleaks. Заключительная . означает этот репозиторий:

course-secrets --history .

Ожидается no leaks found. И чистый исходный коммит, и ваш новый коммит для передачи должны пройти проверку фиксированным правилом. Успешное сканирование файлов ранее само по себе не доказывало бы такой результат для истории.

python3 запускает предоставленную программу Python. В этой лабораторной работе вам не нужно редактировать или понимать синтаксис Python:

python3 service/app.py

Ожидаемый вывод:

DeskLite tickets ready

Убедитесь, что локальный приватный файл остаётся вне отслеживания Git:

ls private.env
git ls-files

Теперь у вас есть полезные передаваемые файлы, безопасный пример конфигурации и локальный коммит без учебных учётных данных. Приватный файл не удалён, а бизнес-изменение по-прежнему работает. Копировать отчёт сканирования или создавать файл исследования не требуется.

Резюме

Вы отделили локальные приватные настройки от передаваемого исходного кода, проверили область подготовки перед коммитом и просканировали как текущие передаваемые файлы, так и локальную историю Git с фиксированным правилом обнаружения учётных данных и скрытием найденных значений. Бизнес-изменение и полезный публичный пример сохранены, а приватные настройки остались вне коммита.