Lockdown — механизм ядра Linux, который ограничивает возможности даже пользователя root. Идея простая: если система загрузилась в доверенном состоянии, код ядра и его память нельзя менять на ходу. Механизм появился в ядре 4.17 и с тех пор используется в дистрибутивах с Secure Boot, в корпоративных сборках и на машинах, где важна целостность загрузочной цепочки.

Зачем это нужно

Обычный root может загрузить модуль, прочитать /dev/mem, заменить ядро через kexec и обойти любые проверки подписи. Lockdown закрывает эти пути: он не защищает от ошибок в приложениях, зато мешает злоумышленнику с правами администратора превратить систему в нечто непроверяемое. Именно поэтому механизм автоматически включается при загрузке через Secure Boot.

Три уровня

Режим задаётся параметром ядра lockdown= и имеет три значения. none — ограничений нет. integrity — запрещены операции, меняющие ядро: загрузка неподписанных модулей, kexec неподписанного образа, доступ к /dev/mem, /dev/kmem и /dev/port, вызовы ioperm и iopl, запись в MSR, гибернация, прямой доступ к PCI через sysfs. confidentiality — дополнительно закрывает чтение памяти ядра через debugfs, tracefs, kprobes, BPF и perf. Уровень можно только повышать: из integrity в confidentiality, но не обратно, и только до перезагрузки.

Как проверить состояние

Интерфейс лежит в securityfs. В квадратных скобках показан активный режим, запись возможна только root и только в сторону ужесточения.

cat /sys/kernel/security/lockdown
mount | grep securityfs
sudo dmesg | grep -i "locked down"

Если файла нет, ядро собрано без CONFIG_SECURITY_LOCKDOWN_LSM либо securityfs не смонтирован. Проверить конфигурацию можно через файл в /boot или через /proc/config.gz.

grep CONFIG_SECURITY_LOCKDOWN /boot/config-$(uname -r)
zgrep CONFIG_SECURITY_LOCKDOWN /proc/config.gz

Включение через параметры загрузки

Самый простой способ — добавить параметр в командную строку ядра. В Debian и Ubuntu правят /etc/default/grub, в Fedora и RHEL удобнее grubby. После изменения обязателен пересбор конфигурации загрузчика.

sudo sed -i 's/GRUB_CMDLINE_LINUX_DEFAULT="/&lockdown=integrity /' /etc/default/grub
sudo update-grub
sudo grubby --update-kernel=ALL --args="lockdown=integrity"
cat /proc/cmdline

Если система загружается через Secure Boot, параметр можно не добавлять: ядро само перейдёт в integrity. Проверить режим Secure Boot и наличие ключей помогает mokutil.

mokutil --sb-state
bootctl status | grep -i secure
mokutil --list-enrolled | head -20

Подписанные модули

В режиме integrity неподписанный модуль не загрузится, а в журнале появится сообщение об отказе. Это первое, что ломается после включения: проприетарные драйверы, модули VirtualBox, ZFS и собственные сборки через DKMS. Проверить подпись модуля можно через modinfo.

modinfo -F signer vboxdrv
modinfo -F sig_id zfs
sudo dmesg | grep -i "module verification failed"

Свой модуль подписывают ключом, который доверяет ядро. Проще всего создать ключ MOK, подписать модуль и занести сертификат в прошивку через mokutil. После перезагрузки появится экран управления ключами, где нужно подтвердить добавление.

openssl req -new -x509 -newkey rsa:2048 -keyout MOK.key -out MOK.crt -nodes -days 3650 -subj "/CN=Local Module Signing/"
sudo /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 MOK.key MOK.crt module.ko
sudo mokutil --import MOK.crt

Для DKMS подпись настраивается в /etc/dkms/framework.conf: указываются пути к ключу и сертификату, после чего модули подписываются при каждой пересборке. Без этого обновление ядра вернёт систему к неработающему драйверу.

Что ещё перестаёт работать

  • Гибернация: запись образа памяти в swap блокируется, suspend-to-RAM обычно работает.
  • kexec и kdump: загрузка образа разрешена только при доверенной подписи.
  • Отладка: bpftrace, perf и прямые чтения /dev/mem требуют понижения режима.
  • Старые утилиты: некоторые программы для прошивки и диагностики оборудования обращаются к портам ввода-вывода.
  • Виртуальные машины: модули гипервизоров без подписи не загрузятся.

Проверить, что именно заблокировано, помогает журнал: ядро пишет строки с префиксом LOCKDOWN и именем проверки.

sudo journalctl -k -b | grep -i lockdown
sudo journalctl -k -b -g "Lockdown:" --no-pager

Как отключить

Понизить уровень на работающей системе нельзя — это защита от компрометации. Отключение возможно только перезагрузкой с параметром lockdown=none. Если включён Secure Boot, ядро всё равно принудительно выставит integrity, поэтому придётся либо отключить Secure Boot в прошивке, либо смириться с ограничениями. Для серверов и рабочих станций с проверенной подписью драйверов отключать защиту обычно не требуется.

Порядок включения на рабочей машине

Не стоит включать защиту вслепую на единственном компьютере. Сначала соберите список внешних модулей и проверьте их подписи, затем попробуйте режим в течение дня, добавив параметр вручную в меню GRUB по клавише e. Если драйверы и гибернация работают, параметр закрепляют в конфигурации загрузчика и проверяют после ближайшего обновления ядра.

lsmod | wc -l
dkms status
sudo modprobe -r vboxdrv; sudo modprobe vboxdrv
cat /proc/sys/kernel/kexec_load_disabled

Команда modprobe с выгрузкой и повторной загрузкой модуля сразу покажет, не мешает ли lockdown конкретному драйверу. Если модуль не загружается, в dmesg останется строка с причиной отказа, и это точнее, чем догадки.

Типичные ошибки

  • Включить integrity и забыть подписать модули DKMS: после обновления ядра драйвер исчезает.
  • Искать отключение через sysfs: понизить уровень без перезагрузки нельзя.
  • Править grub.cfg напрямую: изменения потеряются при следующем обновлении пакета.
  • Путать lockdown с Mandatory Access Control: SELinux и AppArmor решают другую задачу.
  • Ожидать, что режим защитит от уязвимости в приложении, а не от изменения ядра.

Чек-лист

  1. Посмотрите активный режим в /sys/kernel/security/lockdown.
  2. Проверьте статус Secure Boot через mokutil.
  3. Убедитесь, что все нужные модули имеют подпись доверенным ключом.
  4. Настройте подпись DKMS до обновления ядра.
  5. Проверьте гибернацию и работу виртуальных машин.
  6. Зафиксируйте параметры загрузки в конфигурации, а не в ручных правках grub.cfg.

Итог

Lockdown — не замена антивирусу и не защита от ошибок в коде. Это барьер, который не даёт правам root превратиться в безграничный контроль над ядром. Включать его стоит на машинах с Secure Boot и на системах, где важна воспроизводимость загрузки. Главная практическая задача — заранее подписать модули: без этого после включения режима отваливаются драйверы виртуализации, ZFS и проприетарные дополнения. Проверка занимает несколько минут, а цена ошибки — незагрузившийся драйвер после обновления ядра.

Насколько публикация полезна?

Нажмите на звезду, чтобы оценить!

Средняя оценка 0 / 5. Количество оценок: 0

Оценок пока нет. Поставьте оценку первым.

Поделиться: Telegram ВКонтакте