Pag-decrypting ng LUKS container sa oras ng pag-boot ng system

Magandang araw at gabi sa lahat! Ang post na ito ay magiging kapaki-pakinabang sa mga gumagamit ng LUKS data encryption at gustong mag-decrypt ng mga disk sa ilalim ng Linux (Debian, Ubuntu) sa yugto ng decryption ng root partition. At hindi ko mahanap ang ganoong impormasyon sa Internet.

Kamakailan lamang, sa pagtaas ng bilang ng mga disk sa mga istante, nakatagpo ako ng problema sa pag-decrypting ng mga disk gamit ang higit sa kilalang pamamaraan sa pamamagitan ng /etc/crypttab. Sa personal, binibigyang-diin ko ang ilang mga problema sa paggamit ng paraang ito, lalo na nabasa ang file pagkatapos lamang i-load (i-mount) ang root partition, na negatibong nakakaapekto sa mga pag-import ng ZFS, lalo na kung nakolekta ang mga ito mula sa mga partisyon sa isang *_crypt device, o mga pagsalakay ng mdadm na nakolekta rin mula sa mga partisyon. Alam nating lahat na maaari mong gamitin ang hati sa mga lalagyan ng LUKS, tama ba? At din ang problema ng maagang pagsisimula ng iba pang mga serbisyo, kapag wala pang mga arrays, at gamitin Kailangan ko na ng isang bagay (nagtatrabaho ako sa clustered Proxmox VE 5.x at ZFS sa iSCSI).

Kaunti tungkol sa ZFSoverISCSIGumagana ang iSCSI para sa akin sa pamamagitan ng LIO, at sa katunayan, kapag nagsimula ang target ng iscsi at hindi nakikita ang mga ZVOL device, inaalis lang nito ang mga ito sa configuration, na pumipigil sa mga guest system mula sa pag-boot. Kaya, alinman sa pagpapanumbalik ng backup na json file, o manu-manong pagdaragdag ng mga device na may mga identifier ng bawat VM, na sadyang kakila-kilabot kapag mayroong dose-dosenang mga naturang machine at ang bawat configuration ay may higit sa 1 disk.

At ang pangalawang tanong na isasaalang-alang ko ay kung paano i-decrypt (ito ang pangunahing punto ng artikulo). At pag-uusapan natin ito sa ibaba, pumunta sa hiwa!

Kadalasan sa Internet ay gumagamit sila ng isang key file (na awtomatikong idinagdag sa slot na may command - cryptsetup luksAddKey), o sa mga bihirang pagbubukod (may napakakaunting impormasyon sa Russian-language Internet) - ang decrypt_derived script, na matatagpuan sa /lib/cryptsetup/script/ (siyempre, may iba pang mga paraan, ngunit ginamit ko ang dalawang ito, na naging batayan ng artikulo). Nagsumikap din ako para sa ganap na autonomous activation pagkatapos ng pag-reboot, nang walang anumang karagdagang mga utos sa console, upang ang lahat ay "mag-alis" para sa akin kaagad. Samakatuwid, bakit maghintay? β€”

Magsimula tayo!

Ipinapalagay namin ang isang sistema, halimbawa Debian, na naka-install sa sda3_crypt crypto partition at isang dosenang disk na handang mag-encrypt at lumikha ng anumang nais ng iyong puso. Mayroon kaming pangunahing parirala (passphrase) upang i-unlock ang sda3_crypt at mula sa seksyong ito ay aalisin namin ang "hash" ng password sa isang tumatakbo (na-decrypted) na sistema at idagdag ito sa iba pang mga disk. Ang lahat ay elementarya, sa console na ginagawa namin:

/lib/cryptsetup/scripts/decrypt_derived sda3_crypt | cryptsetup luksFormat /dev/sdX

kung saan ang X ay ang aming mga disk, partisyon, atbp.

Pagkatapos i-encrypt ang mga disk gamit ang hash mula sa aming pangunahing parirala, kailangan mong malaman ang UUID o ID - depende sa kung sino ang nakasanayan na kung ano. Kumuha kami ng data mula sa /dev/disk/by-uuid at by-id, ayon sa pagkakabanggit.

Ang susunod na yugto ay ang paghahanda ng mga file at mini-script para sa mga function na kailangan nating gumana, magpatuloy tayo:

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

Mga nilalaman ng ../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

Nilalaman ../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"

kaunti pa

touch /etc/initramfs-tools/scripts/local-bottom/partprobe && chmod +x /etc/initramfs-tools/scripts/local-bottom/partprobe

Mga nilalaman ../partprobe

#!/bin/sh

$DESTDIR/bin/partprobe

at panghuli, bago ang update-initramfs, kailangan mong i-edit ang file /etc/initramfs-tools/scripts/local-top/cryptroot, simula sa linya ~360, isang piraso ng code sa ibaba

Orihinal


                # decrease $count by 1, apparently last try was successful.
                count=$(( $count - 1 ))
                
                message "cryptsetup ($crypttarget): set up successfully"
                break

at dalhin ito sa form na ito

Na-edit


                # 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

Tandaan na maaaring gamitin ang alinman sa UUID o ID dito. Ang pangunahing bagay ay ang mga kinakailangang driver para sa mga aparatong HDD/SSD ay idinagdag sa /etc/initramfs-tools/modules. Maaari mong malaman kung aling driver ang ginagamit sa utos udevadm info -a -n /dev/sdX | egrep 'naghahanap|DRIVER'.

Ngayon na kami ay tapos na at ang lahat ng mga file ay nasa lugar, kami ay tumatakbo update-initramfs -u -k lahat -v, sa pag-log ay hindi dapat mga pagkakamali sa pagsasagawa ng aming mga script. Nag-reboot kami, ipasok ang pangunahing parirala at maghintay ng kaunti, depende sa bilang ng mga disk. Susunod, magsisimula ang system at sa huling yugto ng pagsisimula, lalo na pagkatapos "i-mount" ang root partition, isasagawa ang partprobe command - hahanapin at kukunin nito ang lahat ng nilikhang partition sa LUKS device at anumang array, maging ZFS o mdadm, ay tipunin nang walang problema! At lahat ng ito bago mag-load ang mga pangunahing serbisyo na nangangailangan ng mga disk/array na ito.

update1: Paano napansin AEP, gumagana lang ang paraang ito para sa LUKS1.

Pinagmulan: www.habr.com

Magdagdag ng komento