trdl (сокр. от “true delivery”, «истинная доставка») обеспечивает безопасный канал доставки обновлений от Git-репозитория до хоста пользователя. В состав trdl входят три ключевых компонента, которые помогают защищать систему обновления от потенциальных атак: HashiCorp Vault, TUF-репозиторий и Git.

Расскажем, как работает решение, от каких минусов существующих систем обновления избавлено и как начать им пользоваться.

Особенности trdl

Vault, TUF и Git — основа безопасности. trdl предотвращает потенциальные атаки на систему обновления и минимизирует ущерб от них. Это реализовано с помощью трех компонентов, которые работают в связке:

  1. HashiCorp Vault — платформа для запуска trdl-сервера. Обеспечивает безопасное управление ключами шифрования.

  2. Репозиторий на основе TUF (The Update Framework), из которого скачиваются обновления. Защищает от несанкционированного доступа к ПО, от компрометации и потери ключей. Отвечает за актуальность, согласованность и целостность данных. (Подробнее о TUF — в нашем обзоре.)

  3. Git — хранит код, конфигурацию, а также GPG-подписи коммитов для верификации операций.

Упрощенная архитектура trdl
Упрощенная архитектура trdl

Вместо версий софта — каналы обновлений. Пользователь выбирает канал обновления с нужным уровнем совместимости и стабильности: 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-плейбуки и так далее.

Процесс обновления включает три основных этапа: 

  1. Релиз новой версии ПО.

  2. Публикация каналов обновлений (переключение новой версии в канале/каналах обновлений).

  3. Скачивание релиза через канал обновлений.

Рассмотрим подробно первые два этапа.

Релиз новой версии ПО

В начале разработчик создает Git-тег с новой версией ПО (на картинке ниже — v1.0.1) и подписывает его своей GPG-подписью. Когда кворум проекта «дает добро», тег поступает в trdl-сервер. Если Git-тег содержит минимальный набор разрешённых GPG-подписей, инициируется сборка. Результат сборки вместе с метаданными загружаются в TUF-репозиторий. Но при этом клиент продолжает работать со старой версией ПО — v1.0.0.

Этап 1. Релиз новой версии ПО (Artifact v1.0.1)
Этап 1. Релиз новой версии ПО (Artifact v1.0.1)

Здесь:

  • GPG-1-3 — подписи, которые создаются командой разработки.

  • vault-plugin-secrets-trdl — плагин Vault, который проверяет наличие обязательных Git-подписей и инициирует сборку.

  • Artifact —  результат сборки (бинарные файлы, скрипты или пакеты).

  • Release channel — канал обновления.

  • trdl-клиент — программа-клиент, которая установлена на сервер (VM) или ноутбук пользователя.

Публикация каналов обновлений

Разработчик изменяет конфигурацию каналов обновлений в Git и делает коммит со своей GPG-подписью. После одобрения кворумом коммит поступает в плагин Vault. Плагин проверяет, содержит ли коммит минимальный набор разрешённых GPG-подписей; если да — подписывает обновленный список каналов и связанных с ними релизов. Обновленные каналы вместе с метаданными загружаются в TUF-репозиторий. Пользователи начинают получать обновления в соответствии с новой конфигурацией каналов обновлений.

Этап 2. Публикация канала (Alpha — v1.0.1)
Этап 2. Публикация канала (Alpha — v1.0.1)

Готовность trdl к production

Мы уже используем trdl для непрерывной доставки нашего CI/CD-инструмента werf на CI-раннеры и пользовательские хосты. У команды разработки werf появился удобный и безопасный процесс доставки, а у пользователей — простой клиент для надежной работы с актуальными версиями утилиты.

Как пользоваться trdl

В разделе «Быстрый старт» рассказано, как установить и настроить ключевые элементы системы. Есть базовые сценарии для администратора, разработчика и пользователя.

В «Справочнике» — команды trdl-клиента, API trdl-сервера, а также конфигурация сборки и каналов обновления с примерами.

Подробно о том, как устроена система защиты trdl, от чего она защищает, а от чего — нет, объясняется в разделе «Безопасность».

P.S.

trdl — Open Source-проект, который активно развивается. Мы приглашаем поучаствовать в его развитии всех заинтересованных пользователей. Присылайте свои предложения, замечания, PR’ы. 

И, конечно, мы будем признательны за звездочки на GitHub ;)

P.P.S.

Читайте также в нашем блоге: