С появлением более маленьких и более быстрых ARM устройств, таких как новый Raspberry Pi 2 (для которого сейчас собран образ Kali), мы наблюдаем всё более и более частое использование маленьких устройств в качестве «чемоданчика хакера на подхвате». Будучи новой и новаторской технологией, есть один большой недостаток этой концепции — а именно конфиденциальность данных, сохранённых на самом устройстве. В большинстве установок, которые мы видели, сделано мало для защиты чувствительной информации, сохранённой на SD картах этих маленьких компьютеров. Этот факт в купе с дружескими подталкиванием обусловили запрос на создание зашифрованного LUKS, поддерживающего возможность NUKE (самоуничтожения) образа Kali Linux для наших устройств Raspberry Pi. Ниже описано как это сделать. Т.е. вы можете повторить этот процесс и заиметь самому эту клёвость.
Взгляд с высоты птичьего полёта на процесс шифрования диска
Описанный здесь процесс был опробован и успешно прошёл тесты на Raspberry Pi B+ и Raspberry Pi 2 (далее будем называть просто “RPi”). Но вообще должно быть тривиальной задачей применить эту инструкцию к любому устройству ARM, на котором запущена Kali. До того как мы начнём, давайте уделим минутку быстрому описанию того, что мы будем делать — сам процесс несложный, но требует некоторых действий. Коротко говоря, основы заключаются в том, что:
- Мы скачиваем необходимый образ Kali Raspberry Pi RPi и записываем его с помощью dd на SD карту.
- Мы делаем chroot для образа RPi и устанавливаем/обновляем несколько файлов для нашего зашифрованного загрузчика.
- Мы создаём файл initramfs, который включает Dropbear и свеже сгенерированнные ключи SSH.
- Мы делам rsync модифицированой rootfs во временно расположение резервной копии, а затем удаляем раздел rootfs с SD.
- Затем мы заново создаём зашифрованный раздел, на который мы восстановим данные раздела рута. Вот и всё!
Если всё пройдёт успешно, RPi будет загружаться, а затем LUKS будет выкидывать нас на ввод пароля для расшифровывания диска рута, одновременно открывая сессию Dropbear SSH, через которую вы можете подключиться по SSH и ввести пароль расшифровки загрузчика. Ах да, мы уже сказали, что этот образ будет иметь функцию LUKS NUKE (самоуничтожения при вводе заранее заданного пароля)?
Начинаем работать руками
Как всегда, все наши ARM dev сделаны на машине Kali amd64 и мы мы убедились, что имеются все необходимые зависимости, которые нам нужны. Мы загружаем последний образ Kali RPi (1.1.0), извлекаем его и записываем с помощью dd на нашу SD карту, которая в нашем случае показывается как sdb2 — у вас она может быть названа по-другому, учитывайте это!
dd if=/root/kali-1.1.0-rpi.img of=/dev/sdb bs=4M
После использования dd мы монтируем различные разделы и делаем chroot в образе Kali RPi:
mkdir -p /mnt/chroot/boot mount /dev/sdb2 /mnt/chroot/ mount /dev/sdb1 /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 cp /usr/bin/qemu-arm-static /mnt/chroot/usr/bin/ LANG=C chroot /mnt/chroot/
Затем мы обновляем наш образ и устанавливаем некоторые базовые пакеты, которые нам нужны для этого процесса:
apt-get update apt-get install busybox cryptsetup dropbear
Мы создаём первоначальный файл initramfs, который будет триггером для генерации ключей dropbear SSH. Сначала мы узнаём версию модулей директории как показано ниже (она может различаться в зависимости от различных версий образов):
root@kali:/# ls -l /lib/modules/ |awk -F" " '{print $9}' 3.12.36
Затем мы используем информацию о версии для генерирования базового файла initramfs.
mkinitramfs -o /boot/initramfs.gz 3.12.36
Мы настраиваем службу OpenSSH так, чтобы она запускалась при загрузке, не забывая изменить пароль по умолчанию.
update-rc.d ssh enable passwd
Далее мы проверяем, что директория /boot смонтирована и если так, мы изменяем параметры загрузки в cmdline.txt и config.txt.
nano /boot/cmdline.txt
…и добавляем / изменяем следующие параметры:
root=/dev/mapper/crypt_sdcard cryptdevice=/dev/mmcblk0p2:crypt_sdcard rootfstype=ext4
Далее идёт config.txt:
echo initramfs initramfs.gz 0x00f00000 > /boot/config.txt
Теперь мы занимаемся доступом Dropbear SSH. Мы копируем закрытый ключ SSH на наш лэптоп:
cat /etc/initramfs-tools/root/.ssh/id_rsa
И ограничиваем SSH соединение, позволяя ему взаимодействовать только с приложением cryptroot.
nano /etc/initramfs-tools/root/.ssh/authorized_keys
Мы копируем следующее в самом начале публичного ключа ssh.
command="/scripts/local-top/cryptroot && kill -9 `ps | grep -m 1 'cryptroot' | cut -d ' ' -f 3`"
Затем мы создаём fstab и crypttab с нашим сконфигурированным загрузчиком устройства и выходим из chroot:
cat <<EOF > /etc/fstab proc /proc proc defaults 0 0 /dev/mmcblk0p1 /boot vfat defaults 0 2 /dev/mapper/crypt_sdcard / ext4 defaults,noatime 0 1 EOF echo crypt_sdcard /dev/mmcblk0p2 none luks > /etc/crypttab
Во время наших тестов мы заметили, что в некоторых случаях требуется время для пробуждения USB порта, что может похерить инициализацию сетевого initrd Dropbear. Для исправления этого мы можем предоставить 5 секундную задержку до размещения функции configure_networking в самой initrd:
nano /usr/share/initramfs-tools/scripts/init-premount/dropbear
измените:
configure_networking &
на:
echo "Waiting 5 seconds for USB to wake" sleep 5 configure_networking &
Сохраните и выйдете из файла, затем заново сгенерируйте initramfs и выйдите из chroot. Вы можете не обращать внимание на предупреждения cryptsetup и device-mapper.
mkinitramfs -o /boot/initramfs.gz 3.12.36 exit
Теперь мы сносим chroot и делаем резервную копию нашего раздела 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
После окончания этого мы удаляем существующий второй раздел SD карты и пересоздаём новый пустой раздел, который мы настроем как зашифрованный LUKS.
echo -e "dn2nw" | fdisk /dev/sdb echo -e "nnpn2nnnw" | fdisk /dev/sdb
Вынимаем нашу SD карту и подключаем её обратно, чтобы зарегистрировались новые разделы, затем начинаем установку зашифрованного раздела.
cryptsetup -v -y --cipher aes-cbc-essiv:sha256 --key-size 256 luksFormat /dev/sdb2 cryptsetup -v luksOpen /dev/sdb2 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/ rm -rf /mnt/backup sync
Затем мы размонтируем и закрываем том.
cryptsetup luksClose /dev/mapper/crypt_sdcard
Вот оно! Теперь всё, что нам осталось сделать, это загрузиться в RPi с использованием модифицированной SD карты. initramfs загрузит Dropbear и получит DHCP адрес в вашей LAN (вы также можете назначить IP принудительно), это позволит вам подключиться по SSH к загружаемой RPi и ввести пароль расшифрования. Когда пароль принят, Dropbear закроется, а RPi продолжит загрузку. Вы должны увидеть что-то вроде следующего:
root@kali:~# ssh -i key 192.168.0.52 The authenticity of host '192.168.0.52 (192.168.0.52)' can't be established. RSA key fingerprint is a6:a2:ad:7d:cb:d8:70:58:d1:ed:81:e8:4a:d5:23:3a. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.0.52' (RSA) to the list of known hosts. Unlocking the disk /dev/mmcblk0p2 (crypt_sdcard) Enter passphrase: cryptsetup: crypt_sdcard set up successfully Connection to 192.168.0.52 closed. root@kali:~#
Могу я иметь LUKS NUKE (функцию самоуничтожения по паролю) с этой Pi?
Если вы не знакомы с функцией Kali Linux LUKS NUKE, значит вы пропустили что-то важное о Kali. Хотя эта стадия является опциональной, она позволяет настроить и применить пароль для экстренного самоуничтожения вашего зашифрованного диска LUKS. Чтобы сделать это, просто задайте пароль Nuke (самоуничтожения) на вашем зашифрованном разделе:
root@kali:~# cryptsetup luksAddNuke /dev/sdb2 Enter any existing passphrase: (existing passphrase) Enter new passphrase for key slot: (new nuke passphrase) root@kali:~#
С заданным Nuke паролем вы теперь можете удалённо очистить зашифрованный мастер-ключи LUKS, что сделает данные на SD карте недоступными.
для Raspberry Pi 3 другой алгоритм действий?
не получается по данной статье…
Ну «автор» особо не думал когда переводил эту инструкцию с оф.сайта.
А так да, алгоритм тот же.
Напиши на каком месте запнулся, помогу.