Как удалить секреты из истории Git
У вас есть пароль или секрет в вашем репозитории Git, и вы хотите его удалить. Недавно у меня была такая же проблема в одном из моих репозиториев. Я покажу вам удобный и простой способ избавиться от любого случайно зафиксированного секрета в вашем репозитории Git.
Понимание ситуации
Прежде всего, нам нужно убедиться, что у нас есть общее понимание проблемы. Мы закоммитили секрет в репозиторий Git. Это проблема, потому что каждый, у кого есть доступ к нашему исходному коду, имеет доступ к секретной информации. Нам не нужны никакие секреты в наших репозиториях исходного кода.
Неважно, удаляем ли мы секрет другим коммитом или удаляем файл из репозитория. Секрет всегда останется в истории Git.
Если мы хотим избавиться от секрета, нам нужно переписать историю Git. Это может быть непросто, особенно для таких разработчиков, как я, которые обычно используют только базовые команды Git.
У меня есть пример репозитория, который содержит секреты в файле конфигурации, который я хочу удалить. Давайте посмотрим на файл.
{ "mailPassword": "&T95HgN~vRs>{Wv§ZsAateQ$mKX8@aat", "jwtSecret": ":vb5#jSKKyg&Sx)2s>nRZMXnUf$" }
Я сделал несколько коммитов для этого файла. Вот почему секрет останется в истории Git, даже если я удалю его в будущем коммите.
Возможные решения
Несмотря на то, что существуют встроенные команды Git, такие как git filter-branch , которые мы можем использовать для перезаписи истории Git, они по-прежнему несколько подвержены ошибкам. Это особенно верно, если вы раньше не использовали эти команды.
Я могу говорить только за себя, но я предпочитаю использовать специальный инструмент, который помогает мне поступать правильно. К счастью, я наткнулся на BFG Repo Cleaner.
Средство очистки репозиториев BFG
Средство очистки репозиториев BFG — это инструмент Java, что означает, что на вашем компьютере должна быть установлена среда выполнения Java, а Java должна быть доступна из командной строки.
BFG Repo Cleaner предлагает более простую и быструю альтернативу git-filter-branch для удаления секретных данных из истории вашего репозитория Git.
Загрузите инструмент и переместите его в место, доступное из командной строки. Я переместил его в корень диска C:\ на моем компьютере с Windows.
Подготовка репозитория
Нам нужно убедиться, что наш репозиторий находится в чистом состоянии. Я предлагаю, чтобы у вас не было ожидающих изменений, и вы загружали последние изменения из удаленных репозиториев, чтобы убедиться, что вы работаете с последней версией своего кода.
Кроме того, нам нужно убедиться, что мы удалили все секреты из репозитория с помощью другого коммита, прежде чем использовать BFG Repo Cleaner. Давайте откроем файл конфигурации, удалим секреты и зафиксируем изменения.
Создание файла Password.Txt
Далее мы создаем новый файл в корневой папке репозитория и называем его password.txt . В этот файл мы вставляем секреты, которые хотим удалить из репозитория. Убедитесь, что вы помещаете каждый секрет в новую строку.
&T95HgN~vRs>{Wv§ZsAateQ$mKX8@aat :vb5#jSKKyg&Sx)2s>nRZMXnUf$
Запуск BFG Repo Cleaner
Затем мы открываем инструмент командной строки и переходим в корень репозитория. Мы запускаем следующую команду для запуска BFG Repo Cleaner.
java -jar C:\bfg-1.14.0.jar --replace-text password.txt
В зависимости от размера вашего репозитория и количества коммитов, выполнение инструмента займет от нескольких секунд до нескольких минут.
Проверка репозитория
Теперь давайте посмотрим на историю Git репозитория. Как видите, инструмент заменил секреты общей строкой.
Удаленные секреты в Git Diff
Отправка вашего переписанного репозитория
Если вы работаете с удаленными устройствами, например, GitHub, вам необходимо принудительно отправить изменения с помощью следующей команды:
git push --force origin main
Origin — это имя удаленного сервера, а main — это имя ветки.
Это нужно сделать, потому что при перезаписи истории каждое изменение хэша коммита начиналось с первого коммита, содержащего какой-либо из ваших секретов.
Работа с раскрытыми секретами
Также убедитесь, что все копии вашего репозитория, включая все удаленные, снова клонированы. В противном случае вы не сможете отправить изменения, потому что история двух репозиториев Git не совпадает.
А как же раскрытые секреты?
Пока вы единственный человек, имеющий доступ к хранилищу, все в порядке. В случае, если репозиторий был перенесен в другое место, например, на GitHub, нам нужно предположить, что существует как минимум другая копия вашего репозитория и, следовательно, ваши секреты больше не являются секретными, и вам следует изменить любые пароли или другие секретная информация , которая была раскрыта.
В общем, я бы рассматривал любую секретную информацию, которая была передана в репозиторий, как потенциально утечку, и я предлагаю изменить эти секреты сразу после исправления репозитория с помощью метода, показанного здесь.
Я увлеченный инженер-программист, страстно любящий преподавать разработку .NET на YouTube, писать статьи о своем путешествии в своем блоге и заставлять людей улыбаться.
Управление секретами с помощью kubectl | Kubernetes
Создание секретных объектов с помощью командной строки kubectl.
На этой странице показано, как создавать, редактировать, управлять и удалять Kubernetes.
Секреты использования kubectl
инструмент командной строки.
Прежде чем начать
- Killercoda
- Играть с Kubernetes
Создать секрет
A Секрет 9Объект 0098 хранит конфиденциальные данные, такие как учетные данные.
используется модулями для доступа к сервисам. Например, вам может понадобиться секрет для хранения
имя пользователя и пароль, необходимые для доступа к базе данных.
Вы можете создать секрет, передав необработанные данные в команде или сохранив
учетные данные в файлах, которые вы передаете в команде. Следующие команды
создайте секрет, который хранит имя пользователя admin
и пароль S!B\*d$zDsb=
.
Использовать необработанные данные
Выполните следующую команду:
kubectl создать секретный универсальный db-user-pass \ --from-literal=имя пользователя=admin \ --from-literal=password='S!B\*d$zDsb='
Вы должны использовать одинарные кавычки ''
для экранирования специальных символов, таких как $
, \
, *
, =
и !
в ваших строках. Если вы этого не сделаете, ваша оболочка будет интерпретировать эти
персонажи.
Использовать исходные файлы
Сохранить учетные данные в файлах:
echo -n 'admin' > ./username.txt echo -n 'S!B\*d$zDsb=' > ./password.txt
Флаг
-n
гарантирует, что в сгенерированных файлах не будет лишней новой строки символ в конце текста. Это важно, потому что когда
читает файл и кодирует содержимое в строку base64, дополнительный символ новой строки также кодируется. Вам не нужно специально бежать символов в строках, которые вы включаете в файл.Передайте пути к файлам в команде
kubectl
:kubectl create secret generic db-user-pass \ --from-file=./имя_пользователя.txt \ --from-file=./password.txt
Имя ключа по умолчанию — это имя файла. При желании вы можете установить имя ключа используя
--from-file=[key=]source
. Например:kubectl create secret generic db-user-pass \ --from-file=имя_пользователя=./имя_пользователя.txt \ --from-file=пароль=./password.txt
При любом методе вывод аналогичен:
secret/db-user-pass created
Проверка секрета
Проверка создания секрета:kubectl получить секреты
Вывод аналогичен:
ИМЯ ТИП ДАННЫХ ВОЗРАСТ db-user-pass Непрозрачный 2 51s
Посмотреть подробности секрета:
kubectl описать секрет db-user-pass
Вывод аналогичен:
Имя: db-user-pass Пространство имен: по умолчанию Ярлыки: <нет> Аннотации: <нет> Тип: Непрозрачный Данные ==== пароль: 12 байт имя пользователя: 5 байт
Команды kubectl получить
и kubectl описать
не показывать содержимое
из Secret
по умолчанию. Это сделано для защиты секрета
от разоблачения. случайно или из-за сохранения в журнале терминала.
Расшифровать секрет
Просмотр содержимого созданного вами секрета:
kubectl get secret db-user-pass -o jsonpath='{.data}'
Вывод аналогичен:
{ "пароль": "UyFCXCpkJHpEc2I9", "имя пользователя": "YWRtaW4=" }
Расшифровать пароль
эхо 'UyFCXCpkJHpEc2I9' | base64 --декодировать
Вывод аналогичен:
S!B\*d$zDsb=
Внимание! Это пример для документации. На практике, этот метод может привести к тому, что команда с закодированными данными будет сохранена в история вашей оболочки. Любой, кто имеет доступ к вашему компьютеру, может найти команду и расшифровать секрет. Лучший подход состоит в том, чтобы объединить представление и декодировать команды.
kubectl get secret db-user-pass -o jsonpath='{.data.password}' | base64 --декодировать
Редактирование секрета
Вы можете редактировать существующий объект Secret
, если только он не
неизменный.