Bug 42987 - Не работает пропись в /etc/luks.keys файла с паролем от LUKS раздела.
Summary: Не работает пропись в /etc/luks.keys файла с паролем от LUKS раздела.
Status: CLOSED FIXED
Alias: None
Product: Sisyphus
Classification: Development
Component: make-initrd (show other bugs)
Version: unstable
Hardware: x86_64 Linux
: P5 normal
Assignee: Alexey Gladkov
QA Contact: qa-sisyphus
URL:
Keywords:
Depends on:
Blocks: 42983
  Show dependency tree
 
Reported: 2022-06-14 20:37 MSK by jqt4
Modified: 2022-07-06 21:05 MSK (History)
5 users (show)

See Also:


Attachments
Лог работы скрипта /lib/uevent/handlers/085-luks (4.50 KB, text/plain)
2022-06-21 18:32 MSK, jqt4
no flags Details
Лог работы скрипта /lib/uevent/handlers/085-luks из make-initrd-luks-2.26.0-alt3.noarch, Сизиф (3.38 KB, text/plain)
2022-06-22 11:26 MSK, jqt4
no flags Details
Лог работы скрипта /lib/uevent/handlers/085-luks из make-initrd-luks-2.26.0-alt3.noarch, Сизиф (4.51 KB, text/x-log)
2022-06-22 11:28 MSK, jqt4
no flags Details

Note You need to log in before you can comment on or make changes to this bug.
Description jqt4 2022-06-14 20:37:14 MSK
Обновил систему, установленную из образа https://mirror.yandex.ru/altlinux/images/p10/server/x86_64/alt-server-10.0-x86_64.iso до Сизифа, сгенерировал initrd.

Получил проблему, аналогичную https://bugzilla.altlinux.org/42983
Для того, чтобы не вводить пароль в initrd недостаточно файла /etc/luks.keys
Нужно ещё прописать в командной строке ядра "luks-key=/etc/keys/luks.key"
Comment 1 Alexey Gladkov 2022-06-21 16:07:52 MSK
Параметр ядра просто добавляет данные из cmdline в конец /etc/luks.keys.

Что у вас в /etc/luks.keys ?
Comment 2 jqt4 2022-06-21 18:30:02 MSK
(Ответ для Alexey Gladkov на комментарий #1)
> Параметр ядра просто добавляет данные из cmdline в конец /etc/luks.keys.
> 
> Что у вас в /etc/luks.keys ?
Путь к файлу с паролем:
/etc/keys/luks.key
Comment 3 jqt4 2022-06-21 18:32:04 MSK
Created attachment 10957 [details]
Лог работы скрипта /lib/uevent/handlers/085-luks
Comment 4 Alexey Gladkov 2022-06-21 23:05:55 MSK
(Ответ для jqt4 на комментарий #3)
> Лог работы скрипта /lib/uevent/handlers/085-luks

Из лога видно, что luks-key=/etc/keys/luks.key в cmdline был и cryptsetup ключ принял.
А можете показать лог, когда параметра нет ?
Comment 5 jqt4 2022-06-22 11:26:56 MSK
Created attachment 10961 [details]
Лог работы скрипта /lib/uevent/handlers/085-luks из make-initrd-luks-2.26.0-alt3.noarch, Сизиф

В командную строку ядра не был добавлен параметр "luks-key=/etc/keys/luks.key". В результате потребовалось ввести пароль от luks раздела в initrd/
Comment 6 jqt4 2022-06-22 11:28:39 MSK
Created attachment 10962 [details]
Лог работы скрипта /lib/uevent/handlers/085-luks из make-initrd-luks-2.26.0-alt3.noarch, Сизиф

В командную строку ядра был добавлен параметр "luks-key=/etc/keys/luks.key". В результате не потребовалось ввести пароль от luks раздела в initrd.
Comment 7 jqt4 2022-06-22 11:34:31 MSK
(Ответ для Alexey Gladkov на комментарий #4)
> (Ответ для jqt4 на комментарий #3)
> > Лог работы скрипта /lib/uevent/handlers/085-luks
> 
> Из лога видно, что luks-key=/etc/keys/luks.key в cmdline был и cryptsetup
> ключ принял.
> А можете показать лог, когда параметра нет ?

По ошибке лог был получен на p10 с пакетом make-initrd-luks-2.26.0-alt2.noarch
Обновил систему до Сизифа и воспроизвёл проблему.
Файлы /etc/luks.keys и /etc/keys/luks.key не изменились.

Добавил к баге логи работы скрипта /lib/uevent/handlers/085-luks - без параметра luks-key=/etc/keys/luks.key и с этим параметром.
Без параметра пришлось вводить пароль, с параметром - нет. То есть проблема воспроизвелась.
Comment 8 Alexey Gladkov 2022-06-22 14:26:03 MSK
Всё понятно. Я вижу проблему. Спасибо.
Comment 9 Alexey Gladkov 2022-06-22 17:12:20 MSK
Не могли бы вы положить к себе новую версию и проверить с ней ?

https://raw.githubusercontent.com/osboot/make-initrd/master/features/luks/data/lib/uevent/handlers/085-luks
Comment 10 jqt4 2022-06-22 18:09:58 MSK
(Ответ для Alexey Gladkov на комментарий #9)
> Не могли бы вы положить к себе новую версию и проверить с ней ?
> 
> https://raw.githubusercontent.com/osboot/make-initrd/master/features/luks/
> data/lib/uevent/handlers/085-luks

Проблема воспроизводится.
Comment 11 Alexey Gladkov 2022-06-23 20:32:06 MSK
Насамом деле посде этого изменения проблема не воспроизводится если положить в образ /etc/luks.keys и /etc/keys/luks.key который прописан в конфиге.

Судя по всему вы хотите создать в системе /etc/luks.keys и чтобы он был автоматически добавлен в образ и использован. Так ?
Comment 12 jqt4 2022-06-24 10:51:29 MSK
(Ответ для Alexey Gladkov на комментарий #11)
> Насамом деле посде этого изменения проблема не воспроизводится если положить
> в образ /etc/luks.keys и /etc/keys/luks.key который прописан в конфиге.
> 
> Судя по всему вы хотите создать в системе /etc/luks.keys и чтобы он был
> автоматически добавлен в образ и использован. Так ?
Да, так:
Убедившись, что rootfs на шифрованном разделе выполнить команды:

# generate random key
dd if=/dev/random of="$destdir"/etc/keys/luks.key iflag=fullblock bs=512c count=1

# set read permission of key for root only
chmod go-r "$destdir"/etc/keys/luks.key

# add key for encrypted device. Need to enter a password
cryptsetup luksAddKey $(awk 'BEGIN { FS="\t" } { print $2  }' "$destdir"/etc/crypttab) "$destdir"/etc/keys/luks.key

#add key file name to config files
sed -i 's|none|/etc/keys/luks.key|' "$destdir"/etc/crypttab
echo "/etc/keys/luks.key" > "$destdir"/etc/luks.keys
echo "PUT_FILES += /etc/keys/luks.key
PUT_FILES += /etc/luks.keys
" >> "$destdir"/etc/initrd.mk

chroot $destdir sh -c "make-initrd"
Comment 13 Alexey Gladkov 2022-06-24 11:51:59 MSK
(Ответ для jqt4 на комментарий #12)
> > Судя по всему вы хотите создать в системе /etc/luks.keys и чтобы он был
> > автоматически добавлен в образ и использован. Так ?
> Да, так:

Мне не нравится эта идея. /etc/luks.keys не системный конфиг, а конфиг внутри initramfs. Создавать его в системе совершенно неправильно.

initramfs:/etc/luks.keys должен генерироваться make-initrd если используется файл с ключём.

> Убедившись, что rootfs на шифрованном разделе выполнить команды:
> 
> # generate random key
> dd if=/dev/random of="$destdir"/etc/keys/luks.key iflag=fullblock bs=512c
> count=1

В таком формате тоже работать не будет без указания luks-key-format=raw. Как это исправить я пока не знаю. 

> # set read permission of key for root only
> chmod go-r "$destdir"/etc/keys/luks.key
> 
> # add key for encrypted device. Need to enter a password
> cryptsetup luksAddKey $(awk 'BEGIN { FS="\t" } { print $2  }'
> "$destdir"/etc/crypttab) "$destdir"/etc/keys/luks.key
> 
> #add key file name to config files
> sed -i 's|none|/etc/keys/luks.key|' "$destdir"/etc/crypttab
> echo "/etc/keys/luks.key" > "$destdir"/etc/luks.keys
> echo "PUT_FILES += /etc/keys/luks.key
> PUT_FILES += /etc/luks.keys
> " >> "$destdir"/etc/initrd.mk
> 
> chroot $destdir sh -c "make-initrd"
Comment 14 jqt4 2022-06-24 12:19:21 MSK
(Ответ для jqt4 на комментарий #10)
> (Ответ для Alexey Gladkov на комментарий #9)
> > Не могли бы вы положить к себе новую версию и проверить с ней ?
> > 
> > https://raw.githubusercontent.com/osboot/make-initrd/master/features/luks/
> > data/lib/uevent/handlers/085-luks
> 
> Проблема воспроизводится.

Проверил новую версию файла:
wget https://raw.githubusercontent.com/osboot/make-initrd/master/features/luks/data/lib/uevent/handlers/085-luks
md5sum -b 085-luks
73d7147156759316e8c75be54dc35868 *085-luks

rpm -qf /usr/share/make-initrd/features/luks/data/lib/uevent/handlers/085-luks
make-initrd-luks-2.26.0-alt3.noarch

rpm -q make-initrd-luks --dump | grep 085-luks
/usr/share/make-initrd/features/luks/data/lib/uevent/handlers/085-luks 4808 1648491121 73d7147156759316e8c75be54dc35868 0100755 root root 0 0 0 X

Это тот же самый файл - чек-суммы одинаковые, потому и проблема воспроизвелась.

Подскажите, как можно получить исправленный 085-luks ?
Comment 15 Alexey Gladkov 2022-06-24 12:28:34 MSK
(Ответ для jqt4 на комментарий #14)
> Это тот же самый файл - чек-суммы одинаковые, потому и проблема
> воспроизвелась.
> 
> Подскажите, как можно получить исправленный 085-luks ?

Простите. Дуратский github скинул бранч, когда я копировал ссылку. Изменения находятся в бранче for-master:

https://github.com/osboot/make-initrd/blob/for-master/features/luks/data/lib/uevent/handlers/085-luks
Comment 16 jqt4 2022-06-24 15:33:12 MSK
(Ответ для Alexey Gladkov на комментарий #15)
> (Ответ для jqt4 на комментарий #14)
> > Это тот же самый файл - чек-суммы одинаковые, потому и проблема
> > воспроизвелась.
> > 
> > Подскажите, как можно получить исправленный 085-luks ?
> 
> Простите. Дуратский github скинул бранч, когда я копировал ссылку. Изменения
> находятся в бранче for-master:
> 
> https://github.com/osboot/make-initrd/blob/for-master/features/luks/data/lib/
> uevent/handlers/085-luks

Протестировал с файлом

https://raw.githubusercontent.com/osboot/make-initrd/for-master/features/luks/data/lib/uevent/handlers/085-luks

и текстовым паролем в /etc/keys/luks.key

Проблема не воспроизводится.
Спасибо!
Comment 17 Alexey Gladkov 2022-06-24 15:51:53 MSK
(Ответ для jqt4 на комментарий #16)
> Протестировал с файлом
> 
> https://raw.githubusercontent.com/osboot/make-initrd/for-master/features/
> luks/data/lib/uevent/handlers/085-luks
> 
> и текстовым паролем в /etc/keys/luks.key
> 
> Проблема не воспроизводится.
> Спасибо!

К сожалению пока не придумал как сделать лучше. Текущая реализация не позволяет использовать format=raw без указания параметра. Можно конечно закостылить, но хочется сделать нормально.
Comment 18 jqt4 2022-06-24 16:14:42 MSK
(Ответ для Alexey Gladkov на комментарий #13)
> (Ответ для jqt4 на комментарий #12)
> > > Судя по всему вы хотите создать в системе /etc/luks.keys и чтобы он был
> > > автоматически добавлен в образ и использован. Так ?
> > Да, так:
> 
> Мне не нравится эта идея. /etc/luks.keys не системный конфиг, а конфиг
> внутри initramfs. Создавать его в системе совершенно неправильно.

Насколько я знаю, этот файл не используется другими программами.
В нём не содержится ничего секретного.
Если очень нужно, то после make-initrd его можно просто удалить.

> 
> initramfs:/etc/luks.keys должен генерироваться make-initrd если используется
> файл с ключём.
> 
> > Убедившись, что rootfs на шифрованном разделе выполнить команды:
> > 
> > # generate random key
> > dd if=/dev/random of="$destdir"/etc/keys/luks.key iflag=fullblock bs=512c
> > count=1
> 
> В таком формате тоже работать не будет без указания luks-key-format=raw. Как
> это исправить я пока не знаю. 

Проверил в той же тестовой системе.
# generate random key
dd if=/dev/random of=/etc/keys/luks.key iflag=fullblock bs=512c count=1
# set read permission of key for root only
chmod go-r /etc/keys/luks.key
# add key for encrypted device. Need to enter a password
cryptsetup luksAddKey $(awk 'BEGIN { FS="\t" } { print $2  }' /etc/crypttab) /etc/keys/luks.key

Ввёл пароль.

# add key file name to config files
sed -i 's|none|/etc/keys/luks.key|' /etc/crypttab

make-initrd

После перезагрузки пришлось вводить пароль только 1 раз - в GRUB.
До внесения исправлений приходилось вводить пароль 3 раза - в GRUB, initrd, systemd-cryptsetup.
На мой взгляд так гораздо удобнее.

Указывать luks-key-format=raw не потребовалось.
Comment 19 Alexey Gladkov 2022-06-24 16:44:15 MSK
(Ответ для jqt4 на комментарий #18)
> Указывать luks-key-format=raw не потребовалось.

о как. неожиданно для меня.
Comment 20 jqt4 2022-06-28 14:06:45 MSK
Прошу собрать пакет с исправлением 085-luks в Сизиф, чтобы можно было далее собрать его в p10 для решения https://bugzilla.altlinux.org/42983
Comment 21 Alexey Gladkov 2022-06-28 14:24:22 MSK
Я подумаю. В этом исправлении я вижу проблему. Раньше если был указан luks-key=, то пароль никогда не спрашивался. Сейчас это будет происходить. Когда ключ не в initramfs, то возникает рейс между инициализацией устройства с ключём и шифрованного диска, для которого этот ключ нужен.
Comment 22 Repository Robot 2022-07-06 21:05:30 MSK
make-initrd-2.27.0-alt1 -> sisyphus:

 Wed Jul 06 2022 Alexey Gladkov <legion@altlinux.ru> 2.27.0-alt1
 - New version (2.27.0).
 - Feature luks:
   + Add crypttab support (ALT#43056).
   + Try to remember the uuid of the luks device and automatically add it
     to crypttab.
   + Use luks.keys if the file is already in the initramfs (ALT#42987).
 - Feature kickstart:
   + Use /proc/devices to detect sd and virtblk block devices.
 - Feature locales:
   + Read system-wide locales.
 - Utilities:
   + initrd-ls: Fix infinite loop when unpacking zstd.
   + initrd-put: Add option to exclude files by pattern.
   + initrd-scanmod: module must satisfy all the rules from the ruleset.
   + mkinitrd-make-initrd: Fixed misprint, make-initrd can be found now.
   + make-initrd: Enforce absolute path in TMPDIR (ALT#42322).
 - Misc:
   + Check bzip2 library as the last chance for detection if there is no
     bzip2.pc.