Систем ачаалах үед LUKS контейнерийн шифрийг тайлж байна

Бүгдэд нь өдөр, шөнийн мэнд! Энэ нийтлэл нь LUKS өгөгдлийн шифрлэлт ашигладаг болон Linux (Debian, Ubuntu) дээр дискний кодыг тайлахыг хүсдэг хүмүүст хэрэгтэй болно. root хуваалтыг тайлах үе шатууд. Тэгээд интернетээс ийм мэдээлэл олж чадсангүй.

Саяхан, тавиур дээрх дискний тоо нэмэгдэхийн хэрээр /etc/crypttab-ээр дамжуулан сайн мэддэг аргыг ашиглан дискний кодыг тайлах асуудалтай тулгарсан. Би хувьдаа энэ аргыг ашиглахтай холбоотой цөөн хэдэн асуудлыг онцолж байна, тухайлбал файлыг уншиж байна зөвхөн root хуваалтыг ачаалсны дараа (холбох)., энэ нь ZFS импортод сөргөөр нөлөөлдөг, ялангуяа тэдгээр нь *_crypt төхөөрөмж дээрх хуваалтуудаас бүтээгдсэн бол, эсвэл хуваалтуудаас баригдсан mdadm рейдүүд. Та LUKS саванд parted хэрэглэж болно гэдгийг бид бүгд мэднэ, тийм ээ? Мөн түүнчлэн бусад үйлчилгээний эрт эхлэх асуудал, ямар ч массив хараахан байхгүй үед, гэхдээ ашиглах Надад аль хэдийн ямар нэг зүйл хэрэгтэй байна (Би iSCSI дээр кластерт Proxmox VE 5.x болон ZFS-тэй ажилладаг).

ZFSoverISCSI-ийн талаар бага зэрэгiSCSI нь LIO-ээр дамжуулан миний төлөө ажилладаг бөгөөд үнэндээ iscsi зорилтот ажиллаж, ZVOL төхөөрөмжүүдийг харахгүй байвал зүгээр л тохиргооноос устгадаг бөгөөд энэ нь зочны системийг ачаалахаас сэргийлдэг. Тиймээс, json файлын нөөцлөлтийг сэргээх, эсвэл VM тус бүрт таних тэмдэг бүхий төхөөрөмжүүдийг гараар нэмэх нь ийм олон арван машин байдаг бөгөөд тохиргоо бүр нь 1-ээс олон дисктэй байхад үнэхээр аймшигтай юм.

Миний авч үзэх хоёр дахь асуулт бол шифрийг хэрхэн тайлах вэ (энэ бол нийтлэлийн гол зүйл юм). Мөн бид энэ талаар доор ярих болно, захын дор яв!

Ихэнх тохиолдолд интернетэд түлхүүр файлыг ашигладаг (үүнийг өмнө нь cryptsetup luksAddKey гэсэн командын тусламжтайгаар үүрэнд өөрөө нэмдэг) эсвэл ховор тохиолдолд (орос хэл дээрх интернетэд маш бага мэдээлэл байдаг) - задлах_үүсмэл скриптийг ашигладаг. /lib/cryptsetup/script/-д байрладаг (мэдээжийн хэрэг, өөр аргууд байдаг, гэхдээ би нийтлэлийн үндэс болсон энэ хоёрыг ашигласан). Би бас дахин ачаалсны дараа консол дээр нэмэлт командгүйгээр бүрэн бие даасан байдлаар оруулахыг хичээсэн бөгөөд ингэснээр бүх зүйл миний хувьд нэг дор "нисэх" болно. Тиймээс, яагаад хүлээх вэ? -

Эхэлцгээе!

Debian шиг системийг sda3_crypt крипто хуваалт дээр суулгаж, таны сэтгэлд нийцүүлэн шифрлэхэд бэлэн хэдэн арван дисктэй гэж үзье. Бидэнд 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 эсвэл ID-г энд ашиглаж болно гэдгийг анхаарна уу. Хамгийн гол нь 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

сэтгэгдэл нэмэх