Удалить секрет Менеджера секретов и создать новый секрет с тем же именем
3 минуты чтения
Я удалил секрет Менеджера секретов AWS. Затем я попытался воссоздать секрет, используя то же имя. Однако я получил сообщение об ошибке, подобное следующему: «Вы не можете создать этот секрет, так как секрет с таким именем уже запланирован к удалению»
Краткое описание
При удалении секрета диспетчер секретов не удаляет его немедленно. Диспетчер секретов планирует удаление секрета после периода восстановления, составляющего минимум семь дней. Это означает, что вы не сможете повторно создать секрет с тем же именем с помощью Консоли управления AWS, пока не закончится окно восстановления. Вы можете безвозвратно удалить секрет без какого-либо окна восстановления с помощью интерфейса командной строки AWS (AWS CLI). Дополнительные сведения см. в разделе Удаление секрета.
Решение
Запустите вызов API DeleteSecret с параметром ForceDeleteWithoutRecovery, чтобы окончательно удалить секрет.
Примечания:
- Если вы получаете ошибки при выполнении команд AWS CLI, убедитесь, что вы используете самую последнюю версию AWS CLI.
- Секреты, удаленные с помощью параметра ForceDeleteWithoutRecovery , не могут быть восстановлены или восстановлены.
Используйте консоль AWS Secrets Manager, чтобы получить удаленный идентификатор секрета Secrets Manager
Примечание: Вы можете пропустить этот шаг, если вы уже знаете идентификатор удаленного секрета.
- Откройте консоль диспетчера секретов.
- На панели навигации выберите
- Выберите значок настроек , а затем в Настройки выберите Показать секреты, запланированные для удаления .
- В Visible columns включите тумблер Deleted on и выберите Save .
- На панели Secrets обратите внимание на поля Secret name и Deleted on , чтобы найти идентификатор удаленного секрета.
- В Имя секрета выберите свой секрет.
- В Secrets Detail скопируйте имя Secret .
Используйте интерфейс командной строки AWS для безвозвратного удаления секрета
В этом примере замените your-secret-name своим секретным идентификатором или ARN в Secrets Manager, а your-region с вашим регионом AWS.
aws secretsmanager delete-secret --secret-id your-secret-name --force-delete-without-recovery --region your-region
Запустите вызов API DescribeSecret, чтобы убедиться, что секрет удален навсегда.
Примечание: Удаление — это асинхронный процесс. Возможна небольшая задержка.
aws secretsmanager description-secret --secret-id your-secret-name --region your-region
Вы получаете сообщение об ошибке, подобное следующему:
Произошла ошибка (ResourceNotFoundException) при вызове операции DescribeSecret: Диспетчер секретов не может найти указанный секрет.![]()
Эта ошибка означает, что секрет успешно удален.
Информация, связанная с данной
delete-secret
Git Clean, Git Remove file from commit — Cheatsheet
Содержание
Вы знаете, что добавлять секреты в ваш репозиторий git (даже приватный) — плохая идея, потому что это рискует раскрыть конфиденциальную информацию миру . Но были допущены ошибки, и теперь вам нужно выяснить, как вырезать конфиденциальную информацию из вашего репозитория. Поскольку git хранит историю всего , часто бывает недостаточно просто удалить секрет или файл, зафиксировать и отправить : нам может потребоваться выполнить небольшую глубокую очистку.
К счастью, для более простых случаев git предоставляет команды, которые упрощают очистку . А в более сложных случаях мы можем использовать git-filter-repo — инструмент, рекомендованный основными разработчиками git для глубокой очистки всего репозитория.
Прежде всего, если есть основания полагать, что секрет ускользнул в мир, и вы можете отозвать секрет, сделайте это. Способы отзыва секрета будут сильно различаться в зависимости от того, что защищает секрет. Если вы не знаете, как его отозвать, вам понадобится помощь владельца ресурса, защищенного секретом.
Нужно быстро узнать, какой сценарий применим к вам?Загрузите шпаргалку по истории git
ознакомьтесь с блок-схемой нашей шпаргалки ниже
Теперь давайте рассмотрим различные сценарии, чтобы понять, как все исправить.
НЕТ
Нет? Замечательно. Пожалуйста, пока не нажимайте его. Если у вас есть незавершенная работа, мы можем использовать git stash
, чтобы сохранить ее. Это откладывает вашу работу во временный «тайник», чтобы мы могли работать с репозиторием git, не теряя ничего, что вы еще не зафиксировали. Когда мы закончим очистку, вы можете использовать git stash pop
, чтобы восстановить свою работу.
ДА
Если вы уже отправили фиксацию, содержащую секрет, или только что обнаружили секрет в существующей истории, все усложняется, если над этой веткой работают другие люди. Если вы работаете один, на этом этапе делать нечего, вы можете перейти к следующему шагу. Если вы работаете в команде, все становится сложнее, потому что нам нужно, чтобы все действовали скоординировано.
Прежде всего, нам нужно определить, на кого еще влияет присутствие секрета, потому что нам нужно будет координировать действия всех. Если секрет появляется только в ветке, над которой вы работаете, вам нужно координировать свои действия только с кем-либо еще, кто всегда работает вне этой ветки. Однако, если вы нашли секрет, скрывающийся в более глубокой истории git, возможно, в вашем master
или main
ветка, вам нужно согласовать со всеми, кто работает в репозитории.
Сообщите другим пострадавшим, что был обнаружен секрет, который необходимо удалить из истории git каждого. Когда вы редактируете историю git для удаления файла, это может вызвать проблемы с локальными клонами ваших товарищей по команде; более того, они могут в конечном итоге повторно вставить секрет обратно в общедоступный репозиторий, когда будут продвигать свою работу. Поэтому важно, чтобы все пострадавшие были синхронизированы, чтобы удаление сработало. Это означает, что каждый должен прекратить то, что он делает, закрыть невыполненные PR и ускорить работу, которая находится в процессе.
Теперь давайте сделаем новый клон.
- Полностью удалите существующий клон.
- Создайте новый клон с помощью `git clone [URL-адрес репозитория]`
- Перейдите в каталог проекта с помощью `cd [имя проекта]`
- Загрузите всю историю репозитория: `git pull —all —tags`.
Последний шаг покажется вам немного знакомым. git pull
указывает git получать обновления из удаленного репозитория и применять их в текущей ветке (когда это имеет смысл, то есть когда локальная ветка настроена на отслеживание удаленной ветки). Но гит шустрый, все не тянет, только то, что нужно. Вот где
--all
флаг. Этот флаг сообщает git, что нужно захватить каждую ветку из удаленного репозитория. И флаг --tags
указывает git также захватывать каждый тег. Таким образом, эта команда говорит git загрузить всю историю репозитория, полный и полный клон. Мы должны сделать это, потому что возможно, что коммит, содержащий секрет, существует более чем в одной ветке или теге. Нам нужно убедиться, что мы не просто вычищаем наш секрет из части истории репозитория. В результате эта команда может выполняться очень долго, если репозиторий очень большой.
Перейти к следующему шагу.
Секрет в последнем коммите, и больше ничего в последнем коммите нет
В этом случае мы можем полностью удалить последний коммит. Мы делаем это с помощью
git reset --hard HEAD~1
Что делает эта команда? Давайте немного разобьем его. git reset
— это то, как мы сообщаем git, что хотим отменить последние изменения. Обычно эта команда сама по себе говорит git удалить все, что мы добавили с помощью
git add
, но еще не зафиксирован. Этот вариант сброса не подходит для наших целей. Но git reset
более гибкий. Мы также можем указать git вернуть нас во времени к предыдущему коммиту. Мы делаем это, сообщая git, к какому коммиту нужно вернуться. Мы можем использовать идентифицированный коммит (это «SHA»), или мы можем использовать косвенную ссылку. HEAD
— это то, что git называет самой последней фиксацией в проверенной ветке. HEAD~1
означает «первая фиксация до самой последней» (аналогично HEAD~2
означает «два коммита до самого последнего»).
Наконец, --hard
говорит git отбросить любые различия между текущим состоянием и состоянием, к которому мы сбрасываемся. Если вы пропустите --hard
, ваши изменения, включая секрет, не будут удалены. С --hard
различия будут удалены навсегда (именно этого мы и хотим!).
После того, как вы сделали полный сброс, все! Готово. Ваша работа была разрушена разрушительным образом, и вы можете вернуться туда, где вы были.
Секрет в последнем коммите, но были и другие изменения
В данном случае мы не хотим полностью удалять последний коммит. Вместо этого мы хотим отредактировать последний коммит. Отредактируйте свой код, чтобы удалить секреты, а затем добавьте свои изменения, как обычно. Затем вместо того, чтобы делать новый коммит, мы скажем git, что хотим изменить предыдущий:
git add [ИМЯ ФАЙЛА] git совершить --изменить
Мы все знаем, что git commit
, но флаг --amend
здесь нам в помощь. Это сообщает git, что мы хотим отредактировать предыдущий коммит, а не создавать новый. Мы можем продолжать вносить изменения в последний коммит таким образом, вплоть до того момента, когда мы будем готовы либо продвинуть нашу работу, либо начать новый коммит.
Как только вы изменили фиксацию, все готово! Секрет раскрыт, вы можете продолжать, как прежде.
Секрет находится за пределами последней фиксации
Это сложно Если вы знаете, что зафиксировали секрет, но с тех пор внесли другие изменения, все становится сложнее. Во всех случаях, кроме самых простых, нам понадобится более мощный инструмент, который поможет нам выполнить глубокую очистку репозитория. Мы собираемся использовать git-filter-repo
, инструмент, рекомендованный сопровождающими git, который поможет нам переписать историю более удобным для пользователя способом, чем собственный инструментарий git.
Техническое отступление для тех, кто знаком с концепцией перебазирования. (Если вы не знаете, что это значит, не стесняйтесь пропустить этот абзац.) Всеми описанными ниже случаями, конечно же, можно управлять с помощью собственных инструментов git, в частности, путем перебазирования. Конечно, иногда перебазирование выполняется относительно безболезненно, но в тех сценариях, которые мы здесь представляем, перебазирование будет утомительным и подверженным ошибкам процессом.
Сначала установите
git-filter-repo
Далее давайте оценим ситуацию, чтобы определить, какой метод подходит для вашей ситуации. Иногда секреты — это файлы, а иногда секреты — это строки кода. Например, если вы случайно зафиксировали ключ SSH или файл сертификата TLS, они содержатся в специализированных файлах, которые вам необходимо удалить. С другой стороны, может быть, у вас есть одна строка кода, содержащая ключ API, который является частью более крупного исходного файла. В этом случае вы хотите изменить одну или несколько строк файла, не удаляя его.
Git-filter-repo может обрабатывать оба случая, но для каждого из них требуется свой синтаксис.
Исключить весь файл
Чтобы указать git-filter-repo
удалить файл из истории git, нам нужна только одна команда:
git filter-repo --use-base-name --path [ ИМЯ ФАЙЛА] --invert-пути
Параметр --use-base-name
сообщает git-filter-repo
, что мы указываем имя файла, а не полный путь к файлу. Вы можете отказаться от этой опции, если хотите явно указать полный путь.
Обычно git-filter-repo
работает, игнорируя указанные имена файлов (они, как следует из названия, отфильтровываются). Но нам нужно обратное поведение, мы хотим, чтобы git-filter-repo
игнорировал все, кроме указанного файла. Итак, мы должны передать --invert-paths
, чтобы сказать это. Если вы опустите
, вы удалите все, кроме указанного файла, что является полной противоположностью тому, что мы хотим, и, вероятно, будет иметь катастрофические последствия. Пожалуйста, не делайте этого.
Редактировать файл, не удаляя его
Если вам нужно только отредактировать одну или несколько строк в файле, не удаляя файл, git-filter-repo
принимает последовательность команд поиска и замены (опционально с использованием регулярных выражений ).
Сначала определите все строки, содержащие секреты, которые необходимо удалить. Вам также необходимо разработать план того, как вы будете заменять эти линии. Возможно, достаточно просто их удалить. Но, возможно, их нужно изменить, чтобы предотвратить сбой во время выполнения.
Затем создайте файл, содержащий команды поиска и замены, с именем replaces.txt
. Убедитесь, что он находится в папке за пределами вашего репозитория, например, в родительской папке.
Формат этого файла — одна команда поиска и замены в строке с использованием формата:
ОРИГИНАЛ==>ЗАМЕНА
Например, предположим, что вы жестко запрограммировали токен API в свой код, например:
AUTH_TOKEN=’123abc’
Теперь предположим, что вы решили, что лучше загрузить токен API из переменной среды, как таковой:
AUTH_TOKEN=ENV[‘AUTH_TOKEN’]
Мы можем указать git-filter-repo
искать жестко закодированный токен и заменить его переменной среды, добавив эту строку в replaces.
: txt
'123abc'==>ENV['AUTH_TOKEN ']
Если у вас есть несколько секретов, которые нужно удалить, у вас может быть более одного подобного правила в replaces.txt
.
Наконец, если вы поместили replaces.txt
git-filter-repo
с нашими командами поиска и замены, такими как:git filter-repo --replace-text ../replacements.txt
Иногда вы можете получить сообщение об ошибке, говорящее, что вы не работаете с чистым клоном. Это нормально. Git-filter-repo вносит необратимые изменения в ваш локальный репозиторий, и перед этим он хочет убедиться, что у вас есть резервная копия. Конечно, у нас есть удаленный репозиторий, и мы работаем с локальным клоном. И, конечно же, мы очень заинтересованы во внесении необратимых правок в нашу историю коммитов — у нас есть секрет, который нужно очистить! Так что 9 не надо0137 git-filter-repo беспокоиться. Мы можем заверить его, что мы в порядке с внесением необратимых изменений, добавив флаг --force
:
git filter-repo --replace-text ../replacements.txt --force
Теперь у вас чистая история git! Вы захотите проверить свою работу, скомпилировав программное обеспечение или запустив набор тестов. Затем, когда вы убедитесь, что ничего не сломано, переходите к следующему шагу, чтобы распространить новую историю в удаленный репозиторий и остальную часть команды.
Нет
Если вы только что добавили секрет и еще ничего не отправили, все готово. Просто продолжайте работать, как раньше, и никто никогда не узнает. Не забудьте, если вам нужно восстановить незафиксированную работу, извлекая ее из тайника с помощью git stash pop
.
В противном случае нам придется перезаписать то, что находится в вашем удаленном репозитории git (например, GitHub), так как он все еще содержит испорченную историю. Однако мы не можем просто отправить: удаленный репозиторий откажется принять наш запрос, потому что мы переписали историю. Поэтому нам нужно принудительно нажать вместо этого. Более того, если наши повторные записи в историю затрагивают несколько веток или тегов, нам нужно будет поднять их все вверх. Мы можем сделать все это так:
git push --all --tags --force
ДА
Если вы работаете в команде, самое сложное. Все, кого вы определили как пострадавших в начале этого процесса, все еще имеют старую историю. Они должны синхронизироваться с исправленной историей, которую вы только что принудительно нажали. Именно здесь могут произойти ошибки и, что более важно, может возникнуть разочарование.
В идеале все должны были поднять свою работу до того, как вы отредактировали историю. В этом случае каждый может просто сделать чистую копию репозитория и продолжить с того места, на котором он остановился.
Но если кому-то не удалось продвинуть свою работу до того, как вы переписали историю, они обнаружат, что у них есть ряд конфликтов, которые необходимо разрешить, когда они будут тянуть. Вместо этого им нужно получить новую историю из удаленного репозитория и перестроить свою тяжелую работу на переписанную историю. Для этого:
git fetch
git rebase -i origin/[название ветки]
Если вы не знакомы с git fetch
, эта команда указывает git загрузить новые данные из удаленного репозитория, но в отличие от git pull
, он не пытается объединить новые коммиты в вашу текущую рабочую ветку. Таким образом, выборка здесь запрашивает всю недавно переписанную историю.
Я знаю, что сказал, что не буду говорить о перебазировании, но это единственный случай, когда это необходимо. Как только вся новая история будет извлечена, разработчику нужно будет повторно применить всю свою тяжелую работу поверх переписанной истории. Это делается путем ребазинга. К сожалению, это может быть утомительным и подверженным ошибкам процессом, поэтому необходимо соблюдать осторожность. По этой причине перебазирование выходит за рамки данного руководства. Вместо этого мы рекомендуем вам просмотреть этот учебник для получения дополнительной информации.
Если вы дошли до этого места, поздравляем! Вы успешно и надежно удалили секрет или файл из своей истории git. Но так не должно было быть. Вы можете предотвратить всю эту головную боль с помощью GitGuardian.
GitGuardian — это решение для автоматического обнаружения секретов, которое интегрируется с вашими репозиториями git для сканирования вашего кода на наличие секретов.