الترابط وخادم SSH في initramfs


كل نظام هو حل وسط بين الأمن وسهولة الاستخدام.


في NAS المدمج ، كانت هناك مشكلة خطيرة: كان من المستحيل إعادة تشغيل النظام دون وجوده ، مما قلل من مستوى توفر البيانات.


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


بفضل تلميح من ValdikSS ، تم حل هذه المشكلة. لكن ...



كنت بحاجة إلى ربط الواجهة وفتح SSH عن بعد. ولم أجد دليلًا يمكن تنفيذه على الفور حتى يعمل كما أحتاج.


لذلك ، أحمل الإصدار الخاص بي من الحل مع الترابط و IP الديناميكي ، حيث يمكن فتح النظام ، محليًا وعن بُعد.


أذكرك أنه من أجل تنفيذ هذه الإعدادات ، يجب أن يكون لديك وصول مادي محلي إلى قدرات NAS والتمهيد الاحتياطي.


الترابط في initramfs


نظرًا لأنه في NAS ، يتم الجمع بين واجهتين في قناة واحدة ، فقد تقرر أيضًا القيام بذلك عند التمهيد.


من السؤال "استخدام NFS-root مع واجهات مرتبطة" أخذت النص. ساعدت المقالة "كيفية إدارة ارتباط لينكس دون ifenslave باستخدام sysfs" في إنشاء الترابط.


تحتاج أولاً إلى تضمين الوحدات النمطية في initramfs المستخدمة لتشغيل الشبكة. يتم ذلك باستخدام الأمر التالي:


while read m _; do /sbin/modinfo -F filename "$m"; done </proc/modules | sed -nr "s@^/lib/modules/`uname -r`/kernel/drivers/net(/.*)?/([^/]+)\.ko\$@\2@p" >> /etc/initramfs-tools/modules 

الآن نسخ النصين إلى /etc/initramfs-tools/scripts/ .


الأول مطلوب من أجل رفع الواجهات في الترابط:


/ etc / initramfs-tools / scripts / init-premount / 00_bonding_init
 #!/bin/sh -e PREREQS="" case $1 in prereqs) echo "${PREREQS}"; exit 0;; esac BOND_MASTER=${BOND_MASTER:-bond0} echo "Network interfaces loaded: " echo `ls /sys/class/net` if [ ! -e "/sys/class/net/${BOND_MASTER}" ]; then echo "Creating bonding master 'bond0'..." echo "+${BOND_MASTER}" > /sys/class/net/bonding_masters fi echo "Master interface: ${BOND_MASTER}" for x in $cmdline; do case $x in bondslaves=*) bondslaves="${x#bondslaves=}" ;; esac done IFS="," for x in $bondslaves; do echo "+$x" > "/sys/class/net/${BOND_MASTER}/bonding/slaves" done 

والثاني هو تعطيل واجهة الترابط بينما يستمر التحميل:


/ etc / initramfs-tools / scripts / init-bottom / iface_down
 #!/bin/sh -e PREREQS="" case $1 in prereqs) echo "${PREREQS}"; exit 0;; esac if [ ! -d /sys/class/net/bond0 ]; then exit 0 fi echo "Remove bonding interface..." for x in $cmdline; do case $x in bondslaves=*) bondslaves="${x#bondslaves=}" ;; esac done IFS="," for x in $bondslaves; do echo "-$x" > /sys/class/net/bond0/bonding/slaves done echo "-bond0" > /sys/class/net/bonding_masters 

إذا لم يتم ذلك ، فلن تعمل الشبكة بعد التمهيد.


لا تنس إعطاء الإذن بتنفيذ النصوص البرمجية:


 chmod +x /etc/initramfs-tools/scripts/init-premount/00_bonding_init /etc/initramfs-tools/scripts/init-bottom/iface_down 

يبقى فقط لتعيين الواجهات التي سيتم تضمينها في الترابط والمعلمات للحصول على العنوان.
سيتم الحصول على العنوان عبر DHCP ، لأنه سيكون للربط نفس MAC كما هو الحال بعد التمهيد ، لأن جهاز التوجيه سيصدر عنوان IP ثابتًا ويعيد توجيه المنافذ.


أحصل على الواجهات تلقائيًا من تلك المضمنة في السندات 0 أثناء تشغيل NAS:


 sed -i "s/\(GRUB_CMDLINE_LINUX_DEFAULT=\)\"\(.*\)\"/\1\"\2 $(echo -n ip=:::::bond0:dhcp bondslaves=$(sed -e 's/ /,/' /sys/class/net/bond0/bonding/slaves))\"/" /etc/default/grub 

أخيرًا ، حدّث تهيئة GRUB وصورة initramfs:


 update-grub update-initramfs -u -k $(uname -r) 

هذا كل شيء. إذا تم تكوين كل شيء بشكل صحيح ، بعد إعادة التشغيل وبدء البرنامج النصي لبدء التشغيل في initrmafs ، ​​ستبدأ عمليات ping على IP NAS ، على الرغم من حقيقة أن نظام التشغيل لم يتم تحميله بعد.


ألاحظ أن إعداد الترابط في Dracut أصبح أسهل كثيرًا ، نظرًا لوجود نصوص برمجية بالفعل في التسليم .


خادم SSH في initramfs


قم بتثبيت الحزمة لتمكين Dropbear SSH في initramfs:


 apt-get install dropbear-initramfs 

سيتم تضمين Dropbear SSH في initrmafs تلقائيًا ، وسيبدأ إذا تم رفع واجهة شبكة واحدة على الأقل بعنوان IP في مرحلة مبكرة من التمهيد.


بعد ذلك ، قم بتحويل مفتاح Dropbear إلى تنسيق OpenSSH وأغلقه بكلمة مرور:


 /usr/lib/dropbear/dropbearconvert dropbear openssh \ /etc/dropbear/dropbear_rsa_host_key \ id_rsa dropbearkey -y -f /etc/dropbear/dropbear_rsa_host_key | \ grep "^ssh-rsa " > id_rsa.pub ssh-keygen -p -f id_rsa 

يتم id_rsa مفتاح id_rsa إلى الجهاز الذي سيتم تنفيذ إلغاء القفل به. سأفترض أنه سيتم نسخه إلى دليل ~/.ssh/dropbear .


في /etc/dropbear-initramfs/authorized_keys ، يجب تحديد بصمات المفتاح والمعلمات لكل مفتاح.


في الوقت الحالي ، ما عليك سوى إضافة بصمة مفتاح واحد ، والتي تحتاج إلى تشغيل الأمر التالي لها:


 echo 'no-port-forwarding,no-agent-forwarding,no-X11-forwarding,command="/bin/unlock"' $(cat id_rsa.pub) >> /etc/dropbear-initramfs/authorized_keys 

ليست هناك حاجة إلى أغلفة مذكورة في المقالات ، /bin/unlock - البرنامج النصي للنظام (cryptroot-unlock).


هذا هو شكل /etc/dropbear-initramfs/authorized_keys في النهاية:


 no-port-forwarding,no-agent-forwarding,no-X11-forwarding,command="/bin/unlock" ssh-rsa AAAA...XDa root@nas 

تحديث صورة GRUB config و initramfs وإعادة التشغيل:


 update-grub update-initramfs -u -k $(uname -r) reboot 

من الجهاز الذي نسخت المفتاح ، أصبح من الممكن الآن الاتصال بـ NAS وفتح:


 $ ssh -i .ssh/dropbear/id_rsa_initram -o UserKnownHostsFile=.ssh/dropbear/known_hosts root@nas.NAS.cloudns.cc Enter passphrase for key '.ssh/dropbear/id_rsa_initram': X11 forwarding request failed on channel 0 Please unlock disk root_crypt1 (/dev/disk/by-id/ata-Samsung_SSD_850_PRO_256GB-part3): 

بعد ذلك ، ستحصل وحدة التحكم باستمرار على خطأ حول عدم وجود حجة ( ash: -gt: argument expected ) ، ولكن سيتم إلغاء القفل. هذا خطأ في البرنامج النصي لإلغاء تأمين النظام ولا يؤثر على أي شيء (يتم تصحيح الخطأ بسهولة ، ولكن لا تعالجه الأغلفة).


يمكن العثور على مزيد من التفاصيل في هذه المقالات:



تصحيح الأخطاء


للتصحيح ، يمكنك إدراج مكالمة إلى /bin/sh في البرنامج النصي 00_bonding_init بعد:


 case $1 in prereqs) echo "${PREREQS}"; exit 0;; esac 

عندما يتم حل مشكلات الربط ، استبدل command="/bin/unlock" command="/bin/sh" في command="/bin/sh" authorized_keys .


بعد الاتصال عبر SSH ، سيظهر لك غلاف يمكنك استخدامه لتصحيح الأخطاء.

Source: https://habr.com/ru/post/ar419915/


All Articles