Bug 43056

Summary: Добавить в luks поддержку /etc/crypttab
Product: Sisyphus Reporter: jqt4
Component: make-initrdAssignee: Alexey Gladkov <legion>
Status: CLOSED FIXED QA Contact: qa-sisyphus
Severity: enhancement    
Priority: P5 CC: antohami, glebfm, ldv, legion, placeholder
Version: unstable   
Hardware: x86_64   
OS: Linux   
See Also: https://bugzilla.altlinux.org/show_bug.cgi?id=43080
https://bugzilla.altlinux.org/show_bug.cgi?id=44073
Attachments:
Description Flags
Лог работы 085-luks версии 2.27.0-alt1
none
Лог 085-luks при использовании только crypttab none

Description jqt4 2022-06-23 17:25:26 MSK
При загрузке системы с rootfs на шифрованном разделе пароль для раздела запрашивается 2 раза - в initrd и systemd-cryptsetup.

При этом выдаются сообщения об ошибках:
systemctl status systemd-cryptsetup@luks\\x2dad3c41f2\\x2db10b\\x2d7747\\x2d9b85\\x2d75ca94ff948c.service 
× systemd-cryptsetup@luks\x2dad3c41f2\x2db10b\x2d7747\x2d9b85\x2d75ca94ff948c.service - Cryptography Setup for luks-ad3c41f2-b10b-7747-9b85-75ca94ff948c
     Loaded: loaded (/etc/crypttab; generated)
     Active: failed (Result: exit-code) since Thu 2022-06-23 18:06:10 +04; 2min 46s ago
       Docs: man:crypttab(5)
             man:systemd-cryptsetup-generator(8)
             man:systemd-cryptsetup@.service(8)
    Process: 2566 ExecStart=/lib/systemd/systemd-cryptsetup attach luks-ad3c41f2-b10b-7747-9b85-75ca94ff948c /dev/disk/by-uuid/ad3c41f2-b10b-7747-9b85-75ca94ff948c none luks (code=exited, status=1/FAILURE)
   Main PID: 2566 (code=exited, status=1/FAILURE)
        CPU: 2.660s

июн 23 18:06:03 host-232 systemd[1]: Starting Cryptography Setup for luks-ad3c41f2-b10b-7747-9b85-75ca94ff948c...
июн 23 18:06:07 host-232 systemd-cryptsetup[2566]: Set cipher aes, mode cbc-essiv:sha256, key size 256 bits for device /dev/disk/by-uuid/ad3c41f2-b10b-7747-9b85-75ca94ff948c.
июн 23 18:06:10 host-232 systemd-cryptsetup[2566]: Cannot use device /dev/disk/by-uuid/ad3c41f2-b10b-7747-9b85-75ca94ff948c which is in use (already mapped or mounted).
июн 23 18:06:10 host-232 systemd-cryptsetup[2566]: Failed to activate with specified passphrase: Device or resource busy
июн 23 18:06:10 host-232 systemd[1]: systemd-cryptsetup@luks\x2dad3c41f2\x2db10b\x2d7747\x2d9b85\x2d75ca94ff948c.service: Main process exited, code=exited, status=1/FAILURE
июн 23 18:06:10 host-232 systemd[1]: systemd-cryptsetup@luks\x2dad3c41f2\x2db10b\x2d7747\x2d9b85\x2d75ca94ff948c.service: Failed with result 'exit-code'.
июн 23 18:06:10 host-232 systemd[1]: Failed to start Cryptography Setup for luks-ad3c41f2-b10b-7747-9b85-75ca94ff948c.
июн 23 18:06:10 host-232 systemd[1]: systemd-cryptsetup@luks\x2dad3c41f2\x2db10b\x2d7747\x2d9b85\x2d75ca94ff948c.service: Consumed 2.660s CPU time.

Шифрованный раздел уже расшифрован и нормально работает:
cryptsetup status sda1-luks
/dev/mapper/sda1-luks is active and is in use.
  type:    LUKS1
  cipher:  aes-cbc-essiv:sha256
  keysize: 256 bits
  key location: dm-crypt
  device:  /dev/sda1
  sector size:  512
  offset:  4096 sectors
  size:    20957184 sectors
  mode:    read/write

Причина проблемы в том, что systemd-cryptsetup берёт имя раздела из /etc/crypttab, а /lib/uevent/handlers/085-luks формирует это же имя самостоятельно:
https://git.altlinux.org/gears/m/make-initrd.git?p=make-initrd.git;a=blob;f=make-initrd/features/luks/data/lib/uevent/handlers/085-luks;h=31497678ad2b9b7b707e5c44815d6cc471da4191;hb=0d6ef409151970d3daecb858ef6c762971d82ee0#l191

Для обхода проблемы можно добавить файл /etc/crypttab в initrd и прочитать имя раздела из него.
Comment 1 Alexey Gladkov 2022-06-23 17:34:11 MSK
make-initrd не использует /etc/crypttab. Его нужно его этому учить.
Comment 2 Alexey Gladkov 2022-07-02 19:17:30 MSK
ОК. Я сделал реализацию. Правда она неполная. Нет поддержки PKCS11, FIDO2, TPM2 поскольку их поддержки нет в cryptsetup. Их поддержка реализована только в systemd.
Comment 3 jqt4 2022-07-04 12:20:27 MSK
(Ответ для Alexey Gladkov на комментарий #2)
> ОК. Я сделал реализацию. Правда она неполная. Нет поддержки PKCS11, FIDO2,
> TPM2 поскольку их поддержки нет в cryptsetup. Их поддержка реализована
> только в systemd.

Спасибо! Где можно взять новый make-initrd, чтобы потестировать эту реализацию?
Comment 4 Repository Robot 2022-07-06 21:05:31 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.
Comment 5 jqt4 2022-07-07 18:22:10 MSK
Created attachment 11063 [details]
Лог работы 085-luks версии 2.27.0-alt1
Comment 6 jqt4 2022-07-07 18:22:32 MSK
Протестировал make-initrd-2.27.0-alt1:
Прописал добавление файлов:
initrd.mk
...
PUT_FILES += /etc/keys/luks.key
PUT_FILES += /etc/luks.keys

Создал /etc/keys/luks.key:
dd if=/dev/random of=/etc/keys/luks.key iflag=fullblock bs=512c count=1
chmod go-r /etc/keys/luks.key
cryptsetup luksAddKey $(awk 'BEGIN { FS="\t" } { print $2  }' /etc/crypttab) /etc/keys/luks.key
Ввёл пароль.

Создал /etc/luks.keys, содержащий:
/etc/keys/luks.key

make-initrd
[00:00:15] Image is saved as /boot/initrd-5.15.52-std-def-alt1.img

После перезагрузки пароль ввел 2 раза: в GRUB и systemd-cryptsetup

При загрузке выдано:
085-luks: /dev/sda2: trying to find the keyfile in the '/etc/luks.keys'.
085-luks: Found keyfile '/etc/keys/luks.key' for 'sda2' encrypted partition.
085-luks: sda2-luks (upon /dev/sda2) activated successfully.

systemd-cryptsetup выдаёт сообщения об ошибке:
 systemctl --failed
  UNIT                                                                                LOAD   ACTIVE SUB    DESCRIPTION                                                     
● systemd-cryptsetup@luks\x2d0a2cd49b\x2d6e6f\x2dba4c\x2d8626\x2d101394557ac2.service loaded failed failed Cryptography Setup for luks-0a2cd49b-6e6f-ba4c-8626-101394557ac2

Добавил /etc/crypttab явно:
initrd.mk
...
PUT_FILES += /etc/crypttab

Разобрал initrd-5.15.52-std-def-alt1.img, убедился, что /etc/crypttab в нём есть.

systemd-cryptsetup выдаёт то же сообщения об ошибке.

Проблема осталась.
Получил лог работы 085-luks
Comment 7 jqt4 2022-07-07 18:26:53 MSK
Если в initrd не добавлять файл /etc/luks.keys, то проблема не проявляется.
Но тогда приходится вводить пароль вручную при работе initrd.
Comment 8 Alexey Gladkov 2022-07-07 18:35:44 MSK
Нужно использовать либо старый luks.keys, либо новый crypttab. Если хочется использовать crypttab, то руками его класть ненужно. Если этот конфиг уже есть в системе в /etc, то make-initrd сам его найдёт и добавит. Так сделано потому что в crypttab могут быть прописаны ключи, которые нужно добавить в образ.
Comment 9 jqt4 2022-07-07 19:24:16 MSK
Created attachment 11064 [details]
Лог 085-luks при использовании только crypttab
Comment 10 jqt4 2022-07-07 19:30:58 MSK
Протестировал использование только /etc/crypttab:
Удалил /etc/luks.keys

Прописал /etc/keys/luks.key в /etc/crypttab
cat crypttab 
luks-0a2cd49b-6e6f-ba4c-8626-101394557ac2       UUID=0a2cd49b-6e6f-ba4c-8626-101394557ac2       /etc/keys/luks.key      luks

Оставил в initrd.mk добавление только 1 файла:
PUT_FILES += /etc/keys/luks.key

make-initrd

Выдано сообщение:
085-luks: luks keyfile does not exist: /etc/keys/luks.key
Пришлось вводить пароль вручную.

Разобрал initrd-5.15.52-std-def-alt1.img, убедился, что /etc/keys/luks.key в нём есть.

systemd-cryptsetup не выдаёт сообщений об ошибках.

Проявилась другая проблема: при чтении имени /etc/keys/luks.key из /etc/crypttab пароль не работает.

Приложен лог 085-luks при использовании только crypttab
Comment 11 Alexey Gladkov 2022-07-07 21:26:07 MSK
Да, это опечатка.
Comment 12 Alexey Gladkov 2022-07-07 21:30:35 MSK
Попробуйте с вот этой версией:

https://github.com/osboot/make-initrd/blob/master/features/luks/data/lib/uevent/handlers/085-luks
Comment 13 Alexey Gladkov 2022-07-07 22:07:54 MSK
> Проявилась другая проблема: при чтении имени /etc/keys/luks.key из /etc/crypttab
> пароль не работает.

Поясните пожалуйста. Я не понимаю.
Comment 14 jqt4 2022-07-08 11:26:24 MSK
(Ответ для Alexey Gladkov на комментарий #13)
> > Проявилась другая проблема: при чтении имени /etc/keys/luks.key из /etc/crypttab
> > пароль не работает.
> 
> Поясните пожалуйста. Я не понимаю.

Если rootfs на шифрованном разделе, то в initrd хотелось бы сделать 2 действия:
1. Найти в initrd пароль от шифрованного раздела, чтобы не спрашивать этот пароль у пользователя, и расшифровать раздел.
2. Взять имя для шифрованного из /etc/crypttab, чтобы systemd-cryptsetup не спрашивал у пользователя пароль от раздела и не выдавал сообщения об ошибке при попытке расшифровать уже расшифрованный раздел.

Наблюдались проблемы:

Если 1 выполняется с использованием имени файла с паролем из /etc/luks.keys, то 2 не выполняется. (https://bugzilla.altlinux.org/show_bug.cgi?id=43056#c6).

Если попытаться выполнить 1 с использованием имени файла с паролем из /etc/crypttab, то файл не удаётся найти, хотя он есть, и 1 не выполняется.
Это я пытался сказать фразой: "при чтении имени /etc/keys/luks.key из /etc/crypttab пароль не работает."
Comment 15 jqt4 2022-07-08 11:29:06 MSK
> 2. Взять имя для шифрованного из /etc/crypttab ...
Хотел написать: "Взять имя для шифрованного раздела из /etc/crypttab"
Comment 16 jqt4 2022-07-08 12:11:22 MSK
(Ответ для Alexey Gladkov на комментарий #12)
> Попробуйте с вот этой версией:
> 
> https://github.com/osboot/make-initrd/blob/master/features/luks/data/lib/
> uevent/handlers/085-luks

Да, с этой версией успешно читает из /etc/crypttab и имя раздела и имя файла с паролем. Это то, что нужно. Спасибо!
Соберите, пожалуйста, в Сизиф.
Comment 17 Repository Robot 2022-07-08 14:13:10 MSK
make-initrd-2.27.1-alt1 -> sisyphus:

 Fri Jul 08 2022 Alexey Gladkov <legion@altlinux.ru> 2.27.1-alt1
 - New version (2.27.1).
 - Feature luks:
   + Fix typo and use keyfile if exists (ALT#43056).
   + Add more documentation.