Защита целостности кода с помощью PGP. Часть 1. Базовые концепции и инструменты

Автор оригинала: Matt Crouch
  • Перевод
Если вы пишете код, который попадает в общедоступные репозитории, вам может пригодиться PGP. В этой серии статей, перевод первой из которых мы публикуем сегодня, будут рассмотрены вопросы использования PGP для обеспечения целостности кода программного обеспечения. Эти материалы, в основном, нацелены на разработчиков свободного ПО, хотя изложенные здесь принципы применимы в любых ситуациях, когда разработка ведётся силами распределённых команд программистов.



Здесь будут раскрыты следующие темы:

  • Основы PGP и рекомендации по работе с соответствующим ПО.
  • Использование PGP с Git.
  • Защита учётной записи разработчика.

О структуре материалов


Каждый раздел этой серии материалов разбит на две части:

  1. Контрольный список, который может быть адаптирован под нужды конкретного проекта.
  2. Пояснения, раскрывающие суть элементов контрольного списка, а также инструкции по работе с программами.

Особенности контрольного списка


Элементы в каждом из контрольных списков включают в себя сведения об уровне приоритетности того или иного пункта. Надеемся, это поможет вам в ходе принятия решений по использованию предлагаемых рекомендаций.

  • Элементам, которым назначен приоритет «важно», следует уделить особое внимание. Если рекомендации из «важных» пунктов не будут реализованы, это будет означать высокий риск возникновения проблем с кодом, включаемым в проект.
  • Элементы с приоритетом «рекомендовано» содержат рекомендации, которые полезно реализовать для улучшения общего уровня безопасности. Их внедрение может подействовать на взаимодействие программиста с его рабочим окружением, это, возможно, потребует приобретения новых привычек или отказа от старых.

Помните о том, что все приведённые здесь списки — это лишь рекомендации. Если вы чувствуете, что приведённые уровни приоритетности не отражают особенностей вашего проекта в плане безопасности, вам следует адаптировать их под свои нужды.

Базовые концепции и инструменты PGP


▍Контрольный список


Вот темы, в которых нужно ориентироваться после успешного освоения материала этого раздела:

  1. Роль PGP в разработке свободного ПО (Важно).
  2. Основы криптографии с открытым ключом (Важно).
  3. Различия между шифрованием и подписыванием материалов (Важно).
  4. Идентификационные данные ключей PGP (Важно).
  5. Достоверность ключей PGP (Важно).
  6. Установка утилит GnuPG (версии 2.x) (Важно).

▍Пояснения


Сообщество открытого ПО уже давно полагается на PGP для обеспечения аутентичности и целостности разрабатываемых программных продуктов. Вы можете об этом не знать, но работаете ли вы в среде Linux, Mac или Windows, вы уже пользовались PGP для того, чтобы обеспечить целостность вашего вычислительного окружения.

  • Дистрибутивы Linux используют PGP для обеспечения неизменности бинарных пакетов или пакетов с исходным кодом с момента их создания до момента их установки конечным пользователем.
  • Проекты свободного ПО обычно предлагают отдельные подписи PGP для выпущенных программных архивов, таким образом, проекты, полагающиеся на них, могут проверить целостность загруженных релизов перед интеграцией их в собственные дистрибутивы.
  • Проекты свободного ПО обычно полагаются на подписи PGP в самом коде для того, чтобы отслеживать происхождение и обеспечивать целостность кода, вносимого в проект его разработчиками.

Это очень похоже на механизмы сертификатов разработчиков и подписывания кода, используемые программистами, работающими на платформах с закрытым кодом. На самом деле, базовые концепции, лежащие в основе этих двух технологий во многом совпадают. Они различаются, в основном, техническими деталями реализации, и тем, как они делегируют доверие. PGP не полагается на централизованную службу сертификации, вместо этого данная система позволяет пользователям самостоятельно назначать уровень доверия каждому сертификату.

Наша цель заключается в том, чтобы помочь вам контролировать происхождение кода, попадающего в ваш проект, и отслеживать его целостность с помощью PGP. Сделать это можно, следуя рекомендациям по работе с PGP и усвоив основные правила безопасности.

▍Обзор работы PGP


Вам не нужно знать все подробности о том, как работает PGP. Для успешного использования этой технологии достаточно понимания её базовых концепций. В PGP используются криптография с открытым ключом. С помощью криптографических методов, например, обычный текст может быть преобразован в текст зашифрованный. Этот процесс требует наличия двух разных ключей:

  • Открытого ключа, который известен всем.
  • Закрытого ключа, который известен только владельцу.

▍Шифрование


Для шифрования PGP использует открытый ключ того, для кого предназначен зашифрованный материал. В ходе шифрования создаётся сообщение, которое можно расшифровать только используя соответствующий закрытый ключ, принадлежащий получателю сообщения.

Процесс шифрования выглядит так:

  1. Отправитель создаёт случайный ключ шифрования (сеансовый ключ).
  2. Отправитель шифрует содержимое сообщения, применяя этот сеансовый ключ (с использованием симметричного шифра).
  3. Отправитель шифрует сеансовый ключ, используя открытый ключ PGP получателя.
  4. Отправитель отправляет зашифрованные данные и зашифрованный сеансовый ключ получателю.

Для расшифровки зашифрованного сообщения выполняются следующие действия:

  1. Получатель расшифровывает сеансовый ключ, используя свой закрытый ключ PGP.
  2. Получатель использует сеансовый ключ для расшифровки содержимого сообщения.

▍Подписывание


Для подписывания данных открытые и закрытые ключи PGP используются обратным способом:

  1. Подписывающий генерирует хэш контрольной суммы неких данных.
  2. Подписывающий использует собственный закрытый ключ для шифрования этой контрольной суммы.
  3. Подписывающий предоставляет зашифрованную контрольную сумму вместе с данными.

Для проверки подписи выполняют следующие действия:

  1. Проверяющий генерирует собственную контрольную сумму данных.
  2. Проверяющий использует открытый ключ подписывающего для расшифровывания предоставленной контрольной суммы.
  3. Если контрольные суммы совпадают, значит целостность содержимого подтверждена.

▍Совместное использование шифрования и подписывания


Часто зашифрованные сообщения ещё и подписывают с использованием собственного PGP-ключа отправителя данных. Подобный подход следует использовать всегда, когда осуществляется обмен зашифрованными сообщениями, так как шифрование без аутентификации не имеет особого смысла (пожалуй, анонимность в подобных вещах нужна лишь секретным агентам и тем, кто делает общественным достоянием некую закрытую информацию).

▍Идентификационные данные ключа


С каждым PGP-ключом должны быть ассоциированы идентификационные данные владельца ключа. Обычно это — полное имя человека и адрес электронной почты в следующем формате:

Alice Engineer <alice.engineer@example.com>

Иногда идентификационные данные так же содержат комментарии, приводимые в скобках и предназначенные для того, чтобы сообщить конечному пользователю подробности о конкретном ключе:

Bob Designer (obsolete 1024-bit key) <bob.designer@example.com>

Так как люди, владельцы ключей, могут играть множество профессиональных и персональных ролей, в одном и том же ключе могут присутствовать несколько наборов идентификационных данных:

Alice Engineer <alice.engineer@example.com>
Alice Engineer <aengineer@personalmail.example.org>
Alice Engineer <webmaster@girlswhocode.example.net>

Когда используются множество наборов идентификационных данных, один из них помечается как основной, для упрощения поиска ключа.

▍Достоверность ключа


Для того чтобы иметь возможность использовать чей-нибудь открытый ключ для шифрования или верификации, вам нужно убедиться в том, что он действительно принадлежит этому человеку (Alice в данном случае), а не мошеннику (пусть мошенника зовут Eve). В PGP это называется достоверностью ключа:

  • Полная достоверность ключа означает, что имеется очень высокий уровень уверенности в том, что данный ключ принадлежит Alice.
  • Граничная достоверность ключа означает, что мы до некоторой степени уверены в том, что ключ принадлежит Alice.
  • Неизвестная достоверность ключа означает, что у нас абсолютно нет уверенности в том, что этот ключ принадлежит Alice.

▍Сеть доверия и механизм «доверие при первом использовании»


PGP включает в себя механизм делегирования доверия, известный как сеть доверия (Web of Trust, WOT). В своей основе — это попытка заменить необходимость в централизованных службах сертификации вроде тех, что используются в HTTPS/TLS. При таком подходе пользователь самостоятельно принимает решения о том, кому можно доверять.

К сожалению, очень немногие понимают, как работает сеть доверия, и ещё меньше людей заботится об этой технологии. И хотя сети доверия остаются важным аспектом спецификации OpenPGP, существующие версии GnuPG (2.2 и выше) реализовали альтернативный подход, представленный механизмом «доверие при первом использовании» (Trust on First Use, TOFU).

TOFU можно сравнить с SSH. Когда вы, используя SSH, в первый раз подключаетесь к удалённой системе, ваша система запоминает отпечаток её ключа. Если ключ изменится, SSH-клиент сообщит вам об этом и отклонит соединение, предлагая вам принять решение о том, доверяете ли вы изменившемуся ключу или нет.

Похожим образом работает и механизм TOFU. Когда вы впервые импортируете чей-то PGP-ключ, он считается достойным доверия. Если после этого GnuPG столкнётся с новым ключом с теми же самыми идентификационными данными, тогда оба ключа будут помечены как недействительные и вам нужно будет самостоятельно принять решение о том, какой из них следует сохранить.

В этом руководстве мы будем использовать модель доверия TOFU.

▍О терминологии


Тут нам хотелось бы отметить важность понимания различий между такими терминами, как PGP, OpenPGP, GnuPG и gpg:

  • PGP (Pretty Good Privacy) — это название коммерческой программы, вышедшей в 1991-м году.
  • OpenPGP — это стандарт IETF, совместимый с PGP.
  • GnuPG (Gnu Privacy Guard) — это бесплатное ПО, которое реализует стандарт OpenPGP.
  • Инструмент командной строки для GnuPG называется gpg.

Сегодня термин PGP почти универсально используется в смысле «стандарт OpenPGP», а не как название программы, и таким образом, PGP и OpenPGP взаимозаменяемы. Термины GnuPG и gpg следует использовать только когда имеются в виду конкретные инструменты, а не стандарты и прочие понятия, которыми мы оперируем. Например:

  • Ключ PGP (не GnuPG или GPG)
  • Подпись PGP (не GnuPG или GPG)
  • Сервер ключей PGP (не GnuPG или GPG)

Понимание этих различий должно помочь вам в общении с другими пользователями PGP.

▍Установка GnuPG


Если вы используете Linux, это значит, что в вашей системе уже установлено ПО GnuPG. На Mac вам надо установить GPG-Suite, или воспользоваться командой brew install gnupg2. Если вы пользователь Windows, то вам подойдёт GPG4Win, и вам, вероятно, потребуется изменить некоторые команды из этого руководства. Если же вы пользуетесь в Windows Unix-подобным окружением, то команды менять не придётся. Если вы пользуетесь какими-то другими платформами, то вам понадобится самостоятельно подобрать подходящую реализацию GnuPG.

▍GnuPG версий 1 и 2


И GnuPG v.1, и GnuPG v.2 реализуют один и тот же стандарт, но они предоставляют несовместимые библиотеки и инструменты командной строки, в результате многие дистрибутивы поставляются и с устаревшей версией 1, и с более новой версией 2. Вам нужно удостовериться в том, что вы всегда пользуетесь GnuPG v.2.

Для начала, для того, чтобы узнать, какая версия GnuPG скрывается в вашей системе под именем gpg, выполните следующую команду:

$ gpg --version | head -n1

Если вы видите нечто вроде gpg (GnuPG) 1.4.x, это значит, что по команде gpg вызывается GnuPG v.1. Попробуйте в таком случае команду gpg2:

$ gpg2 --version | head -n1

Если вы видите что-то вроде gpg (GnuPG) 2.x.x, значит, всё в порядке. Тут мы полагаем, что у вас есть версия GnuPG 2.2 или более поздняя. Если вы используете версию GnuPG 2.0, некоторые из команд, которые будут здесь приведены, работать не будут, поэтому вам стоит рассмотреть возможность установки самой свежей версии 2.2 GnuPG.

▍Псевдоним для GnuPG v.2


Если в вашей системе есть и команда gpg, и команда gpg2, хорошо бы настроить всё так, чтобы по команде gpg вызывалась GnuPG v.2, а не старая версия ПО. Сделать это можно, создав псевдоним:

$ alias gpg=gpg2

Эту команду можно поместить в .bashrc для того, чтобы на команду gpg откликалась программа GnuPG v.2.

Итоги


Здесь мы поговорили об основах PGP, которыми необходимо владеть для успешного применения PGP в деле защиты кода. В следующий раз мы расскажем о создании и защите PGP-ключей.

Уважаемые читатели! Используете ли вы PGP для защиты кода ваших программных проектов?

  • +20
  • 6,6k
  • 5
RUVDS.com
1 423,82
RUVDS – хостинг VDS/VPS серверов
Поделиться публикацией

Комментарии 5

    0
    В обязательном порядке подписываю все свои коммиты и вам советую!
    Настройка git
    Поместите эти строки в .gitconfig и не забудьте переписать всё, что у вас отличается.
    [alias]
    log = log --show-signature
    commit = commit -s -S
    [commit]
    gpgsign = true
    [gpg]
    program = /usr/local/bin/gpg
    [user]
    name = Aleksey Sviridkin
    email = f@lex.la
    signingkey = 9C173EB1B531AA1F

      0

      Отмечу, что на windows это тоже работает.

        0
        Для чего подписывать свои коммиты? Чтобы мошенник не мог сделать коммит от чужого имени? Есть другие причины?
          0
          git не имеет никакой верификации авторства коммита (afaik). В общем случае я хочу быть уверен, что принимаю код от действительно того человека, который заявлен в коммит месседже
        0
        Почему необходима именно GnuPG v.2? Версия gpg (GnuPG) 1.4.x прекрасно работает.

        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

        Самое читаемое