Випуск системного менеджера 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, що спрощує надання облікових даних віртуальним машинам і дозволяє обійтися без сторонніх інструментів, таких як -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=» для прискорення налаштування через DHCP 6). У параметрі "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 v2 сервісів, пов'язаних з cgroup v1. Ключовою відмінністю cgroups v2 від v1 є застосування загальної ієрархії cgroups для всіх видів ресурсів замість роздільних ієрархій для розподілу ресурсів CPU, для регулювання споживання пам'яті і для введення/виведення. Роздільні ієрархії призводять до труднощів організації взаємодії між обробниками і додатковим витратам ресурсів ядра при застосуванні правил процесу, згадуваного різних ієрархіях.
  • У другій половині 2023 року планується припинити підтримку окремих ієрархій каталогів, коли /usr монтується окремо від кореня або розділені каталоги /bin та /usr/bin, /lib та /usr/lib.

Джерело: opennet.ru

Додати коментар або відгук