Рубрики
Uncategorized

Использование клавиш GPG для подписи GIT Commits — Часть 1

Этот пост был первоначально опубликован в среду, 24 февраля 2021 года на Cloudwithchris.com. Некоторое время я ‘… Помечено технологией, DevOps, GIT, безопасности.

Этот пост был первоначально опубликован в среду, 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»