رمزگشایی یک کانتینر LUKS در زمان راه اندازی سیستم

روز و شب همگی بخیر! این پست برای کسانی که از رمزگذاری داده های LUKS استفاده می کنند و می خواهند دیسک های تحت لینوکس (دبیان، اوبونتو) را رمزگشایی کنند مفید خواهد بود. مراحل رمزگشایی پارتیشن ریشه. و من نتوانستم چنین اطلاعاتی را در اینترنت پیدا کنم.

اخیراً، با افزایش تعداد دیسک‌های موجود در قفسه‌ها، من با مشکل رمزگشایی دیسک‌ها با استفاده از روش بیش از حد شناخته شده از طریق /etc/crypttab مواجه شدم. من شخصاً چند مشکل در استفاده از این روش را برجسته می کنم، یعنی اینکه فایل در حال خواندن است فقط پس از بارگذاری (mount) پارتیشن root، که بر واردات ZFS تأثیر منفی می گذارد، به ویژه اگر آنها از پارتیشن هایی در دستگاه *_crypt ساخته شده باشند، یا حملات mdadm ساخته شده از پارتیشن ها نیز. همه ما می دانیم که می توانید از پارتیشن در ظروف LUKS استفاده کنید، درست است؟ و همچنین مشکل شروع زودهنگام سایر خدمات، زمانی که هنوز آرایه ای وجود ندارد، اما استفاده کنید من قبلاً به چیزی نیاز دارم (من با Proxmox VE 5.x و ZFS خوشه ای از طریق iSCSI کار می کنم).

کمی در مورد ZFSoverISCSIiSCSI از طریق LIO برای من کار می کند، و در واقع، زمانی که iscsi target شروع می شود و دستگاه های ZVOL را نمی بیند، به سادگی آنها را از پیکربندی حذف می کند، که از بوت شدن سیستم های مهمان جلوگیری می کند. از این رو، یا بازیابی یک نسخه پشتیبان از فایل json، یا اضافه کردن دستی دستگاه هایی با شناسه برای هر ماشین مجازی، که وقتی ده ها دستگاه از این قبیل وجود دارد و هر پیکربندی بیش از 1 دیسک دارد، به سادگی وحشتناک است.

و سوال دومی که در نظر خواهم گرفت این است که چگونه رمزگشایی کنیم (این نکته کلیدی مقاله است). و ما در مورد این در زیر صحبت خواهیم کرد، زیر برش بروید!

اغلب، در اینترنت، از یک فایل کلید استفاده می شود (که قبل از این توسط دستور به شکاف اضافه می شود - cryptsetup luksAddKey)، یا در موارد استثنایی نادر (در اینترنت روسی زبان اطلاعات بسیار کمی وجود دارد) - اسکریپت decrypt_derived واقع در /lib/cryptsetup/script/ (البته راه های دیگری هم وجود دارد، اما من از این دو استفاده کردم که اساس مقاله را تشکیل دادند). من همچنین پس از راه‌اندازی مجدد، بدون هیچ دستور اضافی در کنسول، تلاش کردم تا همه چیز برای من "بالا" باشد. بنابراین، چرا صبر کنید؟ -

بیایید شروع کنیم!

فرض کنید سیستمی مانند دبیان روی یک پارتیشن رمزنگاری 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 یا چه ZFS، پیدا و انتخاب می کند. mdadm بدون مشکل مونتاژ میشه! و همه اینها قبل از بارگیری خدمات اصلی و خدماتی که به این دیسک ها/آرایه ها نیاز دارند.

بروزرسانی 1: چگونه متوجه شدم AEP، این روش فقط برای LUKS1 کار می کند.

منبع: www.habr.com

اضافه کردن نظر