trdl (сокр. от “true delivery”, «истинная доставка») обеспечивает безопасный канал доставки обновлений от Git-репозитория до хоста пользователя. В состав trdl входят три ключевых компонента, которые помогают защищать систему обновления от потенциальных атак: HashiCorp Vault, TUF-репозиторий и Git.
Расскажем, как работает решение, от каких минусов существующих систем обновления избавлено и как начать им пользоваться.
Особенности trdl
Vault, TUF и Git — основа безопасности. trdl предотвращает потенциальные атаки на систему обновления и минимизирует ущерб от них. Это реализовано с помощью трех компонентов, которые работают в связке:
HashiCorp Vault — платформа для запуска trdl-сервера. Обеспечивает безопасное управление ключами шифрования.
Репозиторий на основе TUF (The Update Framework), из которого скачиваются обновления. Защищает от несанкционированного доступа к ПО, от компрометации и потери ключей. Отвечает за актуальность, согласованность и целостность данных. (Подробнее о TUF — в нашем обзоре.)
Git — хранит код, конфигурацию, а также GPG-подписи коммитов для верификации операций.
Вместо версий софта — каналы обновлений. Пользователь выбирает канал обновления с нужным уровнем совместимости и стабильности: alpha, beta, early access, stable, rock solid. Через эти каналы разработчики распространяют новые версии ПО — так часто, как им требуется.
GPG-кворум. Каждый коммит в Git подписывается «M из N» количеством разработчиков с помощью GPG-подписей. Кворум используется и для релиза новых версий ПО (тегов), и для публикации каналов обновления.
Универсальность. trdl — кроссплатформенная утилита, которая одинаково хорошо работает во всех популярных shell-оболочках на macOS, Windows и Linux.
Простота. Команде разработки не требуются дополнительные знания и инструменты — Git выступает в качестве главного «источника правды». Конфигурация сборки, каналы обновлений и GPG-подписи для верификации операций хранятся в Git. Пользователям же достаточно установить trdl-клиент, чтобы обновлять и использовать ПО.
Непрерывные обновления. Обновлять и использовать ПО можно безостановочно. Команда trdl use
учитывает специфику запуска в CI-системе: обновление запускается в фоне, а пользователь работает с существующей версией ПО до завершения shell-сессии (скоро появятся и другие сценарии и команды).
Зачем нам свой «менеджер пакетов»
Мы разрабатываем продукты, которые нужно непрерывно и безопасно обновлять. Однако у существующих методов и систем обновления есть критичные для production недостатки.
Ограниченность алгоритмов защиты. HTTPS, SSL, TLS защищают только соединение, но не содержимое того, что скачивается из репозитория. PGP-алгоритм уязвим перед многими современными атаками на сам процесс обновления. GPG-подписи не защищают, например, от взлома ноутбука. Для действительно надежной защиты процесса обновления нужно выстроить систему «приемки кода» и подписи собранных файлов, которая должна быть защищена от человеческих ошибок. Существующие средства и алгоритмы эффективны сами по себе, но их недостаточно для выстраивания полноценной системы обновления.
Ограниченность непрерывной доставки. Непрерывная доставка с помощью CI/CD-систем хорошо подходит для SaaS-продуктов, но не для доставки целевых файлов на хосты пользователей.
Ограниченность пакетных менеджеров. Большинство пакетных менеджеров не универсальны. Для каждой платформы нужен свой менеджер. Уровень их автоматизации при этом стремится к нулю: пользователь сам должен добавлять источник для скачивания пакетов, искать пакет, устанавливать его, обновлять, удалять.
Поэтому мы решили разработать собственную систему обновления, которая была бы избавлена от перечисленных минусов.
Как работает trdl (на простом примере)
Структурно trdl представляет собой клиент-серверное приложение. trdl-сервер отвечает за безопасное наполнение и организацию TUF-репозитория, trdl-клиент — за надежную и непрерывную доставку обновлений, а также за использование ПО. Под обновлением подразумевается произвольный набор файлов для всех поддерживаемых платформ: бинарные файлы, shell-скрипты, Ansible-плейбуки и так далее.
Процесс обновления включает три основных этапа:
Релиз новой версии ПО.
Публикация каналов обновлений (переключение новой версии в канале/каналах обновлений).
Скачивание релиза через канал обновлений.
Рассмотрим подробно первые два этапа.
Релиз новой версии ПО
В начале разработчик создает Git-тег с новой версией ПО (на картинке ниже — v1.0.1) и подписывает его своей GPG-подписью. Когда кворум проекта «дает добро», тег поступает в trdl-сервер. Если Git-тег содержит минимальный набор разрешённых GPG-подписей, инициируется сборка. Результат сборки вместе с метаданными загружаются в TUF-репозиторий. Но при этом клиент продолжает работать со старой версией ПО — v1.0.0.
Здесь:
GPG-1-3 — подписи, которые создаются командой разработки.
vault-plugin-secrets-trdl — плагин Vault, который проверяет наличие обязательных Git-подписей и инициирует сборку.
Artifact — результат сборки (бинарные файлы, скрипты или пакеты).
Release channel — канал обновления.
trdl-клиент — программа-клиент, которая установлена на сервер (VM) или ноутбук пользователя.
Публикация каналов обновлений
Разработчик изменяет конфигурацию каналов обновлений в Git и делает коммит со своей GPG-подписью. После одобрения кворумом коммит поступает в плагин Vault. Плагин проверяет, содержит ли коммит минимальный набор разрешённых GPG-подписей; если да — подписывает обновленный список каналов и связанных с ними релизов. Обновленные каналы вместе с метаданными загружаются в TUF-репозиторий. Пользователи начинают получать обновления в соответствии с новой конфигурацией каналов обновлений.
Готовность trdl к production
Мы уже используем trdl для непрерывной доставки нашего CI/CD-инструмента werf на CI-раннеры и пользовательские хосты. У команды разработки werf появился удобный и безопасный процесс доставки, а у пользователей — простой клиент для надежной работы с актуальными версиями утилиты.
Как пользоваться trdl
В разделе «Быстрый старт» рассказано, как установить и настроить ключевые элементы системы. Есть базовые сценарии для администратора, разработчика и пользователя.
В «Справочнике» — команды trdl-клиента, API trdl-сервера, а также конфигурация сборки и каналов обновления с примерами.
Подробно о том, как устроена система защиты trdl, от чего она защищает, а от чего — нет, объясняется в разделе «Безопасность».
P.S.
trdl — Open Source-проект, который активно развивается. Мы приглашаем поучаствовать в его развитии всех заинтересованных пользователей. Присылайте свои предложения, замечания, PR’ы.
И, конечно, мы будем признательны за звездочки на GitHub ;)
P.P.S.
Читайте также в нашем блоге: