Паролим GRUB...

Feb 05, 2016 16:08



Пока занимался одной темой, которую опишу в следующем посте, столкнулся с интересным вопросом, которым раньше как-то не заморачивался, а именно с локальной безопасностью Линукса. Т.е. вопросом, как максимально защитить ПК под управлением этой ОС, попавший в чьи-то шаловливые ручки. Тут, я подразумеваю не злоумышленника, а просто защиту от дураков очень творческих сотрудников.
В случае со злоумышленником всё проще, хватит обычного шифрования дисков с нормальным рандомным паролем. Но с пользователями всё сложнее, т.к. подразумевается, что на компьютере они всё-таки должны работать :) и при этом не выходить за рамки дозволенного.
Можно создать в системе непривилегированного пользователя, разрешить ему минимум необходимых действий и этим ограничится. Но не тут-то было, я же не зря сделал акцент на творческую натуру, которая «если нельзя, но очень хочется», будет прилагать максимум усилий, что бы эти запреты обойти. Стало быть, надо всё максимально возможно предусмотреть.
Если исключить эксплуатацию уязвимостей ПО и ядра, права в Linux можно себе увеличить двумя способами: загрузкой с Live-образа или из режима Recovery.
Первое решается соответствующей настройкой BIOS, с последующей установкой пароля на него, и шифрованием домашней директории привилегированного пользователя. А второе, отключением Recovery в меню загрузчика (в моём случае GRUB) или установкой на него пароля.
Можно было бы убрать Recovery полностью, ибо в данном конкретном случае проще будет переустановить систему, чем пытаться починить, но мы не ищем лёгких путей мне всё же хотелось разобраться с паролем и оставить Recovery на всякий случай.

Итак, начать следует с выяснения, какая версия GRUB используется. Тут главное не запутаться. Дело в том, что первая версия GRUB именуется не иначе, как GRUB Legacy, а вторая просто GRUB, соответственно и методы будут разные. GRUB Legacy рассматривать не буду, т.к. у нас он не встречается.
В простом случае (но не всё так просто, об этом чуть ниже), достаточно изменить файл /boot/grub/grub.cfg вручную следующим образом:

1. Для начала сгенерируем хэш нашего пароля. Воспользуемся утилитой grub-mkpasswd-pbkdf2.
adminko@ubuntu:~$ grub-mkpasswd-pbkdf2
Введите пароль: 123
Повторно введите пароль: 123
Хэш PBKDF2 вашего пароля: grub.pbkdf2.sha512.10000.6D134ACD0317BD92C8EFA957EB78D8B40206566F8F367CDD4B6B2615AA836F55C7B0A1F774318C59343573911BDB924516EC0B1BEB5F5C7660E6F08195EC394B.A9BC149008889D9FB6D3476C82892489AD79577199C88F2A0170381A633A1339EFFD4965670BF659979F215ED7A77E60C6ACCEB9D2634027BB978459FD4D3422
2. В конец файла /boot/grub/grub.cfg добавим две новых строчки.
set superusers="adminko"
password_pbkdf2 adminko grub.pbkdf2.sha512.10000.6D134ACD031…….
Где,
adminko - наш пользователь, имеющий права на Recovery mode
grub.pbkdf2.sha512.10000….. - хэш нашего пароля (см. п.1).
Теперь, если так оставить, то пароль применится на весь загрузчик и без ввода логина/пароля будет не загрузиться вообще (действует правило «запрещено всё, что не разрешено»).
3. Чтобы разграничить права на различные варианты загрузки, снова откроем /boot/grub/grub.cfg.
Найдём строки, начинающиеся на menuentry - это пункты меню загрузчика.

В Ubuntu (в этом случае я использую её) первым пунктом идёт загрузка с дефолтными параметрами, к этой строке добавим параметр разрешающий выполнение без пароля --unrestricted, вот сюда:
menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-e7c09cf4-7f57-40e0-bf1f-9973bf4ce4e7' --unrestricted {
Дальше идёт подменю (submenu) с вариантами загрузки (с разными ядрами и Recovery mode). Вот его мы и закроем от лишних пользователей, добавив параметр --users adminko.
submenu 'Дополнительные параметры для Ubuntu' $menuentry_id_option 'gnulinux-advanced-e7c09cf4-7f57-40e0-bf1f-9973bf4ce4e7' --users adminko {
Следующие два пункта - это Memory test, его разрешаем, т.к. тут ничего криминального нет.
menuentry 'Memory test (memtest86+)' --unrestricted {
menuentry 'Memory test (memtest86+, serial console 115200)' --unrestricted {
Пробуем... Радуемся :)
Но не долго, до первого обновления ядра :)

Всё дело в том, что файл конфигурации GRUB не совсем статичен, и генерируется утилитой grub-mkconfig после очередного обновления (ядро же меняется, соответственно меняются и параметры, конфиг пересоздаётся).
Полистав мануал по GRUB’у, становится понятно, что файл grub.cfg генерируется при помощи специальных скриптов, находящихся в директории /etc/grub.d. Их нам и предстоит немного поправить.
Сценарий для основной части менюшки находится в файле «10_linux».
Сначала найдём в нём строку, отвечающую за пункт с дефолтной загрузкой:
echo "menuentry '$(echo "$os" | grub_quote)' ${CLASS} \$menuentry_id_option 'gnulinux-simple-$boot_device_id' {" | sed "s/^/$submenu_indentation/"
И приводим её к виду:
echo "menuentry '$(echo "$os" | grub_quote)' ${CLASS} \$menuentry_id_option 'gnulinux-simple-$boot_device_id' --unrestricted {" | sed "s/^/$submenu_indentation/"
Потом строчку, отвечающую за подменю:
echo "submenu '$(gettext_printf "Advanced options for %s" "${OS}" | grub_quote)' \$menuentry_id_option 'gnulinux-advanced-$boot_device_id' {"
И приводим её к виду:
echo "submenu '$(gettext_printf "Advanced options for %s" "${OS}" | grub_quote)' \$menuentry_id_option 'gnulinux-advanced-$boot_device_id' --users adminko {"
После этого переходим к файлу «*20_memtest86+».
Строки:
menuentry '$(gettext_printf "Memory test (memtest86+)")' {
menuentry '$(gettext_printf "Memory test (memtest86+, serial console 115200)")' {
Приводим к виду:
menuentry '$(gettext_printf "Memory test (memtest86+)")' --unrestricted {
menuentry '$(gettext_printf "Memory test (memtest86+, serial console 115200)")' --unrestricted {

Файл «*40_custom», как можно догадаться по названию, предназначен для полёта нашей фантазии :) Туда мы добавим записи содержащие имя пользователя и пароль (см. п.1):
set superusers="adminko"
password_pbkdf2 adminko grub.pbkdf2.sha512.10000.6D134ACD031…….
Готово, скрипты поправили, теперь сгенерируем новый конфиг командой:
grub-mkconfig -o /boot/grub/grub.cfg

Обязательно проверяем содержимое grub.cfg
Перезагружаемся и проверяем.

*nix, информационная безопасность, IT'шное

Previous post Next post
Up