Dekrypterer en LUKS-beholder ved systemoppstart

God dag og natt alle sammen! Dette innlegget vil være nyttig for de som bruker LUKS datakryptering og ønsker å dekryptere disker under Linux (Debian, Ubuntu) på stadier av dekryptering av rotpartisjonen. Og jeg kunne ikke finne slik informasjon på Internett.

Nylig, med økningen i antall disker i hyllene, fikk jeg problemet med å dekryptere disker ved å bruke den mer enn velkjente metoden gjennom /etc/crypttab. Personlig fremhever jeg noen problemer med å bruke denne metoden, nemlig at filen blir lest bare etter å ha lastet (montert) rotpartisjonen, som påvirker ZFS-importer negativt, spesielt hvis de ble bygget fra partisjoner på en *_crypt-enhet, eller mdadm-raids bygget fra partisjoner også. Vi vet alle at du kan bruke parted på LUKS containere, ikke sant? Og også problemet med tidlig start av andre tjenester, når det ikke er noen matriser ennå, men å bruke Jeg trenger allerede noe (jeg jobber med clustered Proxmox VE 5.x og ZFS over iSCSI).

Litt om ZFSoverISCSIiSCSI fungerer for meg gjennom LIO, og faktisk, når iscsi-målet starter og ikke ser ZVOL-enheter, fjerner det dem ganske enkelt fra konfigurasjonen, noe som forhindrer gjestesystemer i å starte opp. Derfor enten gjenopprette en sikkerhetskopi av json-filer, eller manuelt legge til enheter med identifikatorer for hver VM, noe som rett og slett er forferdelig når det er dusinvis av slike maskiner og hver konfigurasjon har mer enn 1 disk.

Og det andre spørsmålet som jeg vil vurdere er hvordan dekrypteres (dette er nøkkelpunktet i artikkelen). Og vi skal snakke om dette nedenfor, gå under kuttet!

Oftest, på Internett, brukes en nøkkelfil (selv lagt til sporet før dette ved kommandoen - cryptsetup luksAddKey), eller i sjeldne unntak (på det russiskspråklige Internett er det svært lite informasjon) - skriptet decrypt_derived ligger i /lib/cryptsetup/script/ (selvfølgelig er det andre måter, men jeg brukte disse to, som dannet grunnlaget for artikkelen). Jeg strevde også for full autonom inkludering etter omstart, uten noen ekstra kommandoer i konsollen, slik at alt ville "fly opp" for meg på en gang. Derfor, hvorfor vente? —

La oss komme i gang!

La oss anta at et system, som Debian, er installert på en sda3_crypt-kryptopartisjon og et dusin disker som er klare til å bli kryptert og opprettet til ditt hjerte. Vi har en passordfrase (passordfrase) for å låse opp sda3_crypt, og det er fra denne partisjonen vi vil fjerne "hash" fra passordet på det kjørende (dekrypterte) systemet og legge det til resten av diskene. Alt er elementært, i konsollen kjører vi:

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

hvor X er våre disker, partisjoner osv.

Etter å ha kryptert diskene med en "hash" fra passordfrasen vår, må du finne ut UUID eller ID - avhengig av hvem som er vant til hva og hva. Vi tar data fra henholdsvis /dev/disk/by-uuid og by-id.

Det neste trinnet er å forberede filer og miniskript for funksjonene vi trenger, la oss fortsette:

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/

videre

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

Innhold i ../dekryptere

#!/bin/sh

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

videre

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

Innholdet 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"

litt mer

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

Innhold ../partprobe

#!/bin/sh

$DESTDIR/bin/partprobe

og sist, før update-initramfs, må du redigere filen /etc/initramfs-tools/scripts/local-top/cryptroot, fra linje ~360, kodebit nedenfor

Original


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

og bringe den til denne formen

Redigert


                # 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

Merk at enten UUID eller ID kan brukes her. Hovedsaken er at de nødvendige driverne for HDD / SSD-enheter legges til /etc/initramfs-tools/modules. Du kan finne ut hvilken driver som brukes med kommandoen udevadm info -a -n /dev/sdX | egrep 'looking|DRIVER'.

Nå som vi er ferdige og alle filene er på plass, kjør update-initramfs -u -k all -v, i logging må ikke være utførelsesfeil for skriptene våre. Vi starter på nytt, skriver inn passordfrasen og venter litt, avhengig av antall disker. Deretter vil systemet starte og på det siste stadiet av lanseringen, nemlig etter å ha "montert" rotpartisjonen, vil partprobe-kommandoen bli utført - den vil finne og plukke opp alle opprettede partisjoner på LUKS-enheter og eventuelle arrays, det være seg ZFS eller mdadm, vil bli satt sammen uten problemer! Og alt dette før lasting kjernetjenester og tjenester som trenger disse diskene/matrisene.

update1: Hvordan lagt merke til AEP, denne metoden fungerer bare for LUKS1.

Kilde: www.habr.com

Legg til en kommentar