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.
Читайте также в нашем блоге:
