Kali Linux на Raspberry Pi (A/B+/2) с диском LUKS

С появлением более маленьких и более быстрых ARM устройств, таких как новый Raspberry Pi 2 (для которого сейчас собран образ Kali), мы наблюдаем всё более и более частое использование маленьких устройств в качестве «чемоданчика хакера на подхвате». Будучи новой и новаторской технологией, есть один большой недостаток этой концепции — а именно конфиденциальность данных, сохранённых на самом устройстве. В большинстве установок, которые мы видели, сделано мало для защиты чувствительной информации, сохранённой на SD картах этих маленьких компьютеров. Этот факт в купе с дружескими подталкиванием обусловили запрос на создание зашифрованного LUKS, поддерживающего возможность NUKE (самоуничтожения) образа Kali Linux для наших устройств Raspberry Pi. Ниже описано как это сделать. Т.е. вы можете повторить этот процесс и заиметь самому эту клёвость.

Взгляд с высоты птичьего полёта на процесс шифрования диска

Описанный здесь процесс был опробован и успешно прошёл тесты на Raspberry Pi B+ и Raspberry Pi 2 (далее будем называть просто “RPi”). Но вообще должно быть тривиальной задачей применить эту инструкцию к любому устройству ARM, на котором запущена Kali. До того как мы начнём, давайте уделим минутку быстрому описанию того, что мы будем делать — сам процесс несложный, но требует некоторых действий. Коротко говоря, основы заключаются в том, что:

  1. Мы скачиваем необходимый образ Kali Raspberry Pi RPi и записываем его с помощью dd на SD карту.
  2. Мы делаем chroot для образа RPi и устанавливаем/обновляем несколько файлов для нашего зашифрованного загрузчика.
  3. Мы создаём файл initramfs, который включает Dropbear и свеже сгенерированнные ключи SSH.
  4. Мы делам rsync модифицированой rootfs во временно расположение резервной копии, а затем удаляем раздел rootfs с SD.
  5. Затем мы заново создаём зашифрованный раздел, на который мы восстановим данные раздела рута. Вот и всё!

Если всё пройдёт успешно, 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 карте недоступными.

2 комментария

  1. для Raspberry Pi 3 другой алгоритм действий?
    не получается по данной статье…

    1. Ну «автор» особо не думал когда переводил эту инструкцию с оф.сайта.
      А так да, алгоритм тот же.
      Напиши на каком месте запнулся, помогу.

Добавить комментарий для kkgg Отменить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *