
Raspberry पर Kali के लिए LUKS का उपयोग कर पूर्ण डिस्क एन्क्रिप्शन
यह HOWTO Raspberry (या अन्य समान आर्किटेक्चर, उदा. ODROID-C2) पर LUKS के साथ पूर्ण डिस्क एन्क्रिप्शन का उपयोग करके Kali चलाने के लिए समर्पित है। यह यहाँ दिए गए थोड़े पुराने दस्तावेज़ पर आधारित है।
Raspberry Pi (या अन्य समान, छोटे, कम-शक्ति वाले हार्डवेयर) पर Kali को LAN वातावरण में एक 'डिस्पोजेबल हैकबॉक्स' के रूप में तैनात करना स्पष्ट रूप से उपयोगी है। हालाँकि, एकत्रित डेटा को गुप्त रखना एक अनिवार्य आवश्यकता है। यहीं पर पूर्ण डिस्क एन्क्रिप्शन एक अनिवार्य सुरक्षा अवधारणा के रूप में आता है।
सबसे पहले हमें SD कार्ड पर Raspberry Pi के लिए एक आधिकारिक वर्तमान Kali इमेज (बिना एन्क्रिप्शन के) सेटअप करनी चाहिए।
अनुशंसित विकल्प (अभी) nexmon पैच के साथ Raspberry Pi 3 कस्टम बिल्ड का उपयोग करना है (ऑनबोर्ड WiFi मॉनिटरिंग और इंजेक्ट करने की क्षमताओं का उपयोग करने के लिए)। आधिकारिक kali-arm-build-scripts रिपो में एक स्वचालित बिल्ड स्क्रिप्ट है जो इमेज को शुरू से (Kali डिस्ट्रो पर) तैयार करती है। और यहाँ एक पैच किया हुआ संस्करण है जो Kali के अलावा अन्य डिस्ट्रो पर भी काम करता है (Gentoo पर परीक्षण किया गया)। वर्तमान में (2017-08) ODROID-C2 के लिए कार्यशील बिल्ड स्क्रिप्ट भी उस फोर्क की गई रिपो में मौजूद है।
बिल्ड टूल्स प्राप्त करें और इमेज को root के रूप में शुरू से बनाएँ (इसमें कुछ घंटे लग सकते हैं):
$ 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 कार्ड से इमेज को माउंट करते हैं और chroot वातावरण में LUKS सुविधाओं में सक्षम एक initramfs तैयार करते हैं। इसे कार्यशील बनाने के लिए, SD कार्ड फाइलसिस्टम पर एक x86 (होस्ट) qemu-arm-static बाइनरी की आवश्यकता होती है। उपरोक्त पैच की गई rpi3-nexmon.sh बिल्ड स्क्रिप्ट इसे इंस्टॉल करती है और इमेज पर छोड़ देती है, इसलिए चीजें अच्छी तरह काम करनी चाहिए। (अन्यथा उपयुक्त qemu स्टैटिक बाइनरी को इमेज पर कॉपी करना आवश्यक है।)
chroot वातावरण को इनिशियलाइज़ करना (होस्ट सिस्टम पर root के रूप में):
# 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/
सबसे पहले हम root के लिए डिफ़ॉल्ट पासवर्ड बदलते हैं:
passwd
आवश्यक पैकेज इंस्टॉल करें (chroot env में):
# apt-get update
# apt-get install busybox cryptsetup dropbear
ध्यान दें, कि हमें हर बूट पर डिक्रिप्शन कुंजी दर्ज करनी होती है। हम इसे अधिमानतः SSH के माध्यम से दूरस्थ रूप से करते हैं, इसीलिए (initramfs में) dropbear की आवश्यकता होती है।
अब /boot/cmdline.txt संपादित करें, root डिवाइस को मैप किए गए crypt डिवाइस (/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 है)।
आइए Dropbear SSH कुंजी प्रमाणीकरण सेट करें। होस्ट मशीन पर (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
ताकि initramfs इमेज में cryptsetup फाइलें शामिल हों।
अंत में, वर्तमान कर्नेल संस्करण के लिए 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
SD कार्ड पर एन्क्रिप्टेड वॉल्यूम बनाने (और सब कुछ हटाने) से पहले फाइलसिस्टम को अनमाउंट करें और rootfs का बैकअप लें:
# 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
अनएन्क्रिप्टेड root पार्टीशन (नं. 2) को हटाएँ और एक खाली पार्टीशन बनाएँ (SD कार्ड को भरते हुए):
# echo -e "d\n2\nw" | fdisk /dev/mmcblk0
# echo -e "n\np\n2\n\n\nw" | fdisk /dev/mmcblk0
अब नए पार्टीशन को पंजीकृत करने के लिए (संभवतः) SD कार्ड को निकालकर पुनः लगाने की आवश्यकता है।
एक मजबूत पासफ्रेज़ के साथ एन्क्रिप्टेड वॉल्यूम बनाएँ (यह चरण मूल rootfs को नष्ट कर देता है!):
# 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
अब आपसे एक बेहतर प्रॉम्प्ट के साथ पासफ्रेज़ पूछा जाएगा, इसके अलावा आप busybox में ssh करके पासफ्रेज़ दर्ज करने में सक्षम होंगे (यदि आप चाहें तो एक कस्टम known_hosts फ़ाइल का उपयोग कर सकते हैं):
$ ssh -o "UserKnownHostsFile=~/.ssh/known_hosts.initramfs" -i ~/.ssh/kali-dropbear [email protected]
एक बार यह काम कर जाए, तो होस्ट पर बैकअप फाइलों को साफ करना न भूलें:
# rm -fr /mnt/backup
# rm -fr /mnt/chroot
बूट के दौरान पूर्ण डीबग आउटपुट प्राप्त करने के लिए आप cmdline.txt में debug=1 जोड़ सकते हैं