
تشفير القرص بالكامل لكالي على راسبيري باستخدام LUKS
هذا الدليل مخصص لتشغيل Kali على Raspberry (أو أي بنية مماثلة أخرى، مثل ODROID-C2 باستخدام تشفير القرص الكامل مع LUKS. وهو مبني على مستند قديم بعض الشيء هنا.
نشر Kali على Raspberry Pi (أو أجهزة مماثلة صغيرة ومنخفضة الطاقة) في بيئة شبكة محلية كـ «صندوق اختراق يُرمى بعد الاستخدام» مفيد بوضوح. ومع ذلك، فإن إبقاء البيانات المجمّعة سرًا هو مطلب أساسي. وهنا يأتي تشفير القرص الكامل كمفهوم أمني إلزامي.
أولاً ينبغي علينا إعداد صورة Kali رسمية حالية لـ Raspberry Pi (بدون تشفير) على بطاقة SD.
الخيار الموصى به (حاليًا) هو استخدام نسخة مخصصة من Raspberry Pi 3 مع تصحيح nexmon (لاستخدام إمكانيات مراقبة وحقن WiFi المدمجة). يوجد نص برمجي آلي للبناء في مستودع kali-arm-build-scripts الرسمي الذي يُنشئ الصورة من الصفر (على توزيعة Kali). وهنا نسخة معدّلة تعمل أيضًا على توزيعات أخرى غير Kali (مختبرة على Gentoo). حاليًا (2017-08) يعمل نص بناء لـ ODROID-C2 أيضًا في هذا المستودع المتفرّع.
احصل على أدوات البناء وقم ببناء الصورة من الصفر بصلاحيات الجذر (قد يستغرق ذلك بضع ساعات):
$ git clone https://github.com/tothi/kali-arm-build-scripts
$ cd kali-arm-build-scripts
$ sudo ./rpi3-nexmon.sh 2.0
الصورة الناتجة هي rpi3-nexmon-2.0/kali-2.0-rpi3-nexmon.img.xz.
انسخها على بطاقة SD (باستخدام pv لعرض التقدم):
# pixz -d rpi3-nexmon-2.0/kali-2.0-rpi3-nexmon.img.xz - | pv -treb | dd of=/dev/mmcblk0 bs=512k
(يجب أن تعمل الصورة، ويمكن اختبارها الآن.)
نقوم بتركيب الصورة من بطاقة SD وتجهيز initramfs
قادر على ميزات LUKS داخل بيئة chroot. ولإنجاح
هذا العمل، يلزم وجود ملف ثنائي qemu-arm-static خاص بـ x86 (المضيف)
على نظام ملفات بطاقة SD. نص البناء المعدّل rpi3-nexmon.sh
أعلاه يقوم بتثبيته وتركه على الصورة، لذا فالأمور
ينبغي أن تعمل بشكل جيد. (وإلا فنسخ ملف qemu
الثابت المناسب إلى الصورة أمر مطلوب.)
تهيئة بيئة chroot (على النظام المضيف بصلاحيات الجذر):
# mkdir -p /mnt/chroot/boot
# mount /dev/mmcblk0p2 /mnt/chroot/
# mount /dev/mmcblk0p1 /mnt/chroot/boot/
# mount -t proc none /mnt/chroot/proc
# mount -t sysfs none /mnt/chroot/sys
# mount -o bind /dev /mnt/chroot/dev
# mount -o bind /dev/pts /mnt/chroot/dev/pts
# LANG=C chroot /mnt/chroot/
أولاً نغيّر كلمة المرور الافتراضية للجذر:
passwd
تثبيت الحزم المطلوبة (في بيئة chroot):
# apt-get update
# apt-get install busybox cryptsetup dropbear
لاحظ أنه يتعين علينا إدخال مفتاح فك التشفير
عند كل إقلاع. ويفضَّل القيام بذلك عن بُعد عبر SSH،
ولهذا السبب نحتاج إلى dropbear (داخل initramfs).
الآن عدّل /boot/cmdline.txt، وقم بتغيير جهاز الجذر إلى
جهاز التشفير المعيّن (/dev/mapper/crypt_sdcard)
وأضف معامل cryptdevice المناسب.
إذن إليك ملف /boot/cmdline.txt الأصلي:
dwc_otg.fiq_fix_enable=2 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 rootwait rootflags=noload net.ifnames=0
وهذه هي النسخة المحدّثة (الاختلافات في معاملي root وcryptdevice):
dwc_otg.fiq_fix_enable=2 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mapper/crypt_sdcard cryptdevice=/dev/mmcblk0p2:crypt_sdcard rootfstype=ext4 rootwait rootflags=noload net.ifnames=0
الآن أنشئ /boot/config.txt بالمحتوى التالي:
initramfs initramfs.gz followkernel
لاحظ أنه على الأجهزة الأخرى يلزم اتخاذ خطوات مماثلة
(الملف الذي يحتوي معاملات الإقلاع على ODROID-C2 هو
/boot/boot.ini).
لنقم بإعداد مصادقة مفتاح SSH الخاصة بـ Dropbear. أنشئ زوج مفاتيح (بدون كلمة مرور) على جهاز المضيف (خارج chroot!) واقرأ المفتاح العام:
$ ssh-keygen -N "" -f kali-dropbear
$ cat ./kali-dropbear.pub
أضف المفتاح العام إلى /etc/dropbear-initramfs/authorized_keys.
قيّد وصول Dropbear عبر SSH لإعداد cryptroot فقط
بإضافة هذا أمام المفتاح:
command="/scripts/local-top/cryptroot && kill -9 `ps | grep -m 1 'cryptroot' | cut -d ' ' -f 3`"
أصلح الأذونات:
chmod 600 /etc/dropbear-initramfs/authorized_keys
عدّل /etc/fstab. الأصلي:
# <file system> <mount point> <type> <options> <dump> <pass>
proc /proc proc defaults 0 0
/dev/mmcblk0p1 /boot vfat defaults 0 2
/dev/mmcblk0p2 / ext4 defaults,noatime 0 1
الجهاز / المحدّث تغيّر إلى /dev/mapper/crypt_sdcard:
# <file system> <mount point> <type> <options> <dump> <pass>
proc /proc proc defaults 0 0
/dev/mmcblk0p1 /boot vfat defaults 0 2
/dev/mapper/crypt_sdcard / ext4 defaults,noatime 0 1
أضف هذا السطر إلى /etc/crypttab:
crypt_sdcard /dev/mmcblk0p2 none luks
عدّل /etc/cryptsetup-initramfs/conf-hook بتعيين
CRYPTSETUP=y
لتضمين ملفات cryptsetup في صورة initramfs.
أخيرًا، أنشئ initramfs لإصدارة النواة الحالية واخرج من chroot (لا تهتم بالأخطاء/التحذيرات أثناء mkinitramfs):
# ls -l /lib/modules/ |awk -F" " '{print $9}'
4.4.50-v7+
# mkinitramfs -o /boot/initramfs.gz 4.4.50-v7+
لاحظ أنه يتعين علينا توخي الحذر عند إنشاء الصورة
(خاصة على الأجهزة الأخرى)، لأن
uname -r يُرجع إصدارة نواة المضيف وليس إصدارة chroot.
لذلك على سبيل المثال على ODROID-C2، لا يعمل /boot/mkuinitrd مباشرة
خارج الصندوق، بل يجب تنفيذ الأوامر الواردة في البرنامج النصي يدويًا
(مع تعديل إصدارة النواة للأجهزة الأخرى!):
# rm /boot/initrd.img-3.14.79
# update-initramfs -c -k 3.14.79
# mkimage -A arm64 -O linux -T ramdisk -C none -a 0 -e 0 -n "uInitrd" -d /boot/initrd.img-3.14.79 /boot/uInitrd
#
اخرج من بيئة chroot
exit
قم بفك تركيب أنظمة الملفات وانسخ rootfs احتياطيًا قبل إنشاء وحدة تخزين مشفرة (وحذف كل شيء) على بطاقة SD:
# umount /mnt/chroot/boot
# umount /mnt/chroot/sys
# umount /mnt/chroot/proc
# mkdir -p /mnt/backup
# rsync -avh /mnt/chroot/* /mnt/backup/
قم بفك تركيب chroot بالكامل:
# umount /mnt/chroot/dev/pts
# umount /mnt/chroot/dev
# umount /mnt/chroot
احذف قسم الجذر غير المشفّر (رقم 2) وأنشئ قسمًا فارغًا (بما يملأ بطاقة SD):
# echo -e "d\n2\nw" | fdisk /dev/mmcblk0
# echo -e "n\np\n2\n\n\nw" | fdisk /dev/mmcblk0
الآن (غالبًا) يلزم نزع بطاقة SD وإعادة إدخالها لتسجيل الأقسام الجديدة.
أنشئ وحدة تخزين مشفرة بكلمة مرور قوية (هذه الخطوة تدمر نظام الجذر الأصلي!):
# cryptsetup -v -y --cipher aes-cbc-essiv:sha256 --key-size 256 luksFormat /dev/mmcblk0p2
# cryptsetup -v luksOpen /dev/mmcblk0p2 crypt_sdcard
# mkfs.ext4 /dev/mapper/crypt_sdcard
استعد rootfs إلى وحدة التخزين المشفرة وأغلق القرص:
# mkdir -p /mnt/encrypted
# mount /dev/mapper/crypt_sdcard /mnt/encrypted/
# rsync -avh /mnt/backup/* /mnt/encrypted/
# umount /mnt/encrypted/
# cryptsetup luksClose /dev/mapper/crypt_sdcard
# sync
أخرج بطاقة SD واختبرها على Raspberry.
ستفشل عملية الإقلاع الأولى وسيتم الرجوع إلى busybox. أدخل الأوامر التالية:
# cryptsetup luksOpen /dev/mmcblk0p2 crypt_sdcard
## provide password
# exit
يجب أن يُقلع جهازك الآن. سجّل الدخول بكلمة المرور التي اخترتها سابقًا وشغّل:
mkinitramfs -o /boot/initramfs.gz
reboot
سيُطلب منك الآن عبارة المرور مع موجه أجمل، كما ينبغي أن تتمكن من الاتصال عبر ssh بـ busybox وإدخال عبارة المرور
(يمكنك استخدام ملف known_hosts مخصص إذا رغبت):
$ ssh -o "UserKnownHostsFile=~/.ssh/known_hosts.initramfs" -i ~/.ssh/kali-dropbear [email protected]
بمجرد أن يعمل الأمر، لا تنسَ تنظيف ملفات النسخ الاحتياطي على المضيف:
# rm -fr /mnt/backup
# rm -fr /mnt/chroot
للحصول على مخرجات تصحيح كاملة أثناء الإقلاع، يمكنك إضافة debug=1 في cmdline.txt