Динамическое исправление (Live Patching)

Динамическое исправление ядра Linux: зачем и как работает

Динамическое исправление (Live Patching) позволяет обновлять ядро Linux без перезагрузки системы. Это важно для высоконагруженных сред, где простои недопустимы. Традиционный метод требует перезагрузки, что, как правило, приводит к простоям и риску сбоя в работе приложений.

Как это работает?

  1. Обнаружение уязвимости: разработчики выпускают патч для исправления ошибки.

  2. Загрузка патча: патч загружается в ядро как модуль.

  3. Перехват функций: для перехвата вызовов функций используются Kprobes и Ftrace.

  4. Замена функций: старая функция заменяется на исправленную версию.

  5. Очистка: старый код удаляется из памяти.

Преимущества динамического исправления (Live Patching):

  1. Снижение времени простоя: обновиться можно без перезагрузки, что особенно важно для сервисов с высоким SLA (Соглашение об уровне обслуживания).

  2. Повышение безопасности: быстрое устранение уязвимостей снижает риск атак.

  3. Удобство для администраторов: обновление становится проще и быстрее.

  4. Поддержка высокой доступности: критические системы остаются доступными даже при обновлении.

  5. Снижение затрат: устранение необходимости перезагрузки экономит ресурсы.

  6. Поддержка критических систем: обновление возможно без остановки работы системы.

  7. Ускорение процесса: обновление ядра занимает меньше времени.

  8. Поддержка длительных процессов: обновление не прерывает длительные задачи.

Динамическое исправление (Live Patching) — эффективный способ обновления ядра, минимизирующий простои и повышающий стабильность систем.

Популярные инструменты для динамического исправления (Live Patching):

  1. kpatch (от Red Hat) м используется в RHEL (Red Hat Enterprise Linux) и CentOS.

  2. kgraft (от SUSE) — используется в SUSE Linux Enterprise.

  3. Livepatch от Canonica — интегрирован в Ubuntu.

kpatch для хостинговой редакции ОС МСВСфера 9

Рассмотрим, как используется технология динамического исправления (Live Patching) для хостинговой редакции ОС МСВСфера 9.

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

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

С помощью kpatch от Red Hat были модифицированы несколько подсистем ядра.

Вот что было модифицировано в поставляемых kpatch пакетах для хостинговой редакции.

  • Возможность контроля за файловой системой пользователя, ограниченного квотой.

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

  • Алгоритм учёта лимитов числа процессов в CGroup.

    Подсистема CGroups разрешает помещать в группу новые процессы, если их помещает привилегированный пользователь, но для хостинга необходимо, чтоб лимит действовал всегда. Без внесения изменений в ядро, есть возможность превысить лимит NPROC.

Пример работы kpatch

В ОС МСВСфера 9 для хостинга установите пакет msvsphere-hosting-integration-0.1.7-1.el9.inferit и запустите команду:

$ sudo msvsphere_hosting_convert kpatch

Данная команда автоматически определит текущее ядро, а также все установленные на сервере ядра. И произведёт установку патчей для каждого установленного ядра. Это будет выглядеть следующим образом:

🔧 PRE TRANSACTION
📦 hosting-kpatch-patch-5_14_0-503_19_1-1-20251013.el9
📦 hosting-kpatch-patch-5_14_0-503_23_2-1-20251013.el9
📦 hosting-kpatch-patch-5_14_0-570_12_1-1-20251013.el9
📦 kpatch-0.9.7-3.el9_6
📦 kpatch-dnf-0.9.7_0.5-3.el9_6
🧩 Ожидаемые патчи: set()
🧩 Найденные патчи: {'5_14_0-503_19_1', '5_14_0-503_23_2', '5_14_0-570_12_1'}
✅ Установка разрешена
Выполнение транзакции
  Подготовка       :                                                                                                                                     1/1
  Установка        : kpatch-dnf-0.9.7_0.5-3.el9_6.noarch                                                                                                 1/5
  Запуск скриптлета: kpatch-dnf-0.9.7_0.5-3.el9_6.noarch                                                                                                 1/5
To enable automatic kpatch-patch subscription, run:
        $ dnf kpatch auto

  Установка        : kpatch-0.9.7-3.el9_6.noarch                                                                                                         2/5
  Установка        : hosting-kpatch-patch-5_14_0-503_19_1-1-20251013.el9.x86_64                                                                          3/5
  Запуск скриптлета: hosting-kpatch-patch-5_14_0-503_19_1-1-20251013.el9.x86_64                                                                          3/5
installing /usr/lib/kpatch/5.14.0-503.19.1.el9_5.x86_64/kpatch-5_14_0-503_19_1-1-20251013.ko (5.14.0-503.19.1.el9_5.x86_64)
Created symlink /etc/systemd/system/multi-user.target.wants/kpatch.service → /usr/lib/systemd/system/kpatch.service.
 ...

  Проверка         : hosting-kpatch-patch-5_14_0-503_19_1-1-20251013.el9.x86_64                                                                          1/5
  Проверка         : hosting-kpatch-patch-5_14_0-503_23_2-1-20251013.el9.x86_64                                                                          2/5
  Проверка         : hosting-kpatch-patch-5_14_0-570_12_1-1-20251013.el9.x86_64                                                                          3/5
  Проверка         : kpatch-0.9.7-3.el9_6.noarch                                                                                                         4/5
  Проверка         : kpatch-dnf-0.9.7_0.5-3.el9_6.noarch                                                                                                 5/5

Установлен:
  hosting-kpatch-patch-5_14_0-503_19_1-1-20251013.el9.x86_64                    hosting-kpatch-patch-5_14_0-503_23_2-1-20251013.el9.x86_64
  hosting-kpatch-patch-5_14_0-570_12_1-1-20251013.el9.x86_64                    kpatch-0.9.7-3.el9_6.noarch
  kpatch-dnf-0.9.7_0.5-3.el9_6.noarch

Для того, чтобы посмотреть установленные патчи и текущий применённый патч, выполните команду sudo kpatch list:

$ sudo kpatch list
Loaded patch modules:
kpatch_5_14_0_570_12_1_1_20251013 [enabled]

Installed patch modules:
kpatch_5_14_0_503_19_1_1_20251013 (5.14.0-503.19.1.el9_5.x86_64)
kpatch_5_14_0_503_23_2_1_20251013 (5.14.0-503.23.2.el9_5.x86_64)
kpatch_5_14_0_570_12_1_1_20251013 (5.14.0-570.12.1.el9_6.x86_64)

Установка kpatch на новых системах

На новых системах kpatch с необходимыми патчами для ядра устанавливается автоматически при конвертации ОС МСВСфера 9 в ОС МСВСфера 9 Хостинговая редакция.

Факторы, влияющие на работу

На данный момент ситуаций, требующих особого внимания, с динамическим исправлением (Live Patching) обнаружено не было, но в случае сомнений можно выполнить команду sudo kpatch unload, которая позволяет отключить или удалить ранее установленный патч из работающего ядра:

$ sudo kpatch unload kpatch_5_14_0_570_12_1_1_20251013