Найти в Дзене

Обзор Lockdown mode в ядре Linux

Недавно копаясь по сайтам, искал как сделать ядро Linux более устойчивым к угрозам нашел интересную функцию безопасности - Lockdown mode. В этой статье, я расскажу что это такое, историю его появления в ядре Linux, что он делает и на практике посмотрим его ограничения. Что такое Lockdown mode? Lockdown mode - это функция безопасности для предотвращения как прямого, так и косвенный доступ к работающему образу ядра вводя некоторые ограничения пользователю root. История появления в ядре Linux Работа над данной функцией началась ещё в начале 2010-х годов. Проект возглавил Мэтью Гаррет. Идея заключалась в том, чтобы пользователь не смог никак вмешаться в работу ядра Linux. Однако из-за разногласий данная функция безопасности долго не включалась в состав ядра. Против неё был даже Линус Торвальдс. Но несмотря на это, RHEL и Ubuntu уже включали этот модуль по умолчанию.
В 2018 году Линус Торвальдс всё-таки согласился с мнением сообщества, и внедрение данной функции было лишь вопросом времен
Оглавление

Недавно копаясь по сайтам, искал как сделать ядро Linux более устойчивым к угрозам нашел интересную функцию безопасности - Lockdown mode. В этой статье, я расскажу что это такое, историю его появления в ядре Linux, что он делает и на практике посмотрим его ограничения.

Что такое Lockdown mode?

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

История появления в ядре Linux

Работа над данной функцией началась ещё в начале 2010-х годов. Проект возглавил Мэтью Гаррет. Идея заключалась в том, чтобы пользователь не смог никак вмешаться в работу ядра Linux. Однако из-за разногласий данная функция безопасности долго не включалась в состав ядра. Против неё был даже Линус Торвальдс. Но несмотря на это, RHEL и Ubuntu уже включали этот модуль по умолчанию.


В 2018 году Линус Торвальдс всё-таки согласился с мнением сообщества, и внедрение данной функции было лишь вопросом времени. Уже в 2019 году, с релизом LTS ядра 5.4, Lockdown mode стал одним из модулей LSM и был по умолчанию в ванильном ядре.

Режимы работы Lockdown mode и их ограничения

Lockdown mode имеет два режима: Integrity и Confidentiality.

Integrity

Направлен на защиту целостности ядра. В этом режиме запрещаются:

  • Доступ к /dev/mem, /dev/kmem, /dev/kcore, /dev/ioports;
  • Прямой доступ к аппаратным ресурсам (PCI BAR, MSR, iopl/ioperm);
  • Использование kprobes и опасных режимов BPF;
  • Изменение ACPI-таблиц и выполнение нестандартных ACPI-методов;
  • Опасные ioctl-интерфейсы (KD*IO, TIOCSSERIAL);
  • Загрузка неподписанных модулей и выполнение неподписанных kexec-образов;
  • Использование debugfs;
  • IMA автоматически включает правила secure_boot.
  • Незашифрованную гибернацию и suspend-to-disk.

Confidentiality mode

Расширяет ограничения integrity и дополнительно запрещает:

  • Любые методы чтения памяти ядра;
  • Более строгие ограничения на BPF: unprivileged BPF полностью отключено, даже для root (CONFIG_BPF_UNPRIV_DEFAULT_OFF).
  • Запрет на perf и другие отладочные инструменты, которые читают kernel memory.
  • Запрет на извлечение ключей или секретов (например, через /proc/keys или другие).

Как включить Lockdown mode?

Откройте файл конфигурации загрузчика GRUB по пути /etc/default/grub и в строке GRUB_CMDLINE_LINUX_DEFAULT добавьте lockdown=режим_работы. Например, возьмем Confidentiality: lockdown=confidentiality или Integrity: lockdown=integrity. В случае, если вы хотите отключить его, например, если в UEFI включен Secure Boot (так как при нем включен Lockdown mode в режиме Integrity), то просто введите lockdown=none.
После этих действий нужно обновить GRUB. Введите:

sudo update-grub

или:

sudo grub-mkconfig -o /boot/grub/grub.cfg

Перезапустите дистрибутив и Lockdown включен!

Практика ограничений

Теперь, в качестве теста, проверим ограничения Lockdown. Я включил на своей системе его с режимом Confidentiality.

Попытка загрузить неподписанный модуль ядра

Попытаемся загрузить неподписанный модуль ядра. Делается это с помощью команды:

sudo insmod "название модуля с расширением файла .ko"
Попытка загрузить неподписанный модуль ядра при включенном Lockdown mode
Попытка загрузить неподписанный модуль ядра при включенном Lockdown mode

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

sudo dmesg | tail -20

Она выводит последние 20 строк логов.

Логи ядра Linux, где Lockdown заблокировал загрузку не подписанного модуля.
Логи ядра Linux, где Lockdown заблокировал загрузку не подписанного модуля.

Как мы видим, Lockdown успешно заблокировал попытку загрузить неподписанный модуль.

Попытка прочитать содержимое /dev/mem

Теперь попытаемся прочитать содержимое /dev/mem. Сделаем это с помощью команды:

sudo cat /dev/mem
Попытка получить доступ к содержимому /dev/mem
Попытка получить доступ к содержимому /dev/mem

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

Логи ядра Linux, где Lockdown заблокировал доступ к /dev/mem
Логи ядра Linux, где Lockdown заблокировал доступ к /dev/mem

Lockdown заблокировал доступ к нему. Все работает как надо!

Итог

Lockdown mode — это хороший способ защитить ядро Linux от многих угроз и вмешательств извне. Также он просто поможет изолировать его от user-space пространства для более изолированной работы. Я данную функцию безопасности ядра буду использовать всегда.