Summary: | Feature request: загрузка с зашифрованного корневого раздела | ||
---|---|---|---|
Product: | Sisyphus | Reporter: | aebirukov |
Component: | make-initrd-luks | Assignee: | Alexey Gladkov <legion> |
Status: | CLOSED FIXED | QA Contact: | qa-sisyphus |
Severity: | normal | ||
Priority: | P3 | CC: | antohami, dd1email, evg, glebfm, ildar, kas, ldv, legion, placeholder, radik |
Version: | unstable | ||
Hardware: | all | ||
OS: | Linux |
Description
aebirukov
2011-12-10 23:00:13 MSK
Насчёт отдельного раздела /boot, это и так работает. Я думаю, ничего не мешает это реализовать. Сложностью будет то что для монтирования шифрованного раздела придётся ждать не один девайс, а два. Что нужно прописать в fstab, касающееся зашифрованного корневого раздела (luks), чтобы сгенерировать initrd и раздел примонтировался при загрузке? Или, это как-то иначе делать? (В ответ на комментарий №3) > Что нужно прописать в fstab, касающееся зашифрованного корневого раздела > (luks), чтобы сгенерировать initrd и раздел примонтировался при загрузке? > Или, это как-то иначе делать? Пожалуйста поясните свой вопрос. что сделать, чтобы при загрузке монтировался LUKS / раздел ? (В ответ на комментарий №5)
> что сделать, чтобы при загрузке монтировался LUKS / раздел ?
Для корня на LUKS процедура создания не отличается от других схем:
* Создайте шифрованный рутовый раздел;
* Заполните там fstab;
* Установите туда make-initrd и make-initrd-luks;
* Смонтируйте туда /sys;
* Сделайте туда chroot;
* make-initrd.
>* Заполните там fstab;
Строчку в fstab не подскажите?
Я добавил такую строчку:
UUID="a07e14e6-7bee-48ac-99ea-39aa168cd44d" / crypt_LUKS defaults 0 0
(подобная строка при "ручном" монтировании командой mount работает, но используется mount.crypt_LUKS)
make-initrd
вылетает с ошибкой
add-module: No module "crypt_LUKS" found for kernel 3.0.3-std-def-alt0.M60P.1
В этом-то и загвоздка, что в мануалах пишут про crypttab+fstab, а crypttab у нас то ли не работает, то ли я как то не так его "готовлю".
Вот еще текст письма из рассылки: Спасибо, но сложность, похоже, именно alt-specific Такая строчка в /etc/crypttab _dev_sdb2 UUID="a07e14e6-7bee-48ac-99ea-39aa168cd44d" none luks устройства в /dev/mapper/ не создаёт. Такая строчка в fstab UUID="a07e14e6-7bee-48ac-99ea-39aa168cd44d" /mnt/sdb2 crypt_LUKS defaults 0 0 позволяет монтировать устройство командой "mount /mnt/sdb2". Но используется, в данном случае, mount.crypt_LUKS из пакета pam_mount. Но сгенерировать initrd командой make-initrd (соответственно точка монтирования -- корневой раздел) не получается: add-module: No module "crypt_LUKS" found for kernel crypttab у нас обрабатывается? Если да, то какой формат записи? Если нет, то что писать fstab, чтобы make-initrd было понятно? (В ответ на комментарий №7) > >* Заполните там fstab; > Строчку в fstab не подскажите? Сейчас предполагается, что в fstab будет уже /dev/mapper/... т.е. уже расшифрованный раздел. > make-initrd > вылетает с ошибкой > add-module: No module "crypt_LUKS" found for kernel 3.0.3-std-def-alt0.M60P.1 Это понятно. make-initrd пытается по fstab узнать модуль файловой системы. Я попробую определить его иначе, чтобы работало более железно. > Сейчас предполагается, что в fstab будет уже /dev/mapper/... т.е. уже > расшифрованный раздел. /etc/crypttab обрабатывается? Если нет, то где нужно прописать, что корневой раздел требует расшифровки? > Это понятно. make-initrd пытается по fstab узнать модуль файловой системы. > Я попробую определить его иначе, чтобы работало более железно. Не могли бы вы описать как на данный момент (менее железно :)) можно настроить систему, чтобы при загрузке монтировался корневой раздел. Потому как в других системах зашифрованный раздел нужно прописывать в crypttab, а в ALT это эффекта не дало и непонятно как нужно делать. (В ответ на комментарий №10) Прежде всего хотел бы оправдаться :) Я не мантейнер cryptsetup: $ giter acl sisyphus cryptsetup show cryptsetup naf shaba я его использую, но не для рутового раздела и несколько нестандартно. И второе, make-initrd-luks создавал kas@ для своих конфигураций, но некоторое время назад он покинул наш проект (sisyphus, altlinux). Я лишь создавал ядро make-initrd. > /etc/crypttab обрабатывается? Если нет, то где нужно прописать, что корневой > раздел требует расшифровки? Статус /etc/crypttab стоит обсуждать не в этой баге :) > Не могли бы вы описать как на данный момент (менее железно :)) можно настроить > систему, чтобы при загрузке монтировался корневой раздел. Потому как в других > системах зашифрованный раздел нужно прописывать в crypttab, а в ALT это эффекта > не дало и непонятно как нужно делать. Можно обойтись без автодетекта и прописать всё руками, но если это не горит не наш метод :) (В ответ на комментарий №11) Дело ясное, что дело тёмное :) >Статус /etc/crypttab стоит обсуждать не в этой баге :) На какие еще пакеты нужно развесить фич реквесты или баги, чтобы дело могло сдвинуться? >Можно обойтись без автодетекта и прописать всё руками, но если это не горит не >наш метод :) Вы имеете ввиду образ initrd.img распаковать и внести изменения? Это интересно. Если не трудно, не могли бы вы описать какие изменения там нужно сделать? (В ответ на комментарий №12) > На какие еще пакеты нужно развесить фич реквесты или баги, чтобы дело могло > сдвинуться? Вам стоит пообщаться с мантейнерами cryptsetup на тему поддержки crypttab. > Вы имеете ввиду образ initrd.img распаковать и внести изменения? Это интересно. Нет :) Я конечно не люблю людей, но не до такой степени. > Если не трудно, не могли бы вы описать какие изменения там нужно сделать? make-initrd на самом деле состоит из нескольких частей: автоугадав конфигурации и механизма, который собственно создаёт initrd. Сейчас у вас угадав не может автоматически определить конфигурацию, но это можно сделать вручную. Для этого в /etc/initrd.mk укажите: AUTODETECT = common resume FEATURES = luks # модуль для файловой системы MODULES_ADD = ext4 # Алгоритм шифрования. Если у вас sha256, то можно это не писать. LUKS_HASHES = twofish-generic и попробуйте сгенерировать inird с таким конфигом. > Для этого в /etc/initrd.mk укажите:
Попробую. А что в данном случае нужно писать в /etc/fstab?
/dev/mapper/что?
UUID?
(В ответ на комментарий №14) > > Для этого в /etc/initrd.mk укажите: > Попробую. А что в данном случае нужно писать в /etc/fstab? То что будет в fstab для make-initrd уже не важно. Он в него смотреть не будет. > /dev/mapper/что? > UUID? Если вы пропишите UUID в fstab от /dev/mapper/что и укажете в fstab её файловую систему, то тогда если вы сделаете чрут на неё и выполние make-initrd, то автодетект определит, что у вас рут на зашифрованном разделе и тогда мой приведённый initrd.mk не нужен. Автоматика будет работать. Есть ещё один момент: текущая реализация (если я всё окончательно не забыл) будет пытаться расшифровать все разделы, что в общем случае не верно. Нужно на этапе автодетекта фиксировать какой путь нужно пройти что бы получить рашифрованый root. (В ответ на комментарий №16) > Есть ещё один момент: текущая реализация (если я всё окончательно не забыл) > будет пытаться расшифровать все разделы, что в общем случае не верно. Нужно на > этапе автодетекта фиксировать какой путь нужно пройти что бы получить > рашифрованый root. На самом деле ты реализовал параметр luksdev, который если выставлен указывает какое устройство искать: http://git.altlinux.org/people/legion/packages/make-initrd.git?p=make-initrd.git;a=blob;f=features/luks/data/lib/filters/luks;h=ea7fe7f7f2fe4eea9553854f84d59bf2a59b9247;hb=c914c9685dd20f4318848c1bf82512de0e3cbbab#l10 но забыл указать, что этот параметр нужно слушать. Поэтому сейчас его нельзя указать. > Если вы пропишите UUID в fstab от /dev/mapper/что и укажете в fstab её файловую
> систему, то тогда если вы сделаете чрут на неё и выполние make-initrd, то
> автодетект определит, что у вас рут на зашифрованном разделе и тогда мой
> приведённый initrd.mk не нужен. Автоматика будет работать.
Спасибо, почти получилось. Сделал как вы написали. Действительно автоматика сработала.
Теперь, при загрузке меня спрашивают пароль. Я его ввожу, но система не дожидаясь окончания ввода пишет:
No key available with this passphrase.
Проверил несколько раз. После первого введённого символа перескакивает на новую строку и "ругается".
Если это как-то может помочь, то в последнем openSUSE зашифрованный корневой раздел монтируется корректно. В дополнение к комментарию №18 http://s014.radikal.ru/i326/1112/7b/c8550de1ffd9.jpg Как видно из скриншота если продолжить и вручную сделать cryptsetup luksOpen из под initramfs, то раздел подключается. Баг? (В ответ на комментарий №20) > cryptsetup luksOpen из под initramfs, то раздел подключается. > Баг? в момент монтирования выполняется команда: cryptsetup --key-file=- luksOpen /dev/sda2 sda2-luks не могли бы вы выполнить её вручную ? > cryptsetup --key-file=- luksOpen /dev/sda2 sda2-luks
Enter passphrase:
(initramfs) ls /dev/mapper
control sda2-luks
Пароль вводится, том подключается.
Кстати, а по поводу --key-file не могли бы уточнить? Где можно указать путь к key-file, чтобы initramfs сгенерировалась соответствующим образом для монтирования не по паролю, а по ключу?
Однако, конечно, хотелось бы решить вопрос с вводом пароля.
(В ответ на комментарий №22) > Пароль вводится, том подключается. Скверно. > Где можно указать путь к key-file, чтобы initramfs сгенерировалась > соответствующим образом для монтирования не по паролю, а по ключу? Это ещё предстоит реализовать. > Однако, конечно, хотелось бы решить вопрос с вводом пароля. Мне тоже интересно почему оно так себя ведёт kas@ ? а что stdin в этом месте? попробуйте убрать --key-file=- вообще. он должен спросить с терминала по-умолчанию. (В ответ на комментарий №24) > а что stdin в этом месте? попробуйте убрать --key-file=- вообще. он должен > спросить с терминала по-умолчанию. Кажется я знаю в чём дело. Сейчас я сделал так, что /dev/console открывалась сразу в init. aebirukov@, вы можете проверить версию make-initrd из git ? Проверил. Не помогло. (В ответ на комментарий №26) > Проверил. Не помогло. Простите за задержку. Сегодня создал зашифрованный с паролем раздел и загрузился с него в qemu. Пароль ввёлся весь. > Пароль ввёлся весь.
Странно. Посмотрите, пожалуйста, что не так.
Все действия из под VirtualBox.
Установлен ALTLinux 6.0, скопирован на зашифрованный раздел.
Затем, загрузился с livecd и:
[root@localhost ~]# mount /dev/sda2 /mnt/
Password:
[root@localhost ~]# mount /dev/sda1 /mnt/boot/
[root@localhost ~]# mount --bind /dev/ /mnt/dev/
[root@localhost ~]# mount --bind /proc/ /mnt/proc/
[root@localhost ~]# mount --bind /sys/ /mnt/sys
[root@localhost ~]# cd /mnt/
[root@localhost mnt]# chroot /mnt/
[root@localhost /]# rpm -q make-initrd
make-initrd-0.6.2-alt1
[root@localhost /]# rpm -q make-initrd-luks
make-initrd-luks-0.6.2-alt1
[root@localhost /]# make-initrd
Guessed features: add-modules cleanup compress devmapper luks
Adding LUKS support ...
Image is saved as /boot/initrd-3.0.3-std-def-alt0.M60P.1.img
[root@localhost /]# cat /etc/fstab
UUID="2829eb20-0787-499a-97e6-aceceeefb46a" /boot ext2 defaults 00
# /dev/mapper/_dev_sdb2
UUID="7cda95cd-bc1a-4676-b91a-a1bcdf2e6b87" / ext4 defaults 0 0
[root@localhost /]# grub-mkconfig -o /boot/grub/grub.cfg
Дополнение: Сейчас попробовал выбрать в меню grub (failsave mode) Пароль ввёлся весь, но загрузка дальше не идёт. Остановилась на строчке: initrd: udev: Running luks handler ... http://s15.radikal.ru/i188/1112/2f/3727311ac805.jpg Еще дополнение: http://s15.radikal.ru/i189/1112/b9/e219726673a6.jpg Я к сожалению не знаю про VirtualBox ... я проверял на qemu из сизифа. Проверьте, правильный ли вы указали root=UUID=... т.е. указали ли вы UUID от /dev/mapper/... ? > Я к сожалению не знаю про VirtualBox ... я проверял на qemu из сизифа. Вряд ли может быть разница. Тем более, что failsafe пароль вводить даёт. В чем же дело? > Проверьте, правильный ли вы указали root=UUID=... т.е. указали ли вы UUID от > /dev/mapper/... ? Да, проверил. /dev/sdb2: UUID="a07e14e6-7bee-48ac-99ea-39aa168cd44d" TYPE="crypto_LUKS" /dev/mapper/_dev_sdb2: UUID="7cda95cd-bc1a-4676-b91a-a1bcdf2e6b87" TYPE="ext4" [root@host-15 etc]# cat /etc/fstab|grep 7cda UUID="7cda95cd-bc1a-4676-b91a-a1bcdf2e6b87" / ext4 defaults 0 0 Вы проверяли на версии make-initrd из Сизифа или git? Или они сейчас одинаковые? (В ответ на комментарий №32) > /dev/sdb2: UUID="a07e14e6-7bee-48ac-99ea-39aa168cd44d" TYPE="crypto_LUKS" > /dev/mapper/_dev_sdb2: UUID="7cda95cd-bc1a-4676-b91a-a1bcdf2e6b87" TYPE="ext4" > [root@host-15 etc]# cat /etc/fstab|grep 7cda > UUID="7cda95cd-bc1a-4676-b91a-a1bcdf2e6b87" / ext4 defaults 0 > 0 Это всё хорошо, но что вы в bootloader'е прописываете в cmdline ? > Это всё хорошо, но что вы в bootloader'е прописываете в cmdline ?
Ничего, а надо что-то?
(В ответ на комментарий №34) > > Это всё хорошо, но что вы в bootloader'е прописываете в cmdline ? > Ничего, а надо что-то? Разумеется. Если вы выполните команду "cat /proc/cmdline" на загруженной системе, то увидите с какими параметрами было загружено ядро. В частности вы увидите, что передаётся параметр root=ЧТО_ТО, где ЧТО_ТО указывает тем или иным образом на корень. Эта информация не "прошивается" в initrd при его создании. Один и тот же initrd может использоваться для загрузки с разных источников корневой файловой системы. Так же могут указываться другие параметры, которые управляют поведением initrd и/или последующей системой. Пропишите в загрузчик параметр root=UUID=7cda95cd-bc1a-4676-b91a-a1bcdf2e6b87 (прямо как я указал). >(прямо как я указал).
Спасибо, огромное - с Божьей помощью и помощью legion@ мне удалось таки загрузиться с корневого зашифрованного раздела :)
В grub.cfg убрал опцию quiet=1, именно она не давала вводить пароль полностью.
Теперь всё работает.
Получается "автоматика" в части make-initrd работает хорошо. grub.cfg правильный автоматом не генерируется. Request сделать?
Теперь хотелось бы вернуться первоначальному вопросу. Вход по ключу, а не по паролю реально сделать? Пусть даже не автоматом пока. Где нужно что поправить?
(В ответ на комментарий №36) > Получается "автоматика" в части make-initrd работает хорошо. grub.cfg > правильный автоматом не генерируется. Request сделать? Это не задача make-initrd. У нас есть пакет bootloader-utils, утилиты которого вызываются при обновлении ядра и именно они обновляют записи в загрузчиках (grub или lilo). Когда вы руками меняете схему загрузки, то никакой автоматики не будет. > Теперь хотелось бы вернуться первоначальному вопросу. Вход по ключу, а не по > паролю реально сделать? Пусть даже не автоматом пока. Где нужно что поправить? Пока это сделать нельзя т.к. make-initrd работает таким образом, что не может ждать нескольких устройств сразу. Я думаю над этой проблемой и багу не закрываю. >(grub или lilo).
Да, я это и имел ввиду.
На уже рабочей системе при попытке сгенерировать grub.cfg:
# grub-mkconfig -o /boot/grub/grub.cfg
/usr/sbin/grub-probe: error: cannot stat `/dev/sdb2-luks'.
Но если поставить символическую ссылку на /dev/mapper/sdb2-luks, то генерация проходит успешно. Машина загружается. (Правда у меня почему-то из под VirtualBox работает только когда vga=normal, надо вживую потестировать.)
> Пока это сделать нельзя т.к. make-initrd работает таким образом, что не может
> ждать нескольких устройств сразу. Я думаю над этой проблемой и багу не
> закрываю.
А если ключ размещать на /boot разделе. А /boot раздел на flash накопителе?
Он ведь уже подмонтирован - его ждать не надо.
Вроде, удобно. Как вы считаете?
Это зависит от задачи. На своём рабочем ноуте я держу /home на внешнем шифрованном носителе, а корень системы на обычном разделе. > Это зависит от задачи. На своём рабочем ноуте я держу /home на внешнем
> шифрованном носителе, а корень системы на обычном разделе.
Т.е. используя текущий make-initrd уже можно реализовать схему с ключом размещённым на разделе /boot?
Если не трудно, не могли бы вы описать как это сделать?
(В ответ на комментарий №37) > > Теперь хотелось бы вернуться первоначальному вопросу. Вход по ключу, а не по > > паролю реально сделать? Пусть даже не автоматом пока. Где нужно что поправить? > > Пока это сделать нельзя т.к. make-initrd работает таким образом, что не может > ждать нескольких устройств сразу. Средствами make-initrd реализовать схему с ключём пока нельзя. > Средствами make-initrd реализовать схему с ключём пока нельзя.
А мне это удалось.
# ls -l /etc/root.key
-rw------- 1 root root 56 Дек 23 21:05 /etc/root.key
# cat /etc/initrd.mk.d/key.mk
include /etc/initrd.mk
IMAGE_SUFFIX = -key
PUT_FILES += \
/etc/root.key
$ cat make-initrd-0.6.2/features/luks/data/lib/handlers/050-luks
#!/bin/sh
. /scripts/functions
KEY="/etc/root.key"
nameluks=
password=
handler() {
nameluks="${INIT_LUKS##*/}-luks"
# skip if $nameluks has already exist
dmsetup info "$nameluks" >/dev/null 2>&1 &&
return 0 ||:
if [ -e $KEY ]; then
cryptsetup --key-file=$KEY luksOpen "$INIT_LUKS" "$nameluks"
else
cryptsetup luksOpen "$INIT_LUKS" "$nameluks"
fi
retcode="$?"
if [ "$retcode" != "0" ]; then
error "Unable to activate LUKS: $retcode"
return 1
fi
}
rc=0
for e in "$handler_eventdir"/luks/*; do
[ -f "$e" ] || break
( . "$e"; handler; ) ||
rc=1
done
exit $rc
Как легко понять, принцип в том, что root.key запаковывается в образ initramfs, а там считывается слегка изменённым make-initrd-luks. Если root.key в образе найден не будет - система будет ожидать ввода пароля.
/boot следует размещать на внешнем носителе. Собственно, этот носитель и будет ключом.
В git добавлена поддержка загрузки с шифрованным корнем на LUKS и ключём от этого раздела на внешнем носителе. Для этого добавлен ключ: luks_key=<path> luks_key=<path>:<keydev> luks_key=<path>:<keydev>:<luksdev> path - путь до ключа, если keydev не задан, то этот путь на самом initrd; keydev - устройство на котором находится ключ. Оно задаётся как и root= т.е. UUID=<uuid> или LABEL=<label> ... luksdev - раздел для которого нужно применить ключ. > path - путь до ключа, если keydev не задан, то этот путь на самом initrd;
> keydev - устройство на котором находится ключ. Оно задаётся как и root= т.е.
> UUID=<uuid> или LABEL=<label> ...
> luksdev - раздел для которого нужно применить ключ.
С ключом интегрированным в initrd -- работает.
USB накопитель с ключом что-то у меня не монтируется.
И по UUID и по LABEL пробовал
luks_key=/etc/root.key:UUID=00f42648-1a35-4c60-a7f3-59727e7c6834
luks_key=/etc/root.key:LABEL=bootkeyflash
Так хоть пишу?
Останавливается на udev: что-то там luks handler
(В ответ на комментарий №45) > USB накопитель с ключом что-то у меня не монтируется. FEATURES += usb ? > Так хоть пишу? Да. > FEATURES += usb
Работает, Спасибо.
Исправлено. |