Жүйені жүктеу кезінде LUKS контейнерінің шифрын шешу

Баршаңызға қайырлы күн мен түн! Бұл жазба LUKS деректер шифрлауын қолданатын және Linux (Debian, Ubuntu) жүйесінде дискілерді шифрын ашқысы келетіндер үшін пайдалы болады. түбірлік бөлімнің шифрын ашу кезеңдері. Ал ондай ақпаратты интернеттен таба алмадым.

Жақында, сөрелердегі дискілер санының көбеюімен мен /etc/crypttab арқылы танымал әдісті пайдаланып дискілерді шифрлау мәселесіне тап болдым. Жеке өзім бұл әдісті пайдаланудың бірнеше мәселелерін, атап айтқанда файл оқылып жатқанын атап өтемін түбірлік бөлімді жүктегеннен (монтаждағаннан) кейін ғана, бұл ZFS импортына теріс әсер етеді, атап айтқанда, егер олар *_crypt құрылғысындағы бөлімдерден жасалған болса немесе бөлімдерден жасалған mdadm рейдтері де. Біз LUKS контейнерлерінде parted қолдануға болатынын білеміз, солай емес пе? Сондай-ақ, басқа қызметтерді ерте бастау мәселесі, әлі массивтер болмаған кезде, бірақ пайдалану Маған әлдеқашан бірдеңе қажет (мен iSCSI арқылы кластерленген Proxmox VE 5.x және ZFS арқылы жұмыс істеймін).

ZFSoverISCSI туралы аздапiSCSI мен үшін LIO арқылы жұмыс істейді және шын мәнінде, iscsi мақсатты іске қосылғанда және ZVOL құрылғыларын көрмесе, ол жай ғана конфигурациядан оларды жояды, бұл қонақ жүйелердің жүктелуіне жол бермейді. Демек, json файлының сақтық көшірмесін қалпына келтіру немесе әрбір VM үшін идентификаторлары бар құрылғыларды қолмен қосу, мұндай ондаған машиналар болған кезде және әрбір конфигурацияда 1 дискіден көп болса, бұл өте қорқынышты.

Мен қарастыратын екінші мәселе - шифрды қалай ашу керек (бұл мақаланың негізгі нүктесі). Бұл туралы төменде айтатын боламыз, кесудің астына өтіңіз!

Көбінесе Интернетте негізгі файл пайдаланылады (бұған дейін ұяшыққа пәрмен арқылы өздігінен қосылады - cryptsetup luksAddKey) немесе сирек ерекше жағдайларда (орыс тілді Интернетте ақпарат өте аз) - деcrypt_derived сценарийі /lib/cryptsetup/script/ ішінде орналасқан (әрине, басқа да жолдары бар, бірақ мен мақалаға негіз болған осы екеуін пайдаландым). Мен қайта жүктеуден кейін консольде ешқандай қосымша пәрмендерсіз толық автономды қосуға тырыстым, сонда бәрі мен үшін бірден «ұшады». Сондықтан неге күту керек? —

Бастайық!

sda3_crypt криптографиялық бөлімінде орнатылған Debian сияқты жүйені және шифрлауға және жүрегіңіздің мазмұнын жасауға дайын ондаған дискілерді делік. Бізде sda3_crypt құлпын ашу үшін құпия сөз (пароль) бар және дәл осы бөлімнен біз жұмыс істеп тұрған (шифрдан шығарылған) жүйедегі құпия сөзден «хэшті» алып тастап, оны қалған дискілерге қосамыз. Барлығы қарапайым, консольде біз орындаймыз:

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

мұндағы X - біздің дискілер, бөлімдер және т.б.

Дискілерді біздің құпия фразамыздан «хэшпен» шифрлағаннан кейін, кімнің не және не үйренгеніне байланысты UUID немесе ID анықтау керек. Біз деректерді /dev/disk/by-uuid және by-id ішінен аламыз.

Келесі қадам - ​​бізге қажет функциялар үшін файлдар мен шағын сценарийлерді дайындау, жалғастырайық:

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

../шифрын шешу мазмұны

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

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

тағы кішкене

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

Мазмұны ../partprobe

#!/bin/sh

$DESTDIR/bin/partprobe

және соңғысы, update-initramfs алдында /etc/initramfs-tools/scripts/local-top/cryptroot файлын ~360 жолынан бастап өңдеуіңіз керек, төмендегі код үзіндісі

Түпнұсқа


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

және оны осы пішінге келтіріңіз

Өңделген


                # 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

Мұнда UUID немесе идентификаторды пайдалануға болатынын ескеріңіз. Ең бастысы, HDD / SSD құрылғыларына қажетті драйверлер /etc/initramfs-tools/modules ішіне қосылады. Пәрмен арқылы қандай драйвер қолданылып жатқанын білуге ​​болады udevadm info -a -n /dev/sdX | egrep 'көзге көрінетін|Драйвер'.

Енді біз дайынбыз және барлық файлдар орнында, іске қосыңыз update-initramfs -u -k all -v, журналда болмауы керек сценарийлеріміздің орындалу қателері. Біз қайта жүктейміз, құпия сөзді енгіземіз және дискілердің санына байланысты біраз күтеміз. Әрі қарай, жүйе іске қосылады және іске қосудың соңғы кезеңінде, атап айтқанда түбірлік бөлімді «орнатқаннан» кейін partprobe пәрмені орындалады - ол LUKS құрылғыларында және ZFS болсын, кез келген массивтерде барлық жасалған бөлімдерді тауып алады және алады. mdadm, қиындықсыз жиналады! Және мұның бәрі жүктеу алдында осы дискілерді/массивтерді қажет ететін негізгі қызметтер мен қызметтер.

жаңарту1: Қалай байқады AEP, бұл әдіс тек LUKS1 үшін жұмыс істейді.

Ақпарат көзі: www.habr.com

пікір қалдыру