#Как выглядит неисправность
Если ключ API, пароль, приватный SSH-ключ или токен попал в Git, простое удаление файла новым коммитом НЕ удаляет секрет из истории: сначала закрывают доступ скомпрометированному ключу.
#Причины и признаки
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Секрет уже отправлен на серверОн доступен всем, кто имеет доступ к истории или её копиям | Есть коммит в удалённой ветке или запрос на слияние | Немедленно отозвать и заменить ключ |
| Секрет остался только в локальном индексеКоммит ещё не создан и push не выполнялся | git status показывает staged file, но git log его не содержит | Исключить файл из индекса, проверить diff |
#Пошаговое устранение
- 1. Определите тип секретного значенияОткройте настройки сервиса, выдавшего ключ (GitHub, облачный провайдер, платёжная система). Найдите управление токенами или ключами и определите, какие ресурсы доступны этому ключу; не вставляйте сам токен в команду или письмо.
- 2. Сразу отзовите секрет и создайте новыйВ кабинете владельца секрета выберите отзыв, удаление или перевыпуск именно скомпрометированной учётной записи; используйте выданный новый секрет в безопасном хранилище, а не в коде. Проверьте журнал доступа на необычные события. Если прав не хватает — сообщите ответственному администратору.
- 3. Уточните, был ли секрет включён в коммитВ терминале репозитория запустите git status и git log --oneline -5, затем посмотрите историю именно файла через git log -- path/to/secret.file. Не показывайте полный git show в общедоступном терминале: он способен раскрыть секрет.
- Замените путь; команды только читают историю и не выводят содержимое ключаLinux · Терминал (Bash)КомандаЗамените путь; команды только читают историю и не выводят содержимое ключа.
git statusgit log --oneline -5git log -- path/to/secret.file
- 4. Если файл пока лишь отслеживается, исключите его из индексаДля файла, который должен оставаться на диске, выполните git rm --cached -- path/to/secret.file (папку целиком не подставляйте). Добавьте точный путь в .gitignore и убедитесь, что при следующем коммите содержимое не включается. Если был коммит, этот шаг не стирает секрет из прежних коммитов.
- Меняет индекс, но не удаляет файл с диска; использовать только после копииLinux · Терминал (Bash)С осторожностьюМеняет индекс, но не удаляет файл с диска; использовать только после копии.
git rm --cached -- path/to/secret.filegit status --shortКоманда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
- 5. Подготовьте согласованную очистку историиЕсли секрет уже опубликован, сообщите команде и владельцу удалённого репозитория. Составьте список веток, тегов, копий и запросов на слияние; изучите процедуру git-filter-repo из официальной инструкции GitHub. Не запускайте массовый push --force --mirror без согласованного окна и резервной копии.
- 6. Проверьте, что новый секрет нигде не выставленУбедитесь в кабинете сервиса, что старый ключ не работает; выполните поиск по исходному дереву без вывода значений в логи, включите поиск секретов и защиту отправки в настройках репозитория. Если есть форки и чужие клоны, попросите владельцев устранить старые копии — очистка одного репозитория их не удалит.
#Как проверить результат
Безопасный итог: скомпрометированный ключ отозван, доступ приложения восстановлен с новым ключом, а команда приняла решение об истории и форках. Не считайте секрет защищённым только потому, что его больше нет в главной ветке.
#Если проблема осталась
Не повторяйте опасные действия на рабочем окружении. Сравните первоначальный симптом с новым состоянием, сохраните обезличенные сообщения и версии компонентов, проверьте резервную копию; перед изменением общей истории Git или данных/сети Docker обратитесь к ответственному администратору проекта.