Afkodning af LUKS-container under systemboot

Goddag til alle! Dette indlæg vil være nyttigt for dem, der bruger LUKS-datakryptering og ønsker at dekryptere diske under Linux (Debian, Ubuntu) på stadiet for dekryptering af root-partitionen. Og sådan information kunne jeg ikke finde på internettet.

For nylig, med stigende antal diske på hylderne, stødte jeg på problemet med dekryptering af diske ved hjælp af den ganske velkendte metode gennem /etc/crypttab. Jeg identificerer personligt flere problemer med brugen af denne metode, nemlig at filen kun kan læses efter indlæsning (mount) af root-partitionen, hvilket har en negativ indvirkning på import af ZFS, især hvis de er lavet af partitioner på *_crypt-enheden, eller mdadm RAID'er, der også er lavet af partitioner. Vi ved alle, at man kan bruge parted på LUKS-containere? Og også problemet med tidlig opstart af andre tjenester, når der ikke er array'er endnu, men bruges der allerede skal gøres noget (jeg arbejder med klynger af Proxmox VE 5.x og ZFS over iSCSI).

Lidt om ZFS over iSCSIiSCSI kører hos mig via LIO, og når iSCSI-targeten starter og ikke kan finde ZVOL-enhederne, fjerner den dem simpelthen fra konfigurationen, hvilket giver gæstesystemerne problemer med at starte. Enten skal man gendanne en backup json-fil, eller manuelt tilføje enheder med identifikatorerne for hver VM, hvilket er frygteligt, når der er mange maskiner og hver konfiguration har mere end 1 disk.

Og det andet spørgsmål, jeg vil overveje, er, hvordan man udfører dekrypteringen (det er et centralt punkt i artiklen). Og vi vil tale om dette nedenfor, kom ind under kat!

Ofte på internettet bruges en nøglefil (selvfølgelig tilføjet før dette i slot ved hjælp af kommandoen — cryptsetup luksAddKey), eller i sjældne undtagelser (på russisk-sprogede internetsider er der meget lidt information) — scriptet decrypt_derived, der ligger i /lib/cryptsetup/script/ (selvfølgelig er der også andre metoder, men jeg har brugt netop disse to, som danner grundlaget for artiklen). Jeg sigtede også efter fuld autonom opstart efter genstarter, uden nogen ekstra kommandoer i konsollen, så alt startede straks. Så hvorfor vente? —

Lad os komme i gang!

Lad os overveje et system, for eksempel Debian, installeret på en crypto-partition sda3_crypt med et dusin diske, der er klar til kryptering og til hvad som helst man ønsker. Vi har en nøglefrase (passphrase) til at låse sda3_crypt op, og det er fra denne partition, vi vil tage 'hash'en' fra adgangskoden og tilføje den til de andre diske. Det hele er ganske enkelt; i konsollen udfører vi:

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

hvor X er vores diske, partitioner osv.

Efter kryptering af diskene med 'hash'en' fra vores nøglefrase, skal vi finde UUID eller ID — alt efter hvem der er vant til hvad. Vi henter data fra /dev/disk/by-uuid og by-id henholdsvis.

Næste skridt er at forberede filerne og små scripts til de nødvendige funktioner, lad os begynde:

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/

derefter

touch /etc/initramfs-tools/hooks/decrypt && chmod +x /etc/initramfs-tools/hooks/decrypt

Indholdet af ../decrypt

#!/bin/sh

cp -p /lib/cryptsetup/scripts/decrypt_derived "$DESTDIR/bin/decrypt_derived"

derefter

touch /etc/initramfs-tools/hooks/partcopy && chmod +x /etc/initramfs-tools/hooks/partcopy

Indholdet af ../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"

endnu lidt

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

Indholdet af ../partprobe

#!/bin/sh

$DESTDIR/bin/partprobe

og til sidst, før update-initramfs, skal du redigere filen /etc/initramfs-tools/scripts/local-top/cryptroot, startende fra linje ~360, stykke kode som nedenfor

Original


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

og bringe det til denne form

Den redigerede


                # 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

Bemærk, at du her kan bruge enten UUID eller ID. Det vigtigste er, at de nødvendige drivere til HDD/SSD-enhederne er tilføjet til /etc/initramfs-tools/modules. Du kan finde den brugte driver med kommandoen udevadm info -a -n /dev/sdX | egrep ‘looking|DRIVER’.

Nu hvor vi er færdige og alle filer er på plads, kører vi update-initramfs -u -k all -v, i loggen må der ikke være fejl i udførelsen af vores scripts. Vi genstarter, indtaster nøglefrase og venter lidt, afhængig af antallet af diske. Herefter vil systemet starte, og i den afsluttende fase af opstarten, nemlig efter 'mounting' af root-partitionen, vil kommandoen partprobe blive udført — den vil finde og tilslutte alle oprettede partitioner på LUKS-enhederne, og enhver array, hvad enten det er ZFS eller mdadm, vil blive samlet uden problemer! Og alt dette før indlæsning af de vigtigste tjenester og services, der har brug for disse diske/arrays.

update1: Hvordan bemærkede AEP, denne metode fungerer kun for LUKS1.

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster