
Полное шифрование диска для Kali на Raspberry с использованием 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) рабочий скрипт сборки для 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-карты и готовим initramfs, способный работать с LUKS, в среде chroot. Для этого на файловой системе SD-карты требуется двоичный файл qemu-arm-static для архитектуры x86 (хоста). Вышеупомянутый патченный скрипт сборки 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):
# 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
Размонтируйте файловые системы и сделайте резервную копию корневой файловой системы перед созданием зашифрованного тома (и удалением всего) на 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
Восстановите корневую файловую систему на зашифрованный том и закройте диск:
# 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
## предоставьте пароль
# 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.