Если пароль на загрузчик LILO или GRUB не установлен, то любой имеющий физический доступ к машине без особого труда сможет сменить пароль любого пользователя в том числе и пароль пользователя root, войдя в однопользовательский режим дописав к строке загрузки Single или init=/bin/sh в случае с Debian/Ubuntu.
Разумеется, что пароль на загрузчик LILO или GRUB не является панацеей от доступа к содержимому диска, но тем не менее является дополнительной предохранительной мерой от разного рода дебилов.
Установка пароля на загрузчик LILO
Пароль на загрузчик LILO устанавливается в открытом (не зашифрованном) виде и хранится в файле /etc/lilo.conf:
image=/boot/2.2.14-vmlinuz label=Linux read-only password=hackme restricted ...
В этом примере установлен пароль hackme и разрешена обычная загрузка ОС, но если будет попытка изменить запись загрузки, то будет запрошен пароль, а если нужен запрос пароля и на загрузку, то убираем строку restricted.
Когда нужно установить пароль на всё меню LILO, то строку password=hackme пишем следующим образом:
default="Linux" boot=/dev/hda map=/boot/map keytable=/boot/us.klt menu-scheme=wb:bw:wb:bw prompt nowarn password=hackme timeout=100 message=/boot/message image=/boot/2.2.14-vmlinuz label=Linux read-only ...
ВНИМАНИЕ! После изменения /etc/lilo.conf нужно выполнить /sbin/lilo. Обычно lilo.conf доступен всем для чтения, поэтому лучше сменить права чтобы доступ был только для пользователя root: chmod 600 /etc/lilo.conf
Установка пароля на загрузочные записи GRUB
Имя пользователя и пароль должны быть определены в одном из файлов сценариев размещённых в /etc/grub.d/, например в /etc/grub.d/00_header. Прямая правка конфигурационного файла /boot/grub/grub.cfg приведёт к потере установленного логина и пароля при следующем запуске команды update-grub. Вот описание некоторых скриптов GRUB:
- 00_header - отвечает за подгрузку базовых GRUB библиотек и параметров;
- 05_debian_theme - отвечает за внешний вид;
- 10_linux - отвечает за формирование записей в меню ОС-linux, в которой установлен GRUB;
- 20_linux_xen - аналогично предыдущему, только вероятно для XEN;
- 30_os-prober - отвечает за обнаружение и включение в список остальных ОС;
- 40_custom и 41_custom - пользовательские скрипты.
Перед началом правки GRUB2 скриптов правильным решением будет создание их резервной копии:
$ mkdir /etc/grub.d.backup $ cp /etc/grub.d/* /etc/grub.d.backup
В примере ниже мы создаём зашифрованный пароль командой grub-mkpasswd-pbkdf2 (хеш пароля приведён в сокращённом виде), определяем его в /etc/grub.d/40_custom, который специально предназначен для пользовательских правок, а в файле /etc/grub.d/10_linux добавляем флаг идентификации, потом update-grub обновляем конфигурацию GRUB:
$ grub-install -V grub-install (GRUB) 1.99-27+deb7u2 --- $ grub-mkpasswd-pbkdf2 Введите пароль: Повторно введите пароль: Хэш PBKDF2 вашего пароля: grub.pbkdf2.sha512.10000.3492844BF978E1B5F33C026A0B7........37F380960317 --- $ vi /etc/grub.d/40_custom #!/bin/sh exec tail -n +3 $0 # This file provides an easy way to add custom menu entries. Simply type the # menu entries you want to add after this comment. Be careful not to change # the 'exec tail' line above. set superusers="root" password_pbkdf2 root grub.pbkdf2.sha512.10000.3492844BF978E1B5F33C026A0B7........37F380960317 export superusers --- vi /etc/grub.d/10_linux --- find the following line: printf "menuentry '${title}' ${CLASS} {\n" "${os}" "${version}" Add --users '' : printf "menuentry '${title}' ${CLASS} --users '' {\n" "${os}" "${version}" --- printf "menuentry '${title}' ${CLASS}" = "menuentry '${title}' ${CLASS}" add "--users ''" : printf "menuentry '${title}' ${CLASS}" = "menuentry '${title}' ${CLASS} --users ''" --- save file and run: update-grub
Добавив параметр --users с пустым '' значением мы активируем защиту записей паролем и разрешаем доступ только для суперпользователя (superusers). Если добавить --users user1, тогда пользователю user1 будет разрешено только загружать ОС, а суперпользователю (superusers) будет дан полный доступ. Если нужно разрешить несколько пользователей, тогда добавляем их через запятую --users user1,user2
Переменная superusers должна быть определена обязательно! Пользователи перечисленные в этой переменной будут иметь права пользователя root с правом на загрузку любой операционной системы а также правом выхода в консоль и редактирования строки загрузки.
ВНИМАНИЕ! Если в имени переменной superusers будет допущена опечатка (к примеру superuser) или она не будет определена, то защита загрузочных записей не будет работать несмотря на наличие других логинов/паролей! Необходимость экспорта переменной export superusers связана с багом
- Bug #718670 “authorisation not applied to submenus” : Bugs : grub2 package : Ubuntu
https://bugs.launchpad.net/ubuntu/+source/grub2/+bug/718670
В принципе если нужно разрешить доступ к записям (загрузку) только одному доверенному пользователю, то можно обойтись (для GRUB 2.02~beta2-22 работает) только редактированием файла /etc/grub.d/40_custom.
Приведённый выше пример правки файла /etc/grub.d/10_linux приведён из ОС Debian 7 (Wheezy), а в Debian 8 (Jessie) есть некие отличия:
echo "menuentry '$(echo "$title" | grub_quote)' ${CLASS} \$menuentry_id_option 'gnulinux-$version-$type-$boot_device_id' {" | sed "s/^/$submenu_indentation/" else echo "menuentry '$(echo "$os" | grub_quote)' ${CLASS} \$menuentry_id_option 'gnulinux-simple-$boot_device_id' {" | sed "s/^/$submenu_indentation/" -------------------------------------------- echo "menuentry '$(echo "$title" | grub_quote)' ${CLASS} --users user1 \$menuentry_id_option 'gnulinux-$version-$type-$boot_device_id' {" | sed "s/^/$submenu_indentation/" else echo "menuentry '$(echo "$os" | grub_quote)' ${CLASS} --users user1 \$menuentry_id_option 'gnulinux-simple-$boot_device_id' {" | sed "s/^/$submenu_indentation/"
Принцип тот же, флаг --users user1 устанавливаем после переменной ${CLASS} перед открывающей { фигурной скобки. Для автоматической подстановки --users user1 во все загрузочные записи menuentry можно использовать программу sed следующим образом:
# Protecting All Entries $ sed -i -e '/^menuentry /s/ {/ --users user1 {/' filename(s) sudo sed -i -e '/^menuentry /s/ {/ --users superman {/' /etc/grub.d/10_linux /etc/grub.d/20_memtest86+ /etc/grub.d/30_os-prober /etc/grub.d/40_custom # To undo the previous command, run: # sudo sed -i -e '/^menuentry /s/ --users user1 {/ {/' filename(s) $ sed -i -e '/^menuentry /s/ --users superman[/B] {/ {/' /etc/grub.d/10_linux /etc/grub.d/20_memtest86+ /etc/grub.d/30_os-prober /etc/grub.d/40_custom
Установка пароля на загрузочные записи GRUB других ОС
Если в системе существуют другие операционные системы, то в итоговом файле конфигурации /boot/grub/grub.cfg они будут определены в секции:
### BEGIN /etc/grub.d/30_os-prober ### menuentry 'Microsoft Windows XP Professional RU (на /dev/sda1)' --class windows --class os $menuentry_id_option 'osprober-chain-EC101F75601EF3D7' { insmod part_msdos insmod ntfs set root='hd0,msdos1' if [ x$feature_platform_search_hint = xy ]; then search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 EC101F75601EF3D7 else search --no-floppy --fs-uuid --set=root EC101F75601EF3D7 fi parttool ${root} hidden- drivemap -s (hd0) ${root} chainloader +1 } ### END /etc/grub.d/30_os-prober ###
В противном случае эта секция будет пустой:
### BEGIN /etc/grub.d/30_os-prober ### ### END /etc/grub.d/30_os-prober ###
Если же у нас есть иные операционные системы, например "Microsoft Windows XP Professional RU (на /dev/sda1)", то флаг --users user1 мы должны добавить в записи menuentry в файле /etc/grub.d/30_os-prober перед началом фигурных скобок, например: menuentry ... --users user1 {...}
cat << EOF menuentry '$(echo "${LONGNAME} $onstr" | grub_quote)' --class windows --class os \$menuentry_id_option 'osprober-chain-$(grub_get_device_id "${DEVICE}")' --users user1 { EOF ----------------------------------------- cat << EOF menuentry '$(echo "${LONGNAME} $onstr" | grub_quote)' --class windows --class os \$menuentry_id_option 'osprober-efi-$(grub_get_device_id "${DEVICE}")' --users user1 { EOF
Проверка конфигурации GRUB
При запуске команды update-grub по-сути запускается команда grub-mkconfig с параметром вывода в файл /boot/grub/grub.cfg:
$ grub-mkconfig -o /boot/grub/grub.cfg
Поэтому перед запуском update-grub можно использовать grub-mkconfig для создания, например в домашней директории, предварительного варианта файла grub.cfg без изменения реальной конфигурации, которую после проверить командой grub-script-check:
$ grub-script-check /root/grub.cfg
Кстати, вместо хешированного пароля (password_pbkdf2 your_login your_password) можно использовать обычный пароль (password your_login your_password), что крайне не рекомендуется ибо в файле /etc/grub.d/40_custom хранится он будет в открытом виде.
Дополнительные настройки GRUB
Дополнительную конфигурацию GRUB можно найти в файле конфигурации /etc/default/grub, которую мы разумеется подробно здесь рассматривать не будем, а упомянем лишь о переменной GRUB_BACKGROUND в которой можно указать своё собственное фоновое изображение (ака обои) для меню GRUB.
Используемое по-умолчанию фоновое изображение для меню GRUB расположено по адресу /usr/share/images/desktop-base/lines-grub.png, - это изображение используется если иное не указано явно в переменной GRUB_BACKGROUND.
Смена фонового изображения GRUB, - это как ещё один способ запудрить моск разного рода взломщикам, можно сменить например на логотип какого-нибудь trollface. Фоновое изображение GRUB должно быть в формате .png, .tga, .jpg, .jpeg
Для смены фонового изображения не обязательно добавлять переменную GRUB_BACKGROUND, для этого достаточно скопировать изображение в директорию /boot/grub и при следующем обновлении конфигурации командой update-grub оно будет обнаружено автоматически:
$ update-grub Generating grub configuration file ... Found background image: trollface-1027x768.jpg Найден образ linux: /boot/vmlinuz-3.16.0-4-686-pae Найден образ initrd: /boot/initrd.img-3.16.0-4-686-pae Найден Microsoft Windows XP Professional RU на /dev/sda1 завершено
Ещё одной полезной переменной конфигурации, которая помогает маскироваться, является GRUB_DISTRIBUTOR, в которой можно сменить имя дистрибутива Linux.
$ vi /etc/default/grub #GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian` GRUB_DISTRIBUTOR='Zalupinux'
После этих нехитрых манипуляций наш Debian будет числится как "Zalupinux GNU/Linux" на фоне trollface-1027x768.jpg ;)

Унылый серо-белый цвет оформления менюшки можно сменить на свой собственный, но к сожалению этого нельзя сделать в файле настройки /etc/default/grub. Для смены цветовой гаммы оформления нужно установить значение переменных в нашем настроечном скрипте /etc/grub.d/40_custom, - значения нужно указывать в формате "color-foreground/color-background":
$ vi /etc/grub.d/40_custom ... set color_normal=yellow/black set menu_color_highlight=yellow/black set menu_color_normal=red/black
Более подробную информацию о переменных конфигурации GRUB можно найти здесь:
- 5.1 Simple configuration handling
http://www.gnu.org/software/grub/manual/grub.html#Simple-configuration
Дополнительно ещё можно установить пароль на BIOS и по-периметру заминировать системный блок :)

