فك تشفير حاوية LUKS في وقت تمهيد النظام

نهارا ومساءا طيبا للجميع! سيكون هذا المنشور مفيدًا لأولئك الذين يستخدمون تشفير بيانات LUKS ويريدون فك تشفير الأقراص ضمن Linux (Debian ، Ubuntu) على مراحل فك تشفير قسم الجذر. ولم أجد مثل هذه المعلومات على الإنترنت.

في الآونة الأخيرة ، مع زيادة عدد الأقراص في الرفوف ، واجهت مشكلة فك تشفير الأقراص باستخدام أكثر من طريقة معروفة من خلال / etc / crypttab. أنا شخصياً أسلط الضوء على بعض المشاكل في استخدام هذه الطريقة ، وهي أن الملف قيد القراءة فقط بعد تحميل (تحميل) قسم الجذر، مما يؤثر سلبًا على واردات ZFS ، لا سيما إذا تم إنشاؤها من أقسام على جهاز * _crypt أو غارات mdadm التي تم إنشاؤها من الأقسام أيضًا. نعلم جميعًا أنه يمكنك استخدام حاويات LUKS مفترقة ، أليس كذلك؟ وأيضًا مشكلة البداية المبكرة للخدمات الأخرى ، عندما لا توجد مصفوفات بعد ، ولكن استخدم أنا بالفعل بحاجة إلى شيء ما (أعمل مع Proxmox VE 5.x المجمع و ZFS عبر بروتوكول iSCSI).

قليلا عن ZFSoverISCSIيعمل iSCSI من أجلي من خلال LIO ، وفي الواقع عندما يبدأ هدف iscsi ولا يرى أجهزة ZVOL ، فإنه يزيلها ببساطة من التكوين ، مما يمنع أنظمة الضيف من التشغيل. ومن ثم ، فإما استعادة نسخة احتياطية من ملف json ، أو إضافة الأجهزة يدويًا مع معرفات لكل جهاز افتراضي ، وهو أمر مروع ببساطة عندما يكون هناك العشرات من هذه الأجهزة وكل تكوين يحتوي على أكثر من قرص واحد.

والسؤال الثاني الذي سأفكر فيه هو كيفية فك التشفير (هذه هي النقطة الأساسية في المقالة). وسنتحدث عن هذا أدناه ، اذهب تحت الخفض!

في أغلب الأحيان ، على الإنترنت ، يتم استخدام ملف مفتاح (تتم إضافته ذاتيًا إلى الفتحة قبل ذلك بواسطة الأمر - cryptsetup luksAddKey) ، أو في استثناءات نادرة (توجد معلومات قليلة جدًا على الإنترنت باللغة الروسية) - البرنامج النصي decrypt_derived موجود في / lib / cryptsetup / script / (بالطبع ، هناك طرق أخرى ، لكنني استخدمت هذين الأسلوبين ، اللذين شكلا أساس المقالة). لقد سعيت أيضًا إلى التضمين الذاتي الكامل بعد عمليات إعادة التشغيل ، دون أي أوامر إضافية في وحدة التحكم ، بحيث "يطير" كل شيء من أجلي مرة واحدة. لذلك لماذا الانتظار؟ -

دعنا نبدأ!

لنفترض وجود نظام ، مثل دبيان ، مثبتًا على قسم تشفير sda3_crypt وعشرات الأقراص جاهزة للتشفير وإنشائها وفقًا لمحتوى قلبك. لدينا عبارة مرور (عبارة مرور) لإلغاء تأمين sda3_crypt ، ومن هذا القسم سنقوم بإزالة "التجزئة" من كلمة المرور على نظام التشغيل (الذي تم فك تشفيره) وإضافته إلى باقي الأقراص. كل شيء أساسي ، في وحدة التحكم نقوم بتنفيذها:

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

حيث X هي أقراصنا وأقسامنا وما إلى ذلك.

بعد تشفير الأقراص باستخدام "تجزئة" من عبارة المرور الخاصة بنا ، تحتاج إلى معرفة UUID أو المعرف - اعتمادًا على من اعتاد على ماذا وماذا. نأخذ البيانات من / 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

محتويات ../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

وأخيرًا ، قبل التحديث-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 "تبحث | السائق".

الآن بعد أن انتهينا وجميع الملفات في مكانها ، قم بتشغيل تحديث-initramfs -u -k all -v، في التسجيل يجب ألا يكون أخطاء تنفيذ نصوصنا. نعيد التشغيل ، وندخل عبارة المرور وننتظر قليلاً ، اعتمادًا على عدد الأقراص. بعد ذلك ، سيبدأ النظام وفي المرحلة الأخيرة من الإطلاق ، أي بعد "تثبيت" قسم الجذر ، سيتم تنفيذ الأمر partprobe - سيجد ويلتقط جميع الأقسام التي تم إنشاؤها على أجهزة LUKS وأي مصفوفات ، سواء كانت ZFS أو مدادم ، سيتم تجميعها دون مشاكل! وكل هذا قبل التحميل الخدمات الأساسية والخدمات التي تحتاج هذه الأقراص / المصفوفات.

update1: كيف لقد لاحظت AEP,ru، تعمل هذه الطريقة فقط مع LUKS1.

المصدر: www.habr.com

إضافة تعليق