Пароль на пункты меню Grub 2.00 (начиная с Ubuntu 12.10)

Изображение пользователя nockdown.

Задача: запаролить все пункты меню нового 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)

+2
nockdown - 6 Ноябрь, 2012 - 16:56
Изображение пользователя nockdown.

Второй случай. Если на компьютере установлен кроме 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'а и пароль, которые мы задали.

Отправить комментарий

CAPTCHA на основе изображений
Введите цифры