Защита от утечки секретов при отправке изменений (Push)

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

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

Доступность и права

Возможность включения сканирования и просмотра раздела безопасности зависит от типа репозитория и роли пользователя:

Тип репозиторияВладелец / АдминистраторСоавтор (чтение / запись)
Личный (Публичный)Полный доступ к настройкамРаздел доступен только для чтения
Личный (Приватный)Доступно в рамках раннего доступаДоступно в рамках раннего доступа
ОрганизацияОжидается в обновленияхОжидается в обновлениях

Как включить сканирование

Для активации защиты выполните следующие шаги:

  1. Перейдите на страницу репозитория и откройте вкладку Настройки.
  2. В боковом меню выберите раздел Безопасность.
  3. Если в разделе присутствует главный переключатель Безопасность, активируйте его.
  4. Включите опцию Защита от утечки секретов.

Блокировка отправки изменений

Проверка на секреты срабатывает как при работе в терминале (git push), так и при прямых действиях через веб-интерфейс (UI) GitVerse (например, при создании нового коммита через браузер).

В случае обнаружения уязвимостей операция прерывается. Система предложит вам перейти на страницу Обнаруженные секреты для просмотра всех находок и выбора обходных решений:

  • в веб-интерфейсе появится всплывающее окно с предупреждением и кнопкой Перейти к списку, которая ведет на эту страницу;
  • в терминале выведется структурированное сообщение об ошибке с перечнем уязвимостей и уникальной ссылкой на эту же страницу.
remote: 
remote: ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
remote:   PUSH ОТКЛОНЁН  ·  обнаружены потенциальные секреты
remote: ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
remote: 
remote:   6 находок  ·  5 файла  ·  3 коммита
remote: 
remote: ── d295725 · feat: add Stripe webhook + initial DB schema ──────
remote: 
remote:    ▸ AWS Access Token
remote:      AKIA****
remote:      pg_db/init.sql:4
remote: 
remote:    ▸ Stripe Access Token
remote:      sk_live_****
remote:      src/webhooks/stripe.go:42
remote: 
remote: ────────────────────────────────────────────────────────────────
remote:   Откройте находки, чтобы отметить ложные срабатывания
remote:   и получить инструкции по очистке настоящих секретов:
remote: 
remote:   https://gitverse.ru/user/repo/-/security/secrets/8f3a2c1
remote: ────────────────────────────────────────────────────────────────
To https://gitverse.ru/user/repo.git
 ! [remote rejected] develop -> develop (pre-receive hook declined)
error: failed to push some refs to 'https://gitverse.ru/user/repo.git'
 

Info

В целях безопасности сами секреты никогда не отображаются полностью. Конец строки скрывается звездочками (например, sk_live_****).

Обработка обнаруженных секретов

Чтобы разблокировать отправку кода, перейдите по сформированной ссылке на страницу Обнаруженные секреты. Доступ к ней имеет только тот пользователь, который инициировал действие.

Для каждой находки выберите одно из действий:

  • ложное срабатывание — сканер ошибся, строка не является секретом;
  • тестовые данные — строка является тестовой заглушкой и безопасна для публикации;
  • секрет (требует исправления) — это настоящий секрет, который необходимо удалить из истории Git.

После разметки нажмите Подтвердить. Если все секреты отмечены как безопасные (ложные/тестовые), блокировка снимается, и вы можете повторить операцию отправки без изменений кода. Если найден настоящий секрет, необходимо удалить его из истории.

Как удалить секрет из истории коммитов

Если сканер заблокировал отправку, просто удалить секрет из файла и сделать новый коммит недостаточно — секрет все равно останется в истории предыдущих коммитов, и платформа снова отклонит push. Историю локальных коммитов необходимо переписать.

Важное правило безопасности

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

Шаг 0. Определите, где именно находится секрет

Перед началом очистки посмотрите на список коммитов, которые вы пытаетесь отправить:

git log --oneline -5
 

Вы увидите список последних изменений:

a1b2c3d (HEAD -> main) Третий коммит — тут всё чисто
e4f5g6h Второй коммит — ⚠️ ЗДЕСЬ СЕКРЕТ
j7k8l9m Первый коммит — тут всё чисто
 

В зависимости от того, где скрыт секрет, выберите один из двух сценариев ниже.


Сценарий 1. Секрет находится в самом последнем коммите (HEAD)

Это самый простой случай. Если секрет попал в коммит, который вы сделали только что, его можно исправить одной командой.

  1. Отредактируйте файлы вручную — откройте файлы, где сканер нашел секреты, и удалите конфиденциальные строки (пароли, токены).
  2. Добавьте исправленные файлы в индекс:
git add <путь_к_файлу>
 
  1. Обновите последний коммит:
git commit --amend --no-edit
 

Флаг --no-edit указывает Git обновить файлы внутри коммита, но оставить прежний текст сообщения. 4. Повторите отправку кода:

git push origin <имя_ветки>
 

Сценарий 2. Секрет находится в более ранних коммитах (2-й, 3-й и далее с конца)

Если вы успели сделать несколько коммитов после того, как случайно сохранили секрет, понадобится инструмент интерактивного перебазирования (interactive rebase).

  1. Запустите интерактивный rebase на глубину коммитов, где спрятан секрет. Например, если нужно проверить последние 3 коммита:
git rebase -i HEAD~3
 
  1. Выберите коммит для редактирования. В открывшемся текстовом окне терминала вы увидите список коммитов (от старых к новым). Найдите проблемный коммит и замените слово pick перед ним на edit (или просто букву e):
pick j7k8l9m Первый коммит — тут всё чисто
edit e4f5g6h Второй коммит — ⚠️ ЗДЕСЬ СЕКРЕТ
pick a1b2c3d Третий коммит — тут всё чисто
 

Сохраните изменения и закройте редактор (в Vim: нажмите Esc, введите :wq и нажмите Enter).

  1. Удалите секрет. Git временно вернет состояние репозитория к этому коммиту и остановит процесс. Откройте файлы и вручную очистите секретные данные.

  2. Зафиксируйте изменения:

git add <путь_к_файлу>
git commit --amend --no-edit
 
  1. Продолжите rebase. Прикажите Git собрать остальные коммиты поверх исправленного:
git rebase --continue
 

Если Git сообщит о конфликтах, разрешите их, снова выполните git add . и повторите git rebase --continue.

  1. Отправьте чистую историю на GitVerse:
git push origin <имя_ветки>
 

Что делать, если обычный git push выдает ошибку?

Если вы переписали историю коммитов, которые уже находились на сервере до включения блокировки, сервер отклонит обычный push, так как история локально и на удалении разошлась.

В этом случае используйте безопасную принудительную отправку:

git push --force-with-lease origin <имя_ветки>
 

Warning

Флаг --force-with-lease перезапишет историю в удаленной ветке. Если над этой веткой работают другие участники команды, обязательно предупредите их, чтобы они обновили свои локальные копии репозитория.