Мы рассмотрели, как создать безопасный в использовании Raspberry Pi
Ссылка скрыта от гостей
, но подумали, почему бы не вернуться назад и взглянуть на этот процесс снова. Все новые модели Raspberry Pi и Kali отличаются от охватываемых этим обзором. Мы обнаружили, что старый процесс нуждается в некоторые обновлениях.Рекламная запись: Купить Raspberry Pi в Codeby Market raspberry — Codeby Market
Создание автономного устройства и понимание того, что мы пытаемся достичь, не делает лёгким то, что вы делаете. Таким образом, мы используем шифрование всего диска LUKS наряду с LUKS Nuke и возможность поставить это вместе. Если у вас есть Raspberry Pi 3 модель B, любой другой модели или аналогичное устройство, не стесняйтесь использовать инструкции предоставленные ниже, чтобы настроить свою безопасную систему. Этот обновленный процесс на основе нашей предыдущей документации и обновление с некоторыми предложениями сообщества.
Обзор процесса
Прежде чем мы углубимся в то, что мы будем пытаться достичь, давайте окинем беглым взглядом на наши цели по настройке нашей Raspberry Pi 3 модель B (теперь назовем её «RPi»):
- Обычная установка Kali Linux RPi
- Подготовка системы для зашифрованной загрузки с удаленного разблокированного диска
- Создание initramfs, настроеного с Dropbear и SSH-ключами, чтобы произошла разблокировка
- Резервная копия существующих данных
- Настройка шифрованных разделов
- Восстановление данных
- Настройка LUKS Nuke
- Hack away!
Подготовка базовой системы
Начнем с того, нам нужно записать RPi образ на SD карту. Мы не будем рассказывать здесь как, но вы можете найти информацию об этом
Ссылка скрыта от гостей
.Затем мы вставляем SD карту в RPi и пусть она загружается. При первой загрузке будет изменён размер SD-карты и последует перезагрузка, после этого она готова к использованию. Далее мы подключимся через SSH, обновим Kali и установим несколько пакетов, которые нам будут нужны.
Код:
apt update
apt dist-upgrade
apt install cryptsetup lvm2 busybox dropbear
Делаем Magic Fu
Обратите внимание, как только мы начинаем этот процесс, мы собираемся изменить ряд критически важных файлов на нашей установленой RPi. Важно, чтобы не перезагрузить устройство или иным образом завершить работу системы до тех пор, пока всё готово или вы останетесь с системой, которая не загружается.
Во-первых, мы должны добавить строку /boot/config.txt:
Код:
echo initramfs initramfs.gz followkernel >> /boot/config.txt
Далее нам нужно проверить где расположен наше фактическое корневое устройство файловой системы:
Код:
root@kali:~# cat /etc/fstab
# proc /proc proc defaults 0 0
/dev/mmcblk0p1 /boot vfat defaults 0 2
/dev/mmcblk0p2 / ext4 defaults,noatime 0 1
Отметим, что расположена наша корневая файловая система на /dev/mmcblk0p2. Это то, что мы будем использовать для наших примеров и идти вперед, так что не забудьте обновить инструкции для любого значения, которое вы получили на вашей системе.
Теперь, когда мы знаем наше расположение корневой файловой системы, мы будем редактировать /boot/cmdline.txt . По умолчанию он содержит следующее:
Код:
root@kali:~# cat /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=/dev/mmcblk0p2. Мы будем обновлять его с cryptdevice значением:
Код:
root=/dev/mapper/crypt cryptdevice=/dev/mmcblk0p2:crypt
Изменения, сделанные в нашем файле, выглядят следующим образом:
Код:
root@kali:~# cat /boot/cmdline.txt
dwc_otg.fiq_fix_enable=2 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mapper/crypt cryptdevice=/dev/mmcblk0p2:crypt rootfstype=ext4 rootwait rootflags=noload net.ifnames=0
Нам также необходимо редактировать /etc/fstab и заменить устройство, где наши корневые файловые системы в настоящее время должны быть /dev/mapper/crypt:
Код:
root@kali:~# cat /etc/fstab
# proc /proc proc defaults 0 0
/dev/mmcblk0p1 /boot vfat defaults 0 2
/dev/mapper/crypt / ext4 defaults,noatime 0 1
#/dev/mmcblk0p2 / ext4 defaults,noatime 0 1
Далее нам нужно создать файл /etc/crypttab, содержащий следующее:
Код:
crypt /dev/mmcblk0p2 none luks
Теперь, прежде чем мы начнем создание нашего initramsfs, нам нужно сделать хитрый маленький хак - заставить cryptsetup быть включеным. Для этого мы создадим поддельные файловые системы LUKS. Мы сотрём в dd пустой файл, отформатируем его как LUKS, смонтируем его и поставим на нём файловую систему.
Код:
dd if=/dev/zero of=/tmp/fakeroot.img bs=1M count=20
cryptsetup luksFormat /tmp/fakeroot.img
cryptsetup luksOpen /tmp/fakeroot.img crypt
mkfs.ext4 /dev/mapper/crypt
Не слишком беспокойтесь о настройке надежного пароля для этого fakeroot, поскольку он используется только в этом случае.
Настройка SSH и Initramfs
Сейчас мы находимся на финишной прямой. Эта часть является действительно классной. Как обычно, когда система работает, LUKS стартует, процесс загрузки приостанавливается, чтобы позволить вам разблокировать жёсткий диск с вашим ключом LUKS. Если вы используете систему без заголовков это не является особенно удобным.
Чтобы обойти это, мы собираемся настроить Dropbear, чтобы стартануть и позволить аутентификацию с SSH, а затем подключить вас и предоставить ваш LUKS пароль – и всё удаленно!
Мы начинали с создания файла на /etc/dropbear-initramfs/authorized_keys, который содержит:
Код:
command="export PATH='/sbin:/bin/:/usr/sbin:/usr/bin'; /scripts/local-top/cryptroot && kill -9 `ps | grep -m 1 'cryptroot' | cut -d ' ' -f 3` && exit"
Важно отметить, это должно быть всё в одной строке. Линия не влезает там вообще. Если у вас есть этот набор напрямую, он должен выглядеть подобным образом:
Код:
root@kali:~# cat /etc/dropbear-initramfs/authorized_keys
command="export PATH='/sbin:/bin/:/usr/sbin:/usr/bin'; /scripts/local-top/cryptroot && kill -9 `ps | grep -m 1 'cryptroot' | cut -d ' ' -f 3` && exit" ssh-rsa AAAAB3NzaC... user@system
Далее мы сделаем небольшие изменения в /usr/share/initramfs-tools/scripts/init-premount/dropbear. Это изменение для того, что нам нужно замедлить Dropbear и обеспечить что сеть настроена, прежде чем выкинет из Dropbear. В конце файла где говорится:
Код:
# On NFS mounts, wait until the network is configured. On local mounts,
# configure the network in the background (in run_dropbear()) so someone
# with console access can enter the passphrase immediately. (With the
# default ip=dhcp, configure_networking hangs for 5mins or so when the
# network is unavailable, for instance.)
[ "$BOOT" != nfs ] || configure_networking
run_dropbear &
echo $! >/run/dropbear.pid
Мы хотим добавить следующее:
Код:
[ "$BOOT" != nfs ] || configure_networking
sleep 5
run_dropbear &
echo $! >/run/dropbear.pid
Код:
mkinitramfs -o /boot/initramfs.gz
Прежде чем продолжить, мы гарантируем, что наши индивидуальные изменения сделаны в новом initramfs:
Код:
lsinitramfs /boot/initramfs.gz | grep cryptsetup
lsinitramfs /boot/initramfs.gz | grep authorized
С тем что проверяется, мы гарантируем, что все изменения записываются на диск и выключаем RPi.
Код:
sync && sync
init 0
Резервное копирование и восстановление
Извлекаем SD-карту из вашего RPi и вернёмся к системе, которую вы изначально используете для записи SD-карты. Давайте готовить окружение среды:
Код:
ls -al /mnt/{chroot,backup,encrypted}
# Please make sure there is nothing here first before you move on, otherwise you will have a bad day.
rm -rf /mnt/{chroot,backup,encrypted}
mkdir -p /mnt/{chroot,backup,encrypted}
Теперь вставьте SD-карту и проверьте идентификатор устройства. В нашем случае, устройство /dev/sdc2, но у вас могут быть другим. Измените при необходимости как на вашей системе. Мы подключим устройство и сделаем резервную копию файловой системы:
Код:
mount /dev/sdc2 /mnt/chroot/
rsync -avh /mnt/chroot/* /mnt/backup/
umount /mnt/chroot
Как только это будет сделано, мы удалим существующий раздел 2 на SD карте и заново создадим один пустой, который мы создали для шифрования LUKS.
Код:
echo -e "d\n2\nw" | fdisk /dev/sdc
echo -e "n\np\n2\n\n\nw" | fdisk /dev/sdc
Обновив разделы, мы перезагрузим их путём запуска partprobe и затем настроим LUKS на новый раздел:
Код:
cryptsetup -v -y --cipher aes-cbc-essiv:sha256 --key-size 256 luksFormat /dev/sdc2
cryptsetup -v luksOpen /dev/sdc2 crypt
mkfs.ext4 /dev/mapper/crypt
Мы восстановим резервную копию корневой файловой системы, теперь зашифрованной.
Код:
mount /dev/mapper/crypt /mnt/encrypted/
rsync -avh /mnt/backup/* /mnt/encrypted/
sync
umount /mnt/encrypted/
cryptsetup luksClose /dev/mapper/crypt
Проверка
Теперь можно вернуть SD карту в RPi и дать ему запуститься. Если смотрели за загрузкой, вы должны были увидеть, что Dropbear запустился. В этот момент вы должны иметь возможность войти по SSH в систему и разблокировать диск.
Код:
root@kali:~# ssh -o "UserKnownHostsFile /dev/null" root@10.42.42.94
The authenticity of host '10.42.42.94 (10.42.42.94)' can't be established.
ECDSA key fingerprint is SHA256:L+QVP+OmncGDleuEoj77OlRGuCji2gp0c1gMYjUupU0.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.42.42.94' (ECDSA) to the list of known hosts.
Please unlock disk /dev/mmcblk0p2 (crypt):
cryptsetup (crypt): set up successfully
Connection to 10.42.42.94 closed.
Универсальность этих маленьких устройств в сочетании с силой Kali никогда не перестаёт удивлять нас. Теперь, когда мы остались с системой без заголовков, мы можем работать с относительной уверенностью, что даже если RPi обнаружен, его содержимое будет в безопасности.
Но мы кое что не сделали! Добавим немного
Ссылка скрыта от гостей
функциональности:
Код:
cryptsetup luksDump /dev/mmcblk0p2
cryptsetup luksAddNuke /dev/mmcblk0p2
Теперь, когда мы подключены по SSH, у нас есть один пароль, мы можем войти чтобы позволить разблокировку для SD-карты и продолжить процесс загрузки и другой, который разрушает LUKS заголовок, что делает данные недоступными. Если вы окажетесь в ситуации, когда не удаётся извлечь устройство, этот параметр, чтобы удалить заголовки устройства может быть очень полезным. Если вы хотите быть действительно фантазёром, можно также совместить это с
Ссылка скрыта от гостей
, позволяя удаленно разблокировать/удалять систему через беспроводное соединение. Это очень полезно, если вы не будете иметь постоянный прямой доступ к сети, которае будет передаваться RPi.
Ссылка скрыта от гостей