Подписываем свою работу. Аутентичность и целостность информационных систем

Эта статья написана разработчиком для разъяснения базовых принципов обеспечения аутентичности и целостности разрабатываемых информационных систем и может быть полезна как разработчикам, так и менеджерам. В статье не рассматриваются вопросы качества кода и безопасности конкретных реализаций OpenPGP.
Зачем разработчику подписывать то что он делает?
Разработка – это всегда ответственность. Информационная система должна выполнять полезную работу. Функциональное состояние системы можно изменить внеся в нее новый код. Условно разделим новый код на:
- Внешний. Код созданный третьими лицами. Это может быть новая библиотека которую мы добавили в зависимости, или же инструмент, который мы устанавливаем в ОС в виде пакета и используем в рантайме.
- Внутренний. Код, который, собственно, создает наша команда для решения бизнес-задач.
В обоих случая критически важно быть уверенными в источнике внесенного кода.
Внешние зависимости
Когда мы используем стороннюю зависимость в своих проектах или, например, устанавливаем пакет программного обеспечения, нам важно знать, что мы получим именно то, что запросили, и именно от тех, кому доверяем.
В мире открытого ПО для решения этой проблемы используются механизмы, позволяющие подписывать файлы и коммиты. Основным инструментом является PGP.
Дистрибутивы Linux подписывают пакеты для того, чтобы гарантировать неизменность от момента создания до момента развертывания пакета на машине конечного пользователя. А проекты при внесении сторонних зависимостей в кодовую базу проверяют PGP подписи источника этой зависимости.
На платформах с закрытым исходным кодом используются сертификаты разработчиков и источников, но базовые идеи совпадают с механизмами, используемыми в проектах с открытым исходным кодом.
Внутренний код
Право вносить изменения, порождает ответственность за работоспособность всей системы после применения правок. Следовательно, команде важно быть уверенными в происхождение кода, а разработчику – иметь возможность сказать, что это именно его работа.
Обычно проблему авторства кода рассматривают на примере открытых сообществ, где возможны различные межличностные сценарии и фейковые коммиты. Стандартные механизмы git не позволяют быть уверенным в авторстве кода. Можно указать абсолютно любые данные при настройке git:
$ git config user.name 'You Name'
$ git config user.email 'your@email.com'
и отправить правки в репозиторий в который у вас есть доступ.
Но и в распределенных командах подобное возможно. Подпись 100% решает эти вопросы.
Настройка PGP в Linux окружении
Для работы нам понадобится GnuPG версии >=2.2. Проверить версию можно с помощью команды
$ gpg --version | head -n1
Для того чтобы посмотреть список ключей на машине, используем
$ gpg --list-keys
Итак, приступим. Создадим новый ключ, не забывая указать для него пароль:
$ gpg --gen-key
Чтобы не потерять доступ к ключу, экспортируем его и отправим на хранение в надежное место:
$ gpg --export-secret-keys 64F222F157991AA2B5E21375FD02082A69A0ED61 > ~/key.gpg.asc
64F222F157991AA2B5E21375FD02082A69A0ED61 – взят просто для примера.
После этого необходимо настроить git:
- Указываем, что все коммиты необходимо подписывать:
$ git config --global commit.gpgsign true - Настраиваем ключ для подписи:
$ git config --global user.signingkey 64F222F157991AA2B5E21375FD02082A69A0ED61
С настройкой машины разработчика мы закончили. Теперь необходимо настроить git-хостинг, на котором размещен репозиторий. PGP поддерживается большинством git-хостингов, например, Github добавил поддержку в апреле 2016 года. Self-hosted решения, такие как Gitlab или gitea, тоже поддерживают его.
Экспортируем публичный ключ с помощью команды:
$ gpg --armor --export 64F222F157991AA2B5E21375FD02082A69A0ED61
Копируем полностью публичный ключ и привязываем его к своему аккаунту. В Github это можно сделать на странице https://github.com/settings/keys
После включения подписей, коммиты будут выглядеть следующим образом:
Аналогично и для gitea:
Согласование и принятие административного решения об использовании OpenPGP для решения проблем целостности проекта может занять какое-то время. Настройка PGP для GIT занимает не более пары минут. Потраченное время окупится повышением надежности процесса разработки.
А вы практикуете подписывание результатов своей работы?
Блог Vonmo