Задача: запаролить все пункты меню нового Grub 2.00 (появился впервые начиная с версии Ubuntu 12.10) кроме дефолтной загрузки.
Меню Grub 2.00 выглядит следующим образом:
Ubuntu
Дополнительные параметры для Ubuntu (включает в себя подпункты Ubuntu, с Linux 3.5.0-17-generic и Ubuntu, с Linux 3.5.0-17-generic (режим восстановления))
Memory test (memorytest86+)
Memory test (memorytest86+, serial console 115200)
Мы собираемся запаролить все пункты меню, кроме пункта Ubuntu, чтоб никто кроме нас не смог получить доступ к режиму восстановлению, командной строке и не сбросил пароль. Для этого:
1. генерируем хэш пароля:
grub-mkpasswd-pbkdf2
Пример (пароль при вводе не отображается):
Enter password:
Reenter password:
Your PBKDF2 is grub.pbkdf2.sha512.10000.783FF454C75813562C035726A694A56B4E3B010B7816A3F903D264255B6BDAEBD61C6DC67020C3A09D400B28E68CF682355CB1EA99AF0287207AFDC2A01D3D5B.C097CD29EC739953EE1A747F7C2CA7C75DA8450DE4270CA609DB02A83A979051EDD2507ED372FC7A33C11EBDE23BF3A67C60C74C7F2753BF1359325468EF6DB7
2. создаем файл конфигурации паролей
sudo touch /etc/grub.d/05_password
редактируем его nano
sudo nano /etc/grub.d/05_password
наполняем файл следующим содержанием (перед grub.pbkdf2 пробел, а не новая строчка!):
echo "Setting password protection..." >&2
cat << EOF
set superusers="имя_пользователя"
password_pbkdf2 имя_пользователя grub.pbkdf2.sha512.10000.783FF454C75813562C035726A694A56B4E3B010B7816A3F903D264255B6BDAEBD61C6DC67020C3A09D400B28E68CF682355CB1EA99AF0287207AFDC2A01D3D5B.C097CD29EC739953EE1A747F7C2CA7C75DA8450DE4270CA609DB02A83A979051EDD2507ED372FC7A33C11EBDE23BF3A67C60C74C7F2753BF1359325468EF6DB7
EOF
, где имя_пользователя - имя вашего пользователя, например, nockdown
grub.pbkdf2.sha512.10000.783FF454C75813562C035726A694A56B4E3B010B7816A3F903D264255B6BDAEBD61C6DC67020C3A09D400B28E68CF682355CB1EA99AF0287207AFDC2A01D3D5B.C097CD29EC739953EE1A747F7C2CA7C75DA8450DE4270CA609DB02A83A979051EDD2507ED372FC7A33C11EBDE23BF3A67C60C74C7F2753BF1359325468EF6DB7 - вставляем свой, сгенерированный пунктом выше
перед grub.pbkdf2 пробел, а не новая строчка!
сохраняем файл в nano:
ctrl+O
выходим из nano:
ctrl+x
выставляем права на файл 05_password
sudo chmod u+x,go-rw /etc/grub.d/05_password
3. Основным файлом конфигурации является /boot/grub/grub.cfg , который автоматически генерируется скриптами из файла /etc/default/grub, где хранятся основные настройки для GRUB
Редактируем файл /etc/default/grub
sudo nano /etc/default/grub
Раскомментируем (убираем # в начале) строчку
GRUB_HIDDEN_TIMEOUT=0
а также изменим значение GRUB_TIMEOUT
GRUB_TIMEOUT=0
сохраняем файл в nano:
ctrl+O
выходим из nano:
ctrl+x
4. Пароль на пункты меню. Редактируем файл /etc/grub.d/10_linux
sudo nano /etc/grub.d/10_linux
Находим глазами или поиском ctrl+W (echo "menuentry '$(echo "$os") абзац:
fi
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/"
fi
echo "recordfail" | sed "s/^/$submenu_indentation/"
Как сообщает хелп:
If the --unrestricted option is used for a menu entry, then that entry is unrestricted. If the --users option is not used for a menu entry, then that only superusers are able to use it.
Нам нужно добавить опцию --unrestricted к тому пункту меню, который мы не собираемся паролить. Если этого не сделать или не добавить опции --users, то Grub будет спрашивать пароль на загрузку всегда. И так, добавляем опцию --unrestricted в 4ю строчку приведенного выше фрагмента, чтоб получилось:
fi
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} --unrestricted \$menuentry_id_option 'gnulinux-simple-$boot_device_id' {" | sed "s/^/$submenu_indentation/"
fi
echo "recordfail" | sed "s/^/$submenu_indentation/"
сохраняем файл в nano:
ctrl+O
выходим из nano:
ctrl+x
5. Применяем изменения в конфигурации Grub командой:
sudo update-grub
6. Перезагружаемся
sudo shutdown -r now
В результате:
1) Kubuntu грузится по умолчанию, без запросов пароля на стадии загрузчика Grub,
2) меню Grub по умолчанию не отображается,
3) попасть в меню Grub можно лишь удерживая shift при загрузке,
4) для выбора любого пункта меню, отличного от дефолтной загрузки, потребуется ввести имя superuser'а и пароль, которые мы задали.
Комментарии (1)
Второй случай. Если на компьютере установлен кроме linux'а ещё и windows (например, windows 7).
И мы желаем запаролить все пункты меню кроме Ubuntu и Windows 7.
Меню Grub 2.00 тогда выглядит следующим образом:
Ubuntu
Дополнительные параметры для Ubuntu (включает в себя подпункты Ubuntu, с Linux 3.5.0-17-generic и Ubuntu, с Linux 3.5.0-17-generic (режим восстановления))
Memory test (memorytest86+)
Memory test (memorytest86+, serial console 115200)
Windows 7 (loader) (на /dev/sda1)
В этом случае первые три пункта руководства, приведенного выше, останутся без изменения. А дальше тропинки несколько расходятся:
4. Создаем файл 31_sleep
sudo touch /etc/grub.d/31_sleep
и редактируем его nano
sudo nano /etc/grub.d/31_sleep
вставляем в этот файл (ctrl+shift+V) следующий код:
echo "setting sleep" >&2
cat <<EOF
if [ "x\${timeout}" != "x-1" ]; then
if keystatus; then
if keystatus --shift; then
set timeout=-1
else
set timeout=0
fi
else
if sleep$verbose --interruptible 3 ; then
set timeout=0
fi
fi
fi
EOF
сохраняем файл в nano:
ctrl+O
выходим из nano:
ctrl+x
Выставляем необходимые права и разрешения
sudo chmod u+x,go-rw /etc/grub.d/31_sleep
5. Убираем пароль на пункт меню Ubuntu
Редактируем файл /etc/grub.d/10_linux
sudo nano /etc/grub.d/10_linux
Находим глазами или поиском ctrl+W (echo "menuentry '$(echo "$os") абзац:
fi
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/"
fi
Нам нужно добавить опцию --unrestricted к тому пункту меню (в данном случаем пункту меню Ubuntu), который мы не собираемся паролить. И так, добавляем опцию --unrestricted в 4ю строчку приведенного выше фрагмента, чтоб получилось:
fi
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} --unrestricted \$menuentry_id_option 'gnulinux-simple-$boot_device_id' {" | sed "s/^/$submenu_indentation/"
fi
Явно укажем Grub 2.00, что пункт меню Дополнительные параметры для Ubuntu мы запаролем. Для этого ниже в этом же файле ищем кусок кода:
fi
# TRANSLATORS: %s is replaced with an OS name
echo "submenu '$(gettext_printf "Advanced options for %s" "${OS}" | grub_quote)' \$menuentry_id_option 'gnulinux-advanced-$boot_device_id' {"
fi
и добавляем --users nockdown в 3ю строчку данного фрагмента:
fi
# TRANSLATORS: %s is replaced with an OS name
echo "submenu '$(gettext_printf "Advanced options for %s" "${OS}" | grub_quote)' \$menuentry_id_option 'gnulinux-advanced-$boot_device_id' --users nockdown {"
fi
, где nockdown - имя пользователя, созданного в втором пункте предыдущего поста
сохраняем файл в nano:
ctrl+O
выходим из nano:
ctrl+x
6. Пункт меню Windows 7 (loader) (на /dev/sda1) НЕ защищаем паролем, для этого редактируем файл 30_os-prober
sudo nano /etc/grub.d/30_os-prober
находим абзац
cat << EOF
menuentry '$(echo "${LONGNAME} $onstr" | grub_quote)' --class windows --class os \$menuentry_id_option 'osprober-chain-$(grub_get_device_id "${DEVICE}")' {
EOF
и добавляем опцию --unrestricted
cat << EOF
menuentry '$(echo "${LONGNAME} $onstr" | grub_quote)' --class windows --class os --unrestricted \$menuentry_id_option 'osprober-chain-$(grub_get_device_id "${DEVICE}")' {
EOF
сохраняем файл в nano:
ctrl+O
выходим из nano:
ctrl+x
7. Применяем изменения командой:
sudo update-grub
8. Перезагружаемся
sudo shutdown -r now
В результате:
1) Kubuntu грузится по умолчанию, без запросов пароля на стадии загрузчика Grub,
2) меню Grub по умолчанию не отображается,
3) попасть в меню Grub можно лишь удерживая shift при загрузке,
4) пункт меню Windows не запаролен, для загрузки в windows достаточно удерживать клавишу shift во время загрузки и в меню Grub выбрать пункт Windows 7 (loader) (на /dev/sda1),
5) для выбора любого пункта меню, отличного от дефолтной загрузки (пункт меню Ubuntu) и загрузки в windows (пункт меню Windows 7 (loader) (на /dev/sda1)), потребуется ввести имя superuser'а и пароль, которые мы задали.
Отправить комментарий