Stapler v0.0.27
Выпущена версия Stapler v0.0.27.
В этом релизе мы сделали упор на повышении безопасности сборок и улучшили сам формат Staplerfile
.
Коротко (tl;dr)
- Улучшена безопасность: строгий режим сборки с
set -euo pipefail
, отказ отsetcap
иbindfs
, возможность использования в контейнерах без--privileged
. - Новые возможности в
Staplerfile
: поддержкаnonfree
для несвободных пакетов,disable_network
для отключения сети, переопределения по версиям дистрибутивов, новый методdirty
для зависимостей. - Контроль поведения: настройки
forbidSkipInChecksums
иforbidBuildCommand
для строгой проверки целостности и ограничения сборки. - Улучшения и исправления: новые хелперы
files-find-*
, исправлены ошибки локализации, улучшены тесты, обновлены зависимости.
Улучшение безопасности
В этом релизе мы сделали большой шаг к тому, чтобы сборка пакетов в Stapler была безопаснее, предсказуемее и менее зависела от привилегий.
Для пользователей это означает:
- 📦 меньше зависимостей (не нужны bindfs, setcap)
- 🛡️ меньше потенциальных уязвимостей, связанных с получением root-доступа
- 🐳 возможность использованиея Stapler в Docker/Podman без
--privileged
Хоть это и потребовало изменения некоторой логики, но все эти изменения не должны сильно повлиять на привычный пользовательский опыт.
Технические детали (для любопытных)
Раньше в stplr
использовались:
-
setcap cap_setuid,cap_setgid+ep
— нужны были для переключения на пользователя при сборке. Это позволяло:- ограничить доступ к
/home
- использовать общий кэш.
Однако наличие исполняемого файла с capability само по себе повышает риски безопасности.
- ограничить доступ к
-
bindfs
— применялся для сборки, когда нужно было “подмонтировать” рабочую директорию и директорию со скриптом (часто лежащим в/home
). Без этого “обхода”stapler-builder
не имел бы доступа к нужным файлам.
Теперь схема изменилась:
-
От
setcap
мы отказались.
При выполнении build теперь не происходит переключения наstapler-builder
.
Вместо этого используется комбинация:- ограничения на уровне user namespace (
CLONE_NEWNS
иmount
), - правила для хендлеров интерпретатора
mvdan.cc/sh
.
При выполнении stplr install (который требует root) происходит переключение на
stapler-builder
и применяются те же правила.Такой подход позволил не только скрывать
/home
во время сборки, но и изолировать от доступа другие важные каталоги самого Stapler. - ограничения на уровне user namespace (
-
Отказ от переменной
$scriptdir
устранил необходимость вbindfs
. Так как все используемые в сборке файлы теперь явно перечислены вStaplerfile
, мы можем просто копировать их — без дополнительных слоёв монтирования.
Итог: меньше зависимостей, меньше точек атаки. А для пользователей это выражается в более безопасной сборке пакетов.
Работа с несвободными пакетами (nonfree=1
)
Некоторые пакеты содержат несвободные компоненты — например, проприетарные драйверы или ПО с ограниченными условиями лицензии.
Чтобы пользователи осознанно устанавливали такой софт, в формате Staplerfile появилась опция nonfree=1
, которая помечает пакет как несвободный и требует явного согласия с лицензией.
Как это работает
- При сборке или установке пакета с
nonfree=1
в интерактивном режиме пользователю показывается предупреждение и текст лицензии. - Чтобы продолжить, нужно явно подтвердить согласие. В случае отказа (
n
,q
илиEsc
) процесс прерывается. - В неинтерактивном режиме (например, CI/CD или автоматическая установка) по умолчанию считается, что пользователь принимает условия.
Для пользователей это значит, что теперь установка несвободного софта стала прозрачнее и безопаснее: всегда понятно, с какими условиями вы соглашаетесь. Для авторов пакетов — это способ явно задокументировать лицензионные ограничения.
Настройки forbidSkipInChecksums
и forbidBuildCommand
Stapler теперь позволяет пользователям жёстко контролировать поведение при установке и сборке пакетов через конфигурацию:
-
forbidSkipInChecksums
— запрещает устанавливать пакеты, если в массиве checksums указан хотя бы один элементSKIP
.Это полезно для тех, кто хочет быть уверен, что все исходники проходят проверку целостности.
-
forbidBuildCommand
— полностью запрещает выполнение командыbuild
.Для большинства пользователей сборка пакетов вручную (вне репозитория) не нужна, поэтому эта опция защищает от случайного запуска сложных или потенциально небезопасных действий.
к сведениюДаже без этой опции команда
build
доступна только пользователям из группы wheel
Эти настройки применяются через конфиг Stapler:
stplr config set forbidSkipInChecksums true
stplr config set forbidBuildCommand true
Изменения в Staplerfile
🚨 Breaking changes
Удаление переменной scriptdir
Раньше в секции sources
нужно было писать так:
sources=(
$scriptdir/file
)
Теперь путь задаётся через local:///file
:
sources=(
local:///file
)
Это изменение позволило упростить работу и отказаться от bindfs.
Сборка стала строже
Теперь сборка выполняется в “строгом” режиме (set -euo pipefail
).
Если раньше скрипт “тихо проглатывал” ошибки, то теперь они будут останавливать сборку.
Это повысит предсказуемость и надёжность пакетов, но может потребовать исправления старых рецептов.
Новые возможности
Переопределения по версии дистрибутива
Теперь в Staplerfile
можно задавать переопределения не только для разных дистрибутивов, но и для их конкретных версий.
Это решает проблему, когда зависимости пакета меняются между мажорными версиями одного дистрибутива. Например, вы можете указать разные зависимости или настройки для Fedora 40 и Fedora 41, обеспечивая большую гибкость и точность при сборке.
Подробнее читайте в документации.
dirty
метод для поиска зависимостей
Появилась возможность выбора метода определения зависимостей с помощью auto_reqprov_method
. Раньше использовался только метод rpm
, который часто требовал установки -devel
пакетов, что не всегда удобно.
Новый метод dirty
решает эту проблему. Он сканирует ELF-файлы (исполняемые файлы и библиотеки) в пакете, определяя зависимости и предоставляемые библиотеки напрямую, без системных утилит RPM.
Метод менее точен, чем rpm
, и может пропустить сложные зависимости, поэтому если нужна максимальная совместимость и более точное определение зависимостей — выбирайте rpm
.
disable_network
disable_network=1
полностью отключает сетевой доступ во время сборки (после получения sources
). Это один из шагов, который может приблизить воспроизводимые сборки с использованием Stapler.
nonfree
-
nonfree=1
— помечает пакет как несвободный. При установке пользователь должен явно согласиться с лицензией. -
nonfree_msg
— можно указать произвольный текст лицензионного соглашения прямо вStaplerfile
:nonfree_msg="This software contains proprietary software from Google. Redistribution and modification may be restricted."
-
nonfree_msgfile
— путь к файлу с текстом соглашения (например,LICENSE.txt
). Имеет приоритет надnonfree_msg
. -
nonfree_url
— ссылка на полный текст лицензии или на репозиторий проекта. Она будет показана внизу экрана подтверждения.nonfree_url="https://www.google.com/intl/ru/chrome/terms/"
Подробнее можно ознакомиться в документации.
Расширение набора files-find-*
В версии Stapler v0.0.27 добавлены новые хелперы для упрощения поиска и обработки файлов в Staplerfile
. Теперь набор files-find-*
включает такие функции, как files-find-binary
, files-find-systemd-user
, files-find-systemd
и другие. Эти хелперы лучше соответствуют функционалу install-*
, что делает настройку сборки более удобной и последовательной.
Подробнее со всеми хелперами можно ознакомиться в документации.
Мелкие исправления
firejail
иrpm-build
добавляются в качестве зависимостей приfirejail=1
иauto_req=1
соответственно.- Исправлены ошибки в локализации, которые нашли пользователи.
- Исправлена работа на ALT Linux при установленном пакете
eepm-apt
(#31). - Добавлена подсказка при просмотре Staplerfile с комбинациями клавиш.
- Удалена незадокументированная команда
gen
. - Улучшены тесты, небольшой рефакториг кода, обновлены зависимости и ряд других мелких исправлений.