Песочница¶
zoryn запускает скрипты из .gear/up.d/ и .gear/merge-up.d/ в песочнице для защиты чувствительных файлов (~/.ssh, ~/.gnupg, ~/.config) от ненадёжных скриптов из репозитория.
Установка¶
Bubblewrap для лёгкой изоляции:
Для гибридного режима (bwrap + chroot hasher с зависимостями сборки):
Режимы запуска¶
| Режим | Описание |
|---|---|
hybrid | bwrap + chroot hasher — использует зависимости сборки пакета (по умолчанию, если установлены оба инструмента) |
bwrap | Только bubblewrap — лёгкая изоляция через namespaces, использует системные пути хоста |
direct | Без изоляции — полный доступ к файловой системе (не рекомендуется) |
Режим определяется автоматически: hybrid, если доступны bwrap и hsh; bwrap, если только bwrap; иначе direct.
Если настроенный режим недоступен, zoryn запросит подтверждение перед запуском хуков без изоляции. В неинтерактивном режиме выполнение отклоняется. Используйте --no-sandbox для пропуска подтверждения и запуска без песочницы.
Что общее у всех режимов с изоляцией¶
Для hybrid и bwrap (то есть всего, кроме direct):
| Аспект | Поведение |
|---|---|
| Каталог проекта | Корень git примонтирован на чтение и запись по тому же пути. Хук видит репозиторий и может его менять. |
| Рабочий каталог | Перед exec делается chdir в корень git. |
Домашний каталог ($HOME) | Подменяется на пустой tmpfs. ~/.ssh, ~/.gnupg, ~/.config, файлы истории, сокеты агентов — ничего из этого не видно. |
~/.gitconfig | Если существует, монтируется только на чтение, чтобы git внутри хука знал вашу личность. |
| Окружение | Полностью очищается через --clearenv. Заново подкидываются только PATH, HOME и TAG/COMMIT/SHORTCOMMIT (для merge-хуков). |
PATH | По умолчанию /usr/bin:/bin (настраивается через [sandbox] path = "…"). |
/proc | Монтируется свежий procfs. |
/dev | Bind-mount с хоста (--dev-bind /dev /dev) с полным доступом к устройствам. |
| Пространства процесса | --unshare-all — новые PID-, IPC-, UTS-, cgroup-namespaces. |
| Сеть | Разрешена (--share-net). Хуки могут вызывать curl, go mod download, cargo fetch и т. п. |
| Время жизни | --die-with-parent — песочница умирает вместе с zoryn. |
Различие режимов — откуда берутся /usr, /lib, /bin, /sbin, /etc:
bwrap¶
Системные каталоги (/usr, /lib, /lib64, /etc, /bin, /sbin) bind-mount'ятся только на чтение с хоста. Хук видит ровно те инструменты, которые установлены в вашей системе.
- Плюсы: нулевые накладные расходы — bwrap стартует мгновенно (chroot готовить не нужно).
- Минусы: BuildRequires из spec не гарантированно присутствует; версии библиотек — те, что стоят на хосте.
Подходит для хуков, которым ничего сверх системного не нужно (типичные склейки на sed/awk).
hybrid¶
Сначала hsh готовит hasher-chroot со сборочными зависимостями пакета (из BuildRequires:), затем bwrap запускается с /usr, /lib, /lib64, /etc, /bin, /sbin, /var из этого chroot, а не с хоста (поверх /var монтируется writable tmpfs /var/tmp для временных файлов). Каталог проекта, /proc, /dev, сеть и изоляция домашнего каталога — те же, что в bwrap.
/etc/resolv.conf берётся с хоста, чтобы DNS работал и внутри chroot'а.
- Плюсы: хук видит ровно тот toolchain, которым будет собираться пакет — воспроизводимо между машинами.
- Минусы: первый запуск платит за подготовку chroot (секунды — минута; дальше кэшируется в
~/hasher).
Подходит для хуков, которым нужны сборочные инструменты (go mod vendor, cargo vendor, meson subprojects download и т. п.).
Дополнительные пакеты сверх BuildRequires: можно перечислить в .gear/version-up:
Они ставятся через hsh-install после подготовки chroot.
Чтобы полностью пропустить BuildRequires: пакета, задайте specbr = false. Тогда chroot инициализируется «голым» (hsh --initroot-only, без сборки src.rpm) — ставятся только явно заданные пакеты (git, а также [sandbox.chroot] packages из ~/.zoryn и перечисленные выше packages), но не сборочные зависимости из spec. Удобно, когда эти зависимости хукам не нужны, а сборка src.rpm лишь тратит время:
По умолчанию specbr = true (собрать src.rpm и использовать его BuildRequires:). При specbr = false пользовательская команда [sandbox.chroot] prepare (из ~/.zoryn) игнорируется в пользу «голой» инициализации — zoryn выводит предупреждение.
direct¶
Никакой изоляции. Скрипт-хук выполняется в окружении текущего процесса с полным доступом к файловой системе, ~/.ssh, сети, переменным окружения и т. д. Эквивалент запуска хука руками.
Использовать только если вы проверили хуки и доверяете репозиторию.
Конфигурация¶
В ~/.zoryn:
[sandbox]
runner = "hybrid"
path = "/usr/bin:/bin"
[sandbox.chroot]
prepare = "gear-hsh --commit -- --mountpoints=/proc,/dev/pts,/dev/kvm --lazy-cleanup --build-srpm-only"
[sandbox.hasher]
workdir = "~/hasher"
Для отдельного проекта (~/.config/zoryn/projects.d/<project>.toml):
[sandbox]
runner = "hybrid"
[sandbox.chroot]
prepare = "gear-hsh --commit -- --mountpoints=/proc,/dev/pts,/dev/kvm --lazy-cleanup --build-srpm-only"
Дополнительные пакеты¶
В .gear/version-up:
Пакет git ставится всегда. Пакеты из этой секции ставятся после подготовки chroot через hsh-install, поверх BuildRequires: из spec. Добавьте specbr = false, чтобы пропустить эти BuildRequires: и сборку src.rpm (см. hybrid выше).
Флаги CLI¶
zoryn up --sandbox=hybrid # использовать hybrid (по умолчанию)
zoryn up --sandbox=bwrap # bubblewrap с путями хоста
zoryn up --no-sandbox # полностью отключить песочницу
Как работает hybrid¶
В режиме hybrid hasher готовит chroot со сборочными зависимостями пакета (из spec-файла), а bwrap запускает скрипты, используя пути из этого chroot. Это даёт и изоляцию файловой системы, и доступ к нужным инструментам без setuid-привилегий во время выполнения.