Этот пост был первоначально опубликован в среду, 24 февраля 2021 г. cloudwithchris.com .
Некоторое время я использовал клавиши GPG, чтобы подписать свои коммиты GIT, чтобы доказать, что мои коммиты по GitHub являются подлинными и от меня. За последние несколько недель меня вдохновило пара коллег (благодарность Адриану и Джули, если вы читаете это), чтобы выкопать мою Yubikey и использовать их для моих ключевых действий подписания. В то время как есть несколько сообщений в блоге/образцов (например, здесь , Здесь и Здесь ) На эту тему уже столкнулся с несколькими препятствиями по пути.
Цель этого поста в блоге состоит в том, чтобы стать первым сериалом, где мы рассмотрим, что такое GPG, почему это может быть ценным для вас и как вы можете использовать их. Затем мы сделаем это дальше и покажем, как вы можете использовать Yubikeys в качестве второго фактора проверки и преимуществ этого подхода. Я ни в коем случае не являюсь экспертом мира по криптографии и некоторым из этих тем, но я хотел задокументировать свое собственное понимание для потомков, так как мне неизбежно нужно повторить/рассмотреть процесс в будущем. Я надеюсь, что это может быть полезно для вас.
Итак, во -первых, что такое GPG? Иногда он также также известен как GNUPG или GNU -охранник конфиденциальности (и, если вам интересно, проект GNU — это проект свободного программного обеспечения, который был создан в 1980 -х годах, изначально с целью освобождения всех частей операционной системы. Из моего исследования существует разница между проектом GNU и лицензиями GNU, но мы не будем охватывать это в этой серии (это было мое собственное любопытство!).
Согласно сайту GNUPG, они объясняют GPG как следующее —
«GNUPG — это полная и бесплатная реализация стандарта OpenPGP, как определено RFC4880 (также известным как PGP). GNUPG позволяет зашифровать и подписывать ваши данные и коммуникации; Он имеет универсальную систему управления ключами, а также модули доступа для всех видов каталогов открытых ключей. GNUPG, также известный как GPG, представляет собой инструмент командной строки с функциями для легкой интеграции с другими приложениями. Доступно множество фронтальных приложений и библиотек. GNUPG также обеспечивает поддержку S/MIME и Secure Shell (SSH) ».
Теперь мы вступаем в мир безопасности и криптографии. Подумайте о сценариях, в которых вы хотите отправить сообщение пользователю, но получатель хочет убедиться, что сообщение действительно от вас. Или, может быть, как отправитель, вы хотите, чтобы только получатель мог его увидеть, и не перехватился какими -либо подслушителями (Алиса, Боб, Ева кто -нибудь?). GPG стремится помочь вам решить эту проблему.
Так почему же это важно в контексте сценария GIT? На данный момент я предполагаю, что вы, по крайней мере, знаете основы GIT. В качестве быстрого праймера/освежения GIT является системой управления распределенной версией. Каждый коммит имеет некоторый ассоциацию метаданных, включая имя, а также адрес электронной почты. Эти метаданные не связаны обратно с каким -то авторитетным источником и не проверены каким -либо образом. Для этого сценария давайте предположим, что у нас есть {Алиса, Боб, Ева} @ Contoso.com, который был представлен ранее в статье. В GIT очень легко подделать другого пользователя. Можно даже переписать историю (хотя я не рекомендую вам пробовать это в любых живых средах, если вы не знаете, что делаете!).
Теперь с этим контекстом. Давайте рассмотрим пример того, как легко выдать себя за других пользователей или потенциально переписать историю.
Во -первых, давайте продолжим и создадим совершенно новый каталог. Перейдите к нему и инициализируйте репозиторий GIT, используя git init
Анкет
Затем перейдите в этот недавно инициализированный репозиторий GIT и установите следующее местный Конфигурации —
git config --local user.email "alice@contoso.com" git config --local user.name "Alice"
ПРИМЕЧАНИЕ. Если у вас уже есть GIT, настроенный на вашу систему, то особенно важно обратить внимание на флаг -локальный флаг, чтобы вы не переопределили какие -либо глобальные настройки. Эти изменения будут существовать только в контексте этого хранилища.
Затем «Алиса» создает файл с именем myfile.php с содержимым ниже:
Теперь, если мы запустим статус GIT, мы увидим, что файл не отрывается.
Это означает, что контроль версий знает, что файл существует, но не был официально распознан/версирован в GIT. Нам нужно сначала добавить файл в стационарную среду, а затем запустить файл в управление версией.
git add myfile.php git commit -m "My Hello World Sample"
Теперь мы видим, что Алиса внесла изменения! Или, по крайней мере, это, похоже, сделано Алисой. Вы помните, как мы входили в систему, аутентификации или проверки того, кем мы являемся в любой момент? На данный момент, давайте предположим, что это подлинная коммита Алисы. Давайте изменим наш контекст и станем Бобом.
git config --local user.email "bob@contoso.com" git config --local user.name "Bob"
Боб хочет улучшить выборку, сделав ее актуальной для компании. Вместо этого он меняет образец на «Hello Contoso». После внесения изменений он входит в статус GIT, чтобы подтвердить, что файл имеет изменения, прежде чем провести его изменения или совершить коммит.
Теперь Боб запускает следующие команды —
git add myfile.php git commit -m "Adjust to Hello Contoso"
Теперь «Алиса» или «Боб» может продолжить и использовать Git Pull, чтобы убедиться, что у них есть последняя версия репозитория (или любого другого пользователя с соответствующим доступом). Если они используют git log
Команда, они увидят, что есть изменения, внесенные двумя пользователями. Алиса и Боб. Опять же, это появляется Как будто изменения были внесены двумя пользователями. Опять же, имейте в виду, что нам не пришлось доказать, что мы либо Алиса, либо Боб.
Теперь один последний сценарий, помните Еву? Что ж, Ева заинтересовалась проектом и хочет отдать должное большой работе Алисе и удалить Боба с картин.
Теперь, как примечание, вы должны быть очень осторожны, когда выполняете какие -либо функции, которые переписывают историю GIT Commits. Если вы уже интегрировали исходный код в репозиторий, к которому есть доступ других пользователей (например, Dazure DevOps, GitHub и т. Д.), то переписывание истории может даже не быть принято с помощью удаленного репозитория, и если это может привести к Лот боли. Если вы полностью не понимаете последствий того, что вы делаете, я не рекомендую вам делать это в какой -либо живой среде. Есть много гидов/статей об этом, и выходит за рамки этой статьи.
Теперь, с предупреждением о здоровье — давайте продолжим … Ева идет вперед и запускает следующий сценарий. Сценарий использует Git-Filter-ranch
Команда заменить любые коммиты на Old_email на new_email, а также заменить имя. Любой коммит, который соответствует оператору IF в сценарии, будет изменен.
git filter-branch --env-filter ' OLD_EMAIL="bob@contoso.com" NEW_NAME="Alice" NEW_EMAIL="alice@contoso.com" if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ] then export GIT_COMMITTER_NAME="$NEW_NAME" export GIT_COMMITTER_EMAIL="$NEW_EMAIL" fi if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ] then export GIT_AUTHOR_NAME="$NEW_NAME" export GIT_AUTHOR_EMAIL="$NEW_EMAIL" fi ' --tag-name-filter cat -- --branches --tags
Увидеть проблему? У нас нет никакой гарантии на подлинность этих коммитов. Кто -нибудь из тех людей Алиса, Боб или Ева? Все ли коммиты потенциально подделка? Не имея какого -то подписанного коммита, у нас нет уверенности. И именно здесь ценность клавиш GPG лежит в этом конкретном сценарии. Возможность продемонстрировать, что совершенные изменения были подписаны кем-то с ключом, который соответствует метаданным пользователям (например, адрес электронной почты).
Есть также еще один потенциальный сценарий. Если вы планируете внести свой вклад в открытый исходный код, то некоторые проекты могут потребовать сертификата происхождения разработчика (DCO). , то есть какая-то проверка, которую вы внесли эти изменения (а также соглашение, которое вы имеете право совершать этот код, а не воровать/повторно использовать его из других мест). Опять же, подписание GPG может иметь жизненно важное значение в этом сценарии, чтобы доказать вашу подлинность.
Ключи GPG основаны на некоторых общих принципах безопасности — например Асимметричные пары ключей- чтобы вы могли получить открытый ключ, который можно поделиться с другими пользователями, но личный ключ, где вы можете подписать/зашифровать, чтобы доказать, что это действительно вы. Я считаю, что GPG обрабатывает дополнительные сценарии, но это основной, на котором мы сосредоточимся. Как и в случае любых криптографических обсуждений, убедитесь, что вы безопасно управляете своими ключами (так что никто не получает несанкционированный доступ, но у вас также есть резервное копирование в случае любой потери ключей), является жизненно важным. Есть шаблоны, которые мы рассмотрим в более позднем сообщении в блоге, так что вы не ставите все свои яйца в одну корзину и могли иметь различные подкамеры для индивидуальных целей (воспринимайте это как о основной привилегии, а не Наличие одного супер -ключа, который имеет доступ к множеству различных действий/услуг).
Итак, давайте подведем итоги. Мы до сих пор знаем, что —
- GNUPG/GPG/GNU Privacy Guard существует, чтобы позволить вам шифровать/подписать свои данные или сообщения
- При внесении изменений в репозиторий GIT вы связываете метаданные (имя и адрес электронной почты) с каждым коммитом. Это непроверенные метаданные, и по умолчанию не знаком.
- Мы можем захотеть убедиться, что коммиты являются подлинными, например, в случае принятия проекта с открытым исходным кодом или работать в какой -либо соответствующей отрасли.
- GPG может помочь нам в этом сценарии, так как мы могли бы подписать наши коммиты с этими клавишами GPG. Нам нужно поделиться публичной частью нашего ключа подписи с другими пользователями (мы рассмотрим более поздний пост в блоге, как это достигнуто на GitHub), чтобы они могли проверить, что это мы, которые подписали коммиты. Если мы отправим зашифрованную информацию, то вместо публичной/частной пары ключей для подписания нам понадобится пара/частные ключевые пары для шифрования. Но опять же, мы рассмотрим типы действий в другом посте в блоге
Теперь, как я уже упоминал, это будет серия постов в блоге. Я не хочу слишком быстро вкладывать слишком много в один пост и перегружать людей! Итак, это начальный контекст вокруг проблемы и почему вы можете рассмотреть вопрос о том, чтобы изучить это. Я надеюсь, что это было полезно! В следующем посте в этой серии мы рассмотрим, как пойти дальше и генерировать клавиши GPG для подписания ваших коммитов (в этом случае, не используя Yubikey).
Оригинал: «https://dev.to/cloudwithchris/using-gpg-keys-to-sign-git-commits-part-1-8mi»