Již dříve jsme se zabývali tím, jak vytvořit bezpečné „vyhazovací hack boxy“ pomocí Raspberry Pi, ale řekli jsme si, že je čas vrátit se a znovu se na tento proces podívat. Se všemi novými modely Raspberry Pi a změnami Kali od doby, kdy jsme to naposledy řešili, jsme zjistili, že starý proces potřebuje nějakou aktualizaci.
Jako recenzi se snažíme vytvořit samostatné zařízení „nechat za sebou“, které, když je objeveno, neusnadňuje zjistit, co jste dělali. Abychom to dali dohromady, používáme šifrování celého disku LUKS spolu se schopností LUKS Nuke. Pokud máte Raspberry Pi 3 Model B+, nebo opravdu jakýkoli jiný model či podobné zařízení, klidně si podle návodu níže nastavte svůj vlastní bezpečný systém. Tento aktualizovaný proces je založen na naší předchozí dokumentaci a aktualizován o některé návrhy komunity.
Přehled procesu
Než se ponoříme do technologie toho, čeho se budeme snažit dosáhnout, pojďme se rychle podívat na naše cíle týkající se nastavení našeho Raspberry Pi 3 Model B+ (dále jen „RPi“):
- Vytvořte normální instalaci Kali Linux RPi
- Připravte systém na šifrované spouštění se vzdáleným odemknutím disku
- Vytvořte initramfs nakonfigurovaný pomocí klíčů Dropbear a SSH, abyste umožnili odemknutí
- Zálohujte stávající data
- Nakonfigurujte šifrované oddíly
- Obnovte naše data
- Nakonfigurujte LUKS Nuke
- Hacknout pryč!
Může se to zdát hodně, ale je to opravdu docela jednoduché a po dokončení nám zůstane RPi, které se spustí, získá IP z DHCP a Dropbear nám umožní připojit se přes SSH a poskytnout klíč LUKS. To nám umožňuje provozovat RPi bezhlavě, ale stále udržovat naše data v bezpečí. Poté, až s tím skončíme, můžeme je získat nebo vzdáleně a zničit naše data pomocí LUKS NUKE.
Příprava základního systému
Nejprve musíme zapsat obraz RPi na SD kartu. Tím se zde nebudeme zabývat, ale informace o tom naleznete v našich dokumentech.
S tím mimo cestu vložíme SD kartu do RPi a necháme nabootovat. Při prvním spuštění změní velikost karty SD a restartuje se, poté je připravena k použití. Dále se připojíme přes SSH, aktualizujeme Kali a nainstalujeme několik balíčků, které budeme potřebovat.
apt update
apt dist-upgrade
apt install cryptsetup lvm2 busybox dropbear
Dělat kouzlo-Fu
RPi je vše nastaveno a připraveno k jízdě, takže si ušpiníme ruce a vrhneme se do věcí. Vezměte na vědomí, že jakmile tento proces spustíme, změníme řadu důležitých souborů v naší instalaci RPi. Je důležité nerestartovat zařízení ani jinak nevypínat systém, dokud nebudete připraveni nebo vám nezůstane systém, který se nespustí.
Nejprve musíme přidat řádek do /boot/config.txt :
echo initramfs initramfs.gz followkernel >> /boot/config.txt
Dále chceme ověřit, kde se nachází naše skutečné zařízení s kořenovým souborovým systémem:
[email protected]:~# cat /etc/fstab
# proc /proc proc defaults 0 0
/dev/mmcblk0p1 /boot vfat defaults 0 2
/dev/mmcblk0p2 / ext4 defaults,noatime 0 1
Vezměte na vědomí, že náš kořenový souborový systém žije na adrese /dev/mmcblk0p2 . To je to, co budeme používat pro naše další příklady, takže nezapomeňte aktualizovat pokyny s jakoukoli hodnotou, kterou jste obdrželi ve vašem systému.
Nyní, když známe umístění našeho kořenového souborového systému, upravíme /boot/cmdline.txt . Ve výchozím nastavení obsahuje následující:
[email protected]:~# 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
Poznamenejte si záznam root=/dev/mmcblk0p2 . Chystáme se jej aktualizovat pomocí cryptdevice hodnota:
root=/dev/mapper/crypt cryptdevice=/dev/mmcblk0p2:crypt
Po provedené změně náš soubor vypadá takto:
[email protected]:~# 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
Musíme také upravit /etc/fstab a nahradit zařízení, kde má být náš kořenový souborový systém aktuálně /dev/mapper/crypt :
[email protected]:~# 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
Dále musíme vytvořit /etc/crypttab soubor obsahující následující:
crypt /dev/mmcblk0p2 none luks
Zde věnujte zvláštní pozornost – oddělovače mezi položkami musí být tabulátory , nikoli mezery. Nyní, než začneme vytvářet naše initramsfs, musíme udělat malý mazaný hack, abychom vynutili zahrnutí cryptsetup. K tomu vytvoříme falešný souborový systém LUKS. dd prázdný soubor, naformátujte jej jako LUKS, připojte jej a vložte na něj souborový systém.
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
Nedělejte si starosti s nastavením silného hesla pro tento fakeroot, protože se používá pouze v tomto případě.
Nastavení SSH a Initramfs
Nyní jsme na domácím úseku. Tato část je opravdu skvělá, protože normálně, když se spustí systém se systémem LUKS, proces spouštění se pozastaví, abyste mohli odemknout pevný disk pomocí klíče LUKS. Pokud používáte bezhlavý systém, není to příliš pohodlné.
Abychom to vyřešili, nakonfigurujeme Dropbear tak, aby se spustil, umožnil vám se autentizovat pomocí SSH a poté vás připojili, abychom vám poskytli vaše heslo LUKS – to vše na dálku!
Začneme vytvořením souboru na adrese /etc/dropbear-initramfs/authorized_keys který obsahuje:
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"
Je důležité si uvědomit, že to musí být vše na jednom řádku. Vůbec se tam neláme řádky. Pokud to máte správně nastavené, mělo by to vypadat podobně jako toto:
[email protected]:~# 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... [email protected]
Dále provedeme malou změnu v /usr/share/initramfs-tools/scripts/init-premount/dropbear . Tato změna je způsobena skutečností, že musíme zpomalit Dropbear, abychom zajistili, že síť bude nastavena před spuštěním Dropbear. Na konci souboru, kde je napsáno:
# 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
Chceme přidat jednoduchý spánek takové prohlášení:
[ "$BOOT" != nfs ] || configure_networking
sleep 5
run_dropbear &
echo $! >/run/dropbear.pid
Po dokončení jsme konečně připraveni vytvořit naše initramfs!
mkinitramfs -o /boot/initramfs.gz
Než budeme pokračovat, zajistíme, aby se naše přizpůsobené změny dostaly do nových initramfs:
lsinitramfs /boot/initramfs.gz | grep cryptsetup
lsinitramfs /boot/initramfs.gz | grep authorized
Po ověření zajistíme, že všechny změny budou zapsány na disk a vypneme RPi.
sync && sync
init 0
Zálohování a obnovení
Vyjměte SD kartu z RPi a vraťte se do systému, který jste původně použili k zápisu na SD kartu. Připravme prostředí:
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}
Nyní vložte SD kartu a ověřte ID zařízení. V našem případě je to zařízení /dev/sdc2 ale váš se může lišit, takže jej upravte podle potřeby ve vašem systému. Připojíme zařízení a provedeme zálohu souborového systému:
mount /dev/sdc2 /mnt/chroot/
rsync -avh /mnt/chroot/* /mnt/backup/
umount /mnt/chroot
Jakmile to uděláme, smažeme stávající 2. oddíl na SD kartě a znovu vytvoříme prázdný, který nastavíme pro šifrování LUKS.
echo -e "d\n2\nw" | fdisk /dev/sdc
echo -e "n\np\n2\n\n\nw" | fdisk /dev/sdc
Po aktualizaci oddílů je znovu načteme spuštěním partprobe a poté nakonfigurujte LUKS na novém oddílu:
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
Když to znemožníme, obnovíme zálohu kořenového souborového systému na nyní zašifrovaný oddíl.
mount /dev/mapper/crypt /mnt/encrypted/
rsync -avh /mnt/backup/* /mnt/encrypted/
sync
umount /mnt/encrypted/
cryptsetup luksClose /dev/mapper/crypt
Testování
Nyní můžete SD kartu vložit zpět do RPi a nechat ji nastartovat. Pokud sledujete spouštění, měli byste vidět spouštění Dropbear. V tu chvíli byste měli být schopni SSH do systému a odemknout disk.
[email protected]:~# ssh -o "UserKnownHostsFile /dev/null" [email protected]
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.
Všestrannost těchto malých zařízení v kombinaci se silou Kali nás nikdy nepřestane udivovat. Nyní nám zbyl pěkný bezhlavý systém, který můžeme provozovat s relativní jistotou, že i když bude objeven, nebude příliš jednoduché se do něj dostat.
Ale ještě nekončíme! Pojďme přidat některé funkce LUKS NUKE:
cryptsetup luksDump /dev/mmcblk0p2
cryptsetup luksAddNuke /dev/mmcblk0p2
Nyní, když připojíme SSH, máme jedno heslo, které můžeme zadat, abychom umožnili SD kartě odemknout a pokračovat v procesu spouštění, a druhé, které zničí hlavičku LUKS, čímž se data znepřístupní. Pokud se dostanete do situace, kdy nemůžete zařízení získat, tato možnost vypálit zařízení může být velmi užitečná. Pokud chcete být opravdu nóbl, můžete to také zkombinovat s tím, že z RPi uděláte bezdrátový přístupový bod, který vám umožní vzdálené připojení a odemykání/nuklení systému prostřednictvím bezdrátového připojení. To je velmi užitečné, pokud nebudete mít trvalý přímý přístup k síti, ke které bude RPi připojeno.