LUKS konteinerio iššifravimas sistemos įkrovos metu

Labos dienos ir nakties visiems! Šis įrašas bus naudingas tiems, kurie naudoja LUKS duomenų šifravimą ir nori iššifruoti diskus su Linux (Debian, Ubuntu) šakninio skaidinio iššifravimo etapai. O internete tokios informacijos neradau.

Visai neseniai, padidėjus diskų skaičiui lentynose, susidūriau su diskų iššifravimo problema, naudojant daugiau nei gerai žinomą metodą per /etc/crypttab. Asmeniškai aš pabrėžiu keletą problemų, susijusių su šio metodo naudojimu, būtent tai, kad failas yra skaitomas tik įkėlus (sumontavus) šakninį skaidinį, o tai neigiamai veikia ZFS importavimą, ypač jei jie buvo sukurti iš skaidinių *_crypt įrenginyje arba mdadm reidai, sukurti iš skaidinių. Visi žinome, kad LUKS konteineriuose galite naudoti atskirtus, tiesa? Taip pat ir kitų paslaugų ankstyvos pradžios problema, kai dar nėra masyvų, bet naudoti Man jau kažko reikia (dirbu su grupiniais Proxmox VE 5.x ir ZFS per iSCSI).

Šiek tiek apie ZFSoverISCSIiSCSI man veikia per LIO, ir iš tikrųjų, kai paleidžiamas iscsi target ir nemato ZVOL įrenginių, jis tiesiog pašalina juos iš konfigūracijos, o tai neleidžia svečių sistemoms paleisti. Taigi arba atkurti json failo atsarginę kopiją, arba rankiniu būdu pridėti įrenginius su kiekvienos VM identifikatoriais, o tai tiesiog baisu, kai tokių mašinų yra dešimtys ir kiekvienoje konfigūracijoje yra daugiau nei 1 diskas.

Ir antras klausimas, kurį apsvarstysiu, yra tai, kaip iššifruoti (tai yra pagrindinis straipsnio punktas). Ir mes apie tai kalbėsime žemiau, pakalbėkime apie tai!

Dažniausiai internete naudojamas rakto failas (prieš tai savaime pridedamas prie lizdo komanda - cryptsetup luksAddKey) arba retomis išimtimis (rusų kalba internete yra labai mažai informacijos) - scenarijus decrypt_derived esantis /lib/cryptsetup/script/ (žinoma, yra ir kitų būdų, bet aš panaudojau šiuos du, kurie ir sudarė straipsnio pagrindą). Taip pat siekiau visiško autonominio įtraukimo po perkrovimų, be jokių papildomų komandų konsolėje, kad man viskas iš karto „atskristų“. Todėl kam laukti? —

Pradėkime!

Tarkime, tokia sistema kaip Debian, įdiegta sda3_crypt kriptovaliutų skaidinyje ir keliolikoje diskų, paruoštų užšifruoti ir sukurti pagal jūsų skonį. Turime slaptafrazę (slaptažodį), kad atrakintume sda3_crypt, ir būtent iš šio skaidinio pašalinsime „maišą“ iš veikiančios (iššifruotos) sistemos slaptažodžio ir pridėsime ją prie likusių diskų. Viskas yra elementaru, konsolėje vykdome:

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

kur X yra mūsų diskai, skaidiniai ir kt.

Užšifravus diskus su „maiša“ iš mūsų slaptafrazės, reikia išsiaiškinti UUID arba ID – priklausomai nuo to, kas prie ko ir ką įpratęs. Duomenis imame atitinkamai iš /dev/disk/by-uuid ir by-id.

Kitas žingsnis yra failų ir mini scenarijų paruošimas funkcijoms, kurių mums reikia, tęskime:

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/

toliau

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

../decrypt turinys

#!/bin/sh

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

toliau

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

../partcopy turinys

#!/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"

truputį daugiau

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

Turinys ../partprobe

#!/bin/sh

$DESTDIR/bin/partprobe

ir paskutinis, prieš update-initramfs, reikia redaguoti /etc/initramfs-tools/scripts/local-top/cryptroot failą, pradedant nuo ~360 eilutės, kodo fragmentas žemiau

Originalus


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

ir perkelkite į šią formą

Redaguota


                # 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

Atminkite, kad čia galima naudoti UUID arba ID. Svarbiausia, kad reikalingos HDD / SSD įrenginių tvarkyklės būtų įtrauktos į /etc/initramfs-tools/modules. Su komanda galite sužinoti, kuri tvarkyklė naudojama udevadm info -a -n /dev/sdX | egrep 'ieško|VAIRUOTOJAS'.

Dabar, kai baigėme ir visi failai yra savo vietose, paleiskite update-initramfs -u -k all -v, medienos ruošoje neturi būti mūsų scenarijų vykdymo klaidos. Perkrauname, įvedame slaptafrazę ir šiek tiek laukiame, priklausomai nuo diskų skaičiaus. Tada sistema prasidės ir paskutiniame paleidimo etape, būtent „sumontavus“ šakninį skaidinį, bus vykdoma komanda partprobe - ji suras ir pasiims visus sukurtus skaidinius LUKS įrenginiuose ir bet kokius masyvus, nesvarbu, ar tai ZFS, ar mdadm, bus surinkta be problemų! Ir visa tai prieš kraunant pagrindinės paslaugos ir paslaugos, kurioms reikalingi šie diskai / masyvai.

atnaujinti1: Kaip pastebėjo AEP, šis metodas veikia tik LUKS1.

Šaltinis: www.habr.com

Добавить комментарий