Новый формат DEB822 для источников APT

Так уж пошло, что многие привычные вещи воспринимаются нами чем-то незыблемым, а попытка нарушить текущий ход вещей часто воспринимается в штыки. Новый формат источников APT - DEB822 не исключение, он появился начиная с выпуска Debian 13, а пользователи Ubuntu познакомились с ним немного раньше, начиная с Ubuntu 24.04. В данной статье мы подробно разберем новый формат, его основные отличия и преимущества перед привычным старым.

Онлайн-курс по устройству компьютерных сетей
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark. Реклама ИП Скоромнов Д.А. ИНН 331403723315

Основные изменения

Изменения коснулись не только формата, но и расположения файлов источников, если раньше для этого использовался файл /etc/apt/sources.list, то теперь все источники хранятся в директории /etc/apt/sources.list.d в отдельных файлах с расширениями .sources, например, debian.sources.

При этом сам /etc/apt/sources.list сохранен в целях обратной совместимости и содержит единственную запись, что настройки перемещены в файлы .sources. Но вы можете продолжать использовать его и файлы старого формата с расширением .list, они по прежнему поддерживаются, хотя мы рекомендуем придерживаться какого-то одного формата.

Базовые настройки

Если мы откроем список репозиториев Debian в привычном текстовом формате, то увидим примерно следующее:

Формат вроде бы привычен, но вот нагляден ли и удобен? Особенно если отключить подсветку. Тем более, что это еще достаточно лаконичный вид записи, а возьмем, например, такую запись:

1deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] https://nginx.org/packages/mainline/debian bookworm nginx

Попробуй с первого раза разбери это заклинание. А ведь это далеко не все опции, которые могут быть указаны и далеко не все компоненты репозиториев включены.

Поэтому современные дистрибутивы с переходом на APT 3.0 также перешли на новый формат для источников пакетов - DEB822. Почему DEB822? Название происходит от RFC 822, который описывает текстовый формат структуры ключ-значение.

Для примера рассмотрим тот же репозиторий Debian в новой записи:

1# Debian 13
2Types: deb deb-src
3URIs: http://deb.debian.org/debian/
4Suites: trixie
5Components: main contrib non-free non-free-firmware
6Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg

На первый взгляд как-то многовато всего, но на самом деле читать такое описание гораздо легче и гораздо проще изменять его.

Разберем основные опции репозитория, их четыре:

  • Types: - тип репозитория, может принимать два значения: deb и deb-src, бинарные пакеты и исходный код.
  • URIs: адреса репозиториев, поддерживается HTTP(S), FTP и файловая система (для репозиториев на диске или в папке).
  • Suites: выпуск, указываем кодовое имя дистрибутива, для Debian можно также использовать stable, testing и т.д.
  • Components: компоненты репозитория. Тут тоже все понятно.

Сразу обратите внимание, что читать репозитории, даже незнакомые стало легче, вы сразу видите, где выпуск, а где компоненты, что при обычной записи не всегда может быть понятно.

В настоящий момент практически все дистрибутивы отошли от использования apt-key и переходят к персональным подписям. Об этом мы писали в статье:

В данном случае для подписи предназначена отдельная опция Signed-By, сравните это с подписью в строке репозитория NGINX.

Также полезно будет использовать опции:

  • Enabled – по умолчанию имеет значение yes, но вы можете указать явно no чтобы выключить источник, не комментируя и не удаляя строки.
  • Trusted – позволяет сделать источник доверенным (yes), что может пригодиться для собственных локальных репозиториев. Если установить его в значение no, то репозиторий перестанет считаться доверенным, даже если мы успешно проверили его подпись. По умолчанию не задан.
  • Architectures – определят для каких архитектур источника будут загружены индексные файлы, если эта опция явно не указана, то используются все доступные архитектуры. Может быть полезна если вы подключили какой-то специфический источник и вам оттуда нужны только, скажем, i386 пакеты.

Опция X-Repolib-Name используется только графическими инструментами и позволяет указать человекопонятное имя источника.

Настройки безопасности

Это дополнительные настройки, которые не стоит трогать без насущной необходимсоти и основное их предназначение - это защита от атак класса Replay Attacks.

Что это такое? Replay Attacks - это попытка подменить метаданные репозитория, на валидные (т.е. подписанные действующей подписью), но устаревшие, которые содержат уязвимые версии пакетов.

Приняв такие метаданные вы вместо обновления сделаете фактический downgrade и получите уязвимую систему.

Чтобы противодействовать подобному сценарию метаданные имеют срок действия, которые указаны в поле Valid-Until файла Release. Подменить их злоумышленник не может, потому что тогда сломается подпись файла.

Опция Check-Valid-Until как раз позволяет управлять этим поведением, по умолчанию она включена и отдельно указывать ее нет необходимости. Однако вам может потребоваться отключить проверку срока действия репозитория, например, если он устарел и давно не обновляется. В этом случае добавьте в файл репозитория опцию:

1Check-Valid-Until: no

Однако это крайний случай и использовать его нужно только в том случае, если других вариантов нет, хотя в этом случае проще скачать и установить пакеты руками, не подключая репозиторий (все равно он не обновляется).

Гораздо чаще возникают ситуации, когда требуется гибко управлять параметром Valid-Until, например, для локального зеркала.

Простой пример, репозиторий указал Valid-Until: +1 day, но наше зеркало синхронизируется раз в три дня и пользователи уже через сутки начнут получать сообщение:

1Release file expired

Чтобы избежать такого поведения добавим в файл репозитория опцию Valid-Until-Min:

1Valid-Until-Min: 259200

Которая увеличивает время жизни метаданных репозитория до указанного значения в секундах.

Другая ситуация: репозиторий указал слишком большой срок действия метаданных или не указал его вообще. В таком случае мы можем огранчить их до разумного предела опцией Valid-Until-Max:

1Valid-Until-Max: 604800

Здесь принцип тот же, уменьшаем срок действия метаданных до указанного значения в секундах.

Используя эти опции следует понимать, что они не переопределяют срок действия метаданных репозитория, а изменяют только выходящие за порог значения.

Так, если мы указали минимальный срок 3 суток, а репозиторий отдает 5 суток - то ничего не изменится. Равно как этот срок действия не увеличится, если мы указали максимальный срок как неделю.

Они работают только если значение меньше минимального - тогда оно будет переопределено минимальным, или выше максимального - тогда оно будет переопределено максимальным.

inline-ключ подписи

Классическая схема предусматривает, что мы отдельно скачиваем ключ и указываем его в настройках репозитория, но такой подход может быть не всегда удобен, например, в сценариях автоматического развертывания или просто хотите облегчить себе жизнь.

DEB822 дает возможность сразу включить ключ в файл .sources, что избавить вас от необходимости скачивать его каждый раз при подключении репозитория.

Однако просто скопировать текстовое содержимое ключа не получится, формат DEB822 требует, чтобы многострочный текст (блок ключа) был смещен вправо (имел отступ). Кроме того, ключи обычно распространяются в бинарном формате.

Поэтому рассмотрим, как это правильно сделать на примере репозитория Angie, прежде всего скачаем бинарный ключ .gpg и преобразуем его в текстовый формат .asc:

1curl -fsSL https://angie.software/keys/angie-signing.gpg -o /tmp/angie.gpg
2gpg --batch --yes --output /tmp/angie.asc --armor --dearmor /tmp/angie.gpg

Теперь создадим сам файл .sources командой cat:

1cat <<EOF > /etc/apt/sources.list.d/angie.sources
2Types: deb
3URIs: https://download.angie.software/angie/
4Suites: $(. /etc/os-release && echo "$ID/$VERSION_ID")
5Components: main
6
7Signed-By:
8$(sed 's/^/ /' /tmp/angie.asc)
9EOF

Вся "магия" здесь происходит в строке:

1$(sed 's/^/ /' /tmp/angie.asc)

Которая ставит в начало каждой строки ключа пробел, вы также можете встретиться с конструкциями, которые вставляют два или четыре пробела. Это тоже правильно, стандарт не регламентирует размер отступа, а для работающих с Python или YAML два или четыре пробела выглядят привычнее.

Преобразование форматов

И наконец, как преобразовать файлы источников старого формата в новый. Для этого воспользуйтесь командой:

1apt modernize-sources

Она изучит ваш /etc/apt/sources.list, а также все файлы .list в /etc/apt/sources.list.d и преобразует их в файлы .sources.

Перед этим она выведет отчет о найденных источниках и попросит подтверждения.

В результате указанные источники будут преобразованы, а старые файлы репозиториев, включая /etc/apt/sources.list будут сохранены с расширением .bak и больше использоваться не будут. Но вы всегда можете вернуться к ним, если что-то пошло не так.

Онлайн-курс по устройству компьютерных сетей
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark. Реклама ИП Скоромнов Д.А. ИНН 331403723315

Помогла статья? Поддержи автора и новые статьи будут выходить чаще:

Поддержи проект!

Или подпишись на наш Телеграм-канал: Подпишись на наш Telegram-канал