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 решают другую задачу.
- Ожидать, что режим защитит от уязвимости в приложении, а не от изменения ядра.
Чек-лист
- Посмотрите активный режим в /sys/kernel/security/lockdown.
- Проверьте статус Secure Boot через mokutil.
- Убедитесь, что все нужные модули имеют подпись доверенным ключом.
- Настройте подпись DKMS до обновления ядра.
- Проверьте гибернацию и работу виртуальных машин.
- Зафиксируйте параметры загрузки в конфигурации, а не в ручных правках grub.cfg.
Итог
Lockdown — не замена антивирусу и не защита от ошибок в коде. Это барьер, который не даёт правам root превратиться в безграничный контроль над ядром. Включать его стоит на машинах с Secure Boot и на системах, где важна воспроизводимость загрузки. Главная практическая задача — заранее подписать модули: без этого после включения режима отваливаются драйверы виртуализации, ZFS и проприетарные дополнения. Проверка занимает несколько минут, а цена ошибки — незагрузившийся драйвер после обновления ядра.