Здравейте на всички! Тази публикация ще бъде полезна за тези, които използват шифроване на данни LUKS и искат да извършат дешифриране на дискове под Linux (Debian, Ubuntu) на етапа на декодиране на кореновия дял. И такава информация не успях да намеря в интернет.
Съвсем наскоро, с увеличаването на броя на дисковете в шкафовете, се сблъсках с проблема за декодиране на дискове с известния метод чрез /etc/crypttab. Лично аз изтъквам няколко проблема при използването на този метод, а именно, че файлът се чете само след зареждане (mount) на кореновия дял, което негативно влияе на импорта на ZFS, особено ако те са сглобени от дялове на *_crypt устройство или mdadm RAID, сглобени също от дялове. Вие всички знаем, че можете да използвате parted на LUKS контейнери? И също така проблемът с ранното стартиране на другите услуги, когато масивите все още не са налични, но да се използва некои вече трябва (работя с кластеризирана Proxmox VE 5.x и ZFS над iSCSI).
Немного за ZFS над iSCSIiSCSI работи при мен чрез LIO, и всъщност, когато стартира iscsi-таргет и не вижда ZVOL устройства, той просто ги премахва от конфигурацията, което не позволява на гостуващите системи да стартират. Оттук, или възстановяване на резервно копие на json файла, или ръчно добавяне на устройства с идентификаторите на всяка VM, което е просто ужасно, когато такива машини са десетки и в конфигурацията на всяка има повече от 1 диск.
И вторият въпрос, който ще разгледам, е с какво да извърша декодиране (това е ключовият момент на статията). И за това ще говорим по-долу, влизайте под кат!
Най-често в интернет пространството се използва ключов файл (разбира се, добавен преди това в слота с команда — cryptsetup luksAddKey), или в редки изключения (в рускоговорящия интернет информацията е оскъдна) — скрипт decrypt_derived, намиращ се в /lib/cryptsetup/script/ (разбира се, има и други методи, но аз използвах точно тези два, които и легнаха в основата на статията). Освен това, аз се стремях към пълно автономно включване след перезарежданета, без каквито и да било допълнителни команди в конзолата, за да мога всичко да "взлети" веднага. Следователно, защо да чакаме? —
Започваме!
Предполагаме система, например Debian, инсталирана на крипто-раздел sda3_crypt и десет диска, готови за шифроване и създаване на каквото душата поиска. Имаме ключова фраза (passphrase) за отключване на sda3_crypt и именно от този раздел ще вземем 'хеш' от паролата на работещата (разшифрована) система и ще добавим на останалите дискове. Всичко е елементарно, в конзолата изпълняваме:
/lib/cryptsetup/scripts/decrypt_derived sda3_crypt | cryptsetup luksFormat /dev/sdXкъдето X — това са нашите дискове, раздели и т.н.
След шифроването на дисковете с 'хеша' от нашата ключова фраза, е необходимо да разберем UUID или ID — в зависимост от това кой какво предпочита. Взимаме данни от /dev/disk/by-uuid и by-id съответно.
Следващият етап е подготовката на файловете и мини-скриптовете за работа с необходимите ни функции, започваме:
cp -p /usr/share/initramfs-tools/hooks/cryptroot /etc/initramfs-tools/hooks/
cp -p /usr/share/initramfs-tools/scripts/local-top/cryptroot /etc/initramfs-tools/scripts/local-top/следва
touch /etc/initramfs-tools/hooks/decrypt && chmod +x /etc/initramfs-tools/hooks/decryptСодержимото .. /decrypt
#!/bin/sh
cp -p /lib/cryptsetup/scripts/decrypt_derived "$DESTDIR/bin/decrypt_derived"следва
touch /etc/initramfs-tools/hooks/partcopy && chmod +x /etc/initramfs-tools/hooks/partcopyСодержимото .. /partcopy
#!/bin/sh
cp -p /sbin/partprobe "$DESTDIR/bin/partprobe"
cp -p /lib/x86_64-linux-gnu/libparted.so.2 "$DESTDIR/lib/x86_64-linux-gnu/libparted.so.2"
cp -p /lib/x86_64-linux-gnu/libreadline.so.7 "$DESTDIR/lib/x86_64-linux-gnu/libreadline.so.7"още малко
touch /etc/initramfs-tools/scripts/local-bottom/partprobe && chmod +x /etc/initramfs-tools/scripts/local-bottom/partprobeСодержимото .. /partprobe
#!/bin/sh
$DESTDIR/bin/partprobeи последно, преди update-initramfs, необходимо е да редактираме файла /etc/initramfs-tools/scripts/local-top/cryptroot, започвайки от ред ~360, парче код по-долу
Оригинал
# decrease $count by 1, apparently last try was successful.
count=$(( $count - 1 ))
message "cryptsetup ($crypttarget): set up successfully"
break
и го приведем в такъв вид
Редактирано
# decrease $count by 1, apparently last try was successful.
count=$(( $count - 1 ))
/bin/decrypt_derived $crypttarget | cryptsetup luksOpen /dev/disk/by-uuid/ *CRYPT_MAP*
/bin/decrypt_derived $crypttarget | cryptsetup luksOpen /dev/disk/by-id/ *CRYPT_MAP*
message "cryptsetup ($crypttarget): set up successfully"
breakОбърнете внимание, че тук може да се използва или UUID, или ID. Важно е необходимите драйвери за HDD/SSD устройствата да бъдат добавени в /etc/initramfs-tools/modules. Да разберем използвания драйвер можем с командата udevadm info -a -n /dev/sdX | egrep 'looking|DRIVER'.
Сега, когато завършихме и всички файлове са на мястото си, стартираме update-initramfs -u -k all -v, в логовете не трябва да има грешки при изпълнението на нашите скриптове. Рестартираме, въвеждаме ключовата фраза и чакаме малко, в зависимост от броя на дисковете. След това системата ще се стартира и на финалния етап на стартирането, а именно след 'маунтинга' на root раздела, ще бъде изпълнена командата partprobe — тя ще намери и свърже всички създадени раздели на LUKS устройствата и каквито и да било масиви, било то ZFS или mdadm, ще се съберат без проблеми! И всичко това преди зареждането на основните услуги и сервизи, които се нуждаят от тези дискове/масиви.
update1: Как , този метод работи само за LUKS1.
Източник: habr.com
