Выпуск системного менеджера systemd 252 с поддержкой UKI (Unified Kernel Image)
После пяти месяцев разработки представлен релиз системного менеджера systemd 252. Ключевым изменением в новой версии стала интеграция поддержки модернизированного процесса загрузки, позволяющего верифицировать по цифровым подписям не только ядро и загрузчик, но и компоненты базового системного окружения.
Предложенный метод подразумевает использование при загрузке унифицированного образа ядра UKI (Unified Kernel Image), объединяющего обработчик для загрузки ядра из UEFI (UEFI boot stub), образ ядра Linux и загружаемое в память системное окружение initrd, применяемое для начальной инициализации на стадии до монтирования корневой ФС. UKI-образ оформляется в виде одного исполняемого файла в формате PE, который может быть загружен при помощи традиционных загрузчиков или напрямую вызван из прошивки UEFI. При вызове из UEFI предоставляется возможность проверки целостности и достоверности по цифровой подписи не только ядра, но и содержимого initrd.
Для расчёта параметров регистров TPM PCR (Trusted Platform Module Platform Configuration Register), используемых для контроля целостности и формирования цифровой подписи образа UKI, в состав включена новая утилита systemd-measure. Используемый в подписи открытый ключ и сопутствующая информация о PCR может быть встроена непосредственно в загрузочный образ UKI (ключ и подпись сохраняются в в файле в формате PE в полях '.pcrsig' и '.pcrkey') и извлечена из него внешними или внутренними утилитами.
В том числе для использования данной информации адаптированы утилиты systemd-cryptsetup, systemd-cryptenroll и systemd-creds, при помощи которых можно обеспечить привязку зашифрованных дисковых разделов к заверенному цифровой подписью ядру (в этом случае доступ к зашифрованному разделу предоставляется только если образ UKI прошёл верификацию по цифровой подписи на основе параметров, размещённых в TPM).
Дополнительно в состав включена утилита systemd-pcrphase, позволяющая управлять привязкой различных стадий загрузки к параметрам, размещаемым в памяти криптопроцессоров, поддерживающих спецификацию TPM 2.0 (например, можно сделать ключ расшифровки раздела LUKS2 доступным только в образе initrd и блокировать доступ к нему на более поздних этапах загрузки).
Некоторые другие изменения:
- Обеспечено использование по умолчанию локали C.UTF-8, если в настройках не определена иная локаль.
Реализована возможность выполнения операции полной преднастройки сервисов («systemctl preset») во время первой загрузки. Для включения преднастройки во время загрузки требуется сборка с опцией »-Dfirst-boot-full-preset», но в будущих выпусках её планируют активировать по умолчанию.
- В unit-ах управления пользователями задействован контроллер ресурсов CPU, что позволило обеспечить применение настроек CPUWeight ко всем slice-юнитам, используемым для разбиения системы на части (app.slice, background.slice, session.slice) для изоляции ресурсов между различными пользовательскими сервисами, конкурирующими за ресурсы CPU. В СPUWeight также реализована поддержка значения «idle» для активации соответствующего режима предоставления ресурсов.
- Для временных («transient») unit-ов и утилиты systemd-repart разрешено переопределение настроек через создание drop-in файлов в каталоге /etc/systemd/system/имя.d/.
- Для системных образов обеспечено выставление флага прекращения поддержки ('support-ended'), определяя данный факт на основании значения параметра «SUPPORT_END=» в файле /etc/os-release.
- Добавлены настройки «ConditionCredential=» и «AssertCredential=», которые можно использовать для игнорирования или аварийного завершения юнитов при отсутствии в системе определённых учётных данных.
- В system.conf и user.conf добавлены настройки «DefaultSmackProcessLabel=» и «DefaultDeviceTimeoutSec=» для определения применяемых по умолчанию уровня безопасности SMACK и таймаута активации юнита.
- В настройках «ConditionFirmware=» и «AssertFirmware=» добавлена возможность указания отдельных полей SMBIOS, например для запуска юнита только в случае когда поле /sys/class/dmi/id/board_name содержит «Custom Board», можно указать «ConditionFirmware=smbios-field (board_name = «Custom Board»)».
В процессе инициализации (PID 1) добавлена возможность импорта учётных данных из полей SMBIOS (Type 11, «OEM vendor strings») в дополнение к их определению через qemu_fwcfg, что упрощает предоставление учётных данных виртуальным машинам и позволяет обойтись без сторонних инструментов, таких как cloud-init/ignition.
- Во время завершения работы изменена логика отмонтирования виртуальных ФС (proc, sys) и обеспечено сохранения в логе сведений о процессах, блокирующих отмонтирование файловых систем.
В фильтре системных вызовов (SystemCallFilter) разрешён по умолчанию доступ к системному вызову riscv_flush_icache.
В загрузчике sd-boot добавлена возможность загрузки в смешанном режиме, в котором 64-разрядное ядро Linux запускается из 32-разрядной прошивки UEFI. Добавлена экспериментальная возможность автоматического применения ключей SecureBoot из файлов, найденных в ESP (EFI system partition).
В утилиту bootctl добавлены новые опции »--all-architectures» для установки бинарных файлов для всех поддерживаемых архитектур EFI,»--root=» и »--image=» для работы с каталогом или дисковым образом,»--install-source=» для определения источника для установки,»--efi-boot-option-description=» для управления именами загрузочных записей.
В утилиту systemctl добавлена команда 'list-automounts' для показа списка автоматически примонтированных каталогов и опция »--image=» для выполнения команд в привязке к указанному дисковому образу. В команды 'show' и 'status' добавлены опции »--state=» и »--type=».
В systemd-networkd добавлены опции «TCPCongestionControlAlgorithm=» для выбора алгоритма управления перегрузкой TCP, «KeepFileDescriptor=» для сохранения файлового дескриптора интерфейсов TUN/TAP, «NetLabel=» для установки меток NetLabel, «RapidCommit=» для ускорения настройки через DHCPv6 (RFC 3315). В параметре «RouteTable=» разрешено указание имён таблиц маршрутизации.
В systemd-nspawn разрешено использование относительных файловых путей в опциях »--bind=» и »--overlay=». В опцию »--bind=» добавлена поддержка параметра 'rootidmap' для привязки идентификатора пользователя root в контейнере к владельцу примонтированного каталога на стороне хост-системы.
В systemd-resolved в качестве бэкенда для шифрования по умолчанию задействован пакет OpenSSL (поддержка gnutls сохранена в качестве опции). Неподдерживаемые алгоритмы DNSSEC теперь обрабатываются как небезопасные, вместо возвращения ошибки (SERVFAIL).
В systemd-sysusers, systemd-tmpfiles и systemd-sysctl реализована возможность передачи настроек через механизм хранения учётных данных.
В утилиту systemd-analyze добавлена команда 'compare-versions' для сравнения строк с номерами версий (по аналогии с 'rpmdev-vercmp' и 'dpkg --compare-versions'). В команду 'systemd-analyze dump' добавлена возможность фильтрации юнитов по маске.
При выборе многоэтапного режима сна (suspend-then-hibernate, переход в спящий режим после ждущего режима), время нахождения в ждущем режиме теперь выбирается на основании прогноза оставшегося времени автономной работы. Мгновенный переход в спящий режим производится когда остаётся менее 5% заряда аккумулятора.
В 'journalctl' добавлен новый режим вывода »-o short-delta», отображающий разницу во времени между разными сообщениями в логе.
В systemd-repart добавлена поддержка создания разделов с ФС Squashfs и разделов для dm-verity, в том числе с цифровыми подписями.
В systemd-logind добавлена настройка «StopIdleSessionSec=» для завершения неактивного сеанса после истечения заданного таймаута.
- В systemd-cryptenroll добавлена опция »--unlock-key-file=» для извлечения ключа расшифровки из файла, а не через вывод запроса пользователю.
Обеспечена возможность выполнения утилиты systemd-growfs в окружениях без udev.
В systemd-backlight улучшена поддержка систем с несколькими графическими картами.
Лицензия на приводимые в документации примеры кода изменена с CC0 на MIT-0.
Изменения нарушающие совместимость:
При проверке номера версии ядра при помощи директивы ConditionKernelVersion в операторах '=' и '!=' теперь применяется простое строковое сравнение, а если оператор сравнения вообще не указан может применяться сопоставление по glob-маске с использованием символов '*', '?' и '[', ']'. Для сравнения версий в стиле функции stverscmp () следует использовать операторы '‹', '›', '‹=' и '›='.
Метка SELinux, применяемая для проверки доступа из unit-файла, теперь читается на этапе загрузки файла, а не в момент проверки доступа.
Условие «ConditionFirstBoot» теперь срабатывает при первой загрузке системы только непосредственно на стадии загрузки и возвращает «false» при вызове юнитов после завершения загрузки.
В 2024 году в systemd планируется прекратить поддержку механизма ограничения ресурсов cgroup v1, переведённого в разряд устаревших в выпуске systemd 248. Администраторам рекомендуется заранее позаботиться о переводе завязанных на cgroup v1 сервисов на cgroup v2. Ключевым отличием cgroups v2 от v1 является применение общей иерархии cgroups для всех видов ресурсов, вместо раздельных иерархий для распределения ресурсов CPU, для регулирования потребления памяти и для ввода/вывода. Раздельные иерархии приводят к трудностям организации взаимодействия между обработчиками и к дополнительным затратам ресурсов ядра при применении правил для процесса, упоминаемого в разных иерархиях.
Во второй половине 2023 года планируется прекратить поддержку раздельных иерархий каталогов, когда /usr монтируется отдельно от корня или разделены каталоги /bin и /usr/bin, /lib и /usr/lib.
Источник: http://www.opennet.ru/opennews/art.shtml? num=58019
© OpenNet