Dekrypterar en LUKS-behållare vid systemstart

God dag och natt alla! Det här inlägget kommer att vara användbart för dem som använder LUKS datakryptering och vill dekryptera diskar under Linux (Debian, Ubuntu) på steg för att dekryptera rotpartitionen. Och jag kunde inte hitta sådan information på Internet.

På senare tid, med ökningen av antalet diskar i hyllorna, stötte jag på problemet med att dekryptera diskar med den mer än välkända metoden genom /etc/crypttab. Personligen lyfter jag fram några problem med att använda den här metoden, nämligen att filen läses först efter att ha laddat (monterat) rotpartitionen, vilket negativt påverkar ZFS-importer, särskilt om de byggdes från partitioner på en *_crypt-enhet, eller mdadm-raids byggda från partitioner också. Vi vet alla att man kan använda parted på LUKS-containrar, eller hur? Och även problemet med tidig start av andra tjänster, när det inte finns några arrayer ännu, men att använda Jag behöver redan något (jag arbetar med klustrade Proxmox VE 5.x och ZFS över iSCSI).

Lite om ZFSoverISCSIiSCSI fungerar för mig genom LIO, och faktiskt, när iscsi-målet startar och inte ser ZVOL-enheter, tar det helt enkelt bort dem från konfigurationen, vilket förhindrar gästsystem från att starta. Därför antingen återställa en säkerhetskopia av en json-fil eller manuellt lägga till enheter med identifierare för varje virtuell dator, vilket helt enkelt är hemskt när det finns dussintals sådana maskiner och varje konfiguration har mer än 1 disk.

Och den andra frågan som jag kommer att överväga är hur man dekrypterar (detta är nyckelpunkten i artikeln). Och vi kommer att prata om detta nedan, gå under klippet!

Oftast, på Internet, används en nyckelfil (självtillfogad till platsen före detta genom kommandot - cryptsetup luksAddKey), eller i sällsynta undantag (på det ryskspråkiga Internet finns det väldigt lite information) - skriptet decrypt_derived ligger i /lib/cryptsetup/script/ (det finns givetvis andra sätt, men jag använde dessa två, som låg till grund för artikeln). Jag strävade också efter fullständig autonom inkludering efter omstarter, utan några ytterligare kommandon i konsolen, så att allt skulle "flyga upp" för mig på en gång. Därför, varför vänta? —

Låt oss komma igång!

Låt oss anta att ett system, som Debian, är installerat på en sda3_crypt-krypteringspartition och ett dussin diskar redo att krypteras och skapas till ditt hjärtas innehåll. Vi har en lösenfras (lösenfras) för att låsa upp sda3_crypt, och det är från denna partition som vi kommer att ta bort "hash" från lösenordet på det körande (dekrypterade) systemet och lägga till det på resten av diskarna. Allt är elementärt, i konsolen kör vi:

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

där X är våra diskar, partitioner osv.

Efter att ha krypterat diskarna med en "hash" från vår lösenfras måste du ta reda på UUID eller ID - beroende på vem som är van vid vad och vad. Vi tar data från /dev/disk/by-uuid respektive by-id.

Nästa steg är att förbereda filer och miniskript för de funktioner vi behöver, låt oss fortsätta:

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

Innehållet i ../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

Innehållet i ../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"

lite mer

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

Innehåll ../partprobe

#!/bin/sh

$DESTDIR/bin/partprobe

och sist, innan update-initramfs, måste du redigera filen /etc/initramfs-tools/scripts/local-top/cryptroot, med start från rad ~360, kodavsnitt nedan

Original


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

och ta det till denna form

Redigerat


                # 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

Observera att antingen UUID eller ID kan användas här. Huvudsaken är att de nödvändiga drivrutinerna för HDD / SSD-enheter läggs till i /etc/initramfs-tools/modules. Du kan ta reda på vilken drivrutin som används med kommandot udevadm info -a -n /dev/sdX | egrep 'looking|DRIVER'.

Nu när vi är klara och alla filer är på plats, kör update-initramfs -u -k all -v, i loggning måste inte vara exekveringsfel av våra skript. Vi startar om, anger lösenordsfrasen och väntar lite, beroende på antalet diskar. Därefter kommer systemet att starta och i slutskedet av lanseringen, nämligen efter att ha "monterat" rotpartitionen, kommer partprobe-kommandot att köras - det kommer att hitta och plocka upp alla skapade partitioner på LUKS-enheter och eventuella arrayer, vare sig det är ZFS eller mdadm, kommer att monteras utan problem! Och allt detta innan lastning kärntjänster och tjänster som behöver dessa diskar/matriser.

uppdatering1: Hur märkt AEP, den här metoden fungerar bara för LUKS1.

Källa: will.com

Lägg en kommentar