Raspberry pi 5 - installazione con LUKS
Post 1 by @roadstar — 2026-10-04T09:47:34Z
Metto qui la guida che ho seguito per creare il mio server raspberry pi5 con cifratura forte della partizione di sistema, e’ strutturata in modo che lo sblocco dopo un riavvio puo’ avvenire sia in locale tramite tastiera fisica che in remoto tramite ssh su porta dedicata.
Server Linux headless su Raspberry Pi 5
NVMe 1 TB con cifratura LUKS2 e sblocco all’avvio da tastiera locale o via SSH
1. Panoramica
Si usa Raspberry Pi OS Lite (64 bit) con root su LUKS2 e dropbear-initramfs per lo sblocco remoto. Il Pi 5 ha l’accelerazione AES hardware, quindi le prestazioni restano ottime.
- /boot/firmware (FAT, 512 MB) resta non cifrata: il bootloader del Pi non legge LUKS. Contiene solo kernel e initramfs, nessun dato personale.
- Il resto dell’NVMe e’ un container LUKS2 (aes-xts-plain64, chiave 512 bit, argon2id) con dentro ext4.
- Servono: Pi 5 con NVMe funzionante, microSD con Pi OS Lite per la fase di installazione, rete con accesso a internet, un PC con client SSH.
Sostituisci nei comandi: = UUID della partizione FAT, = UUID della partizione LUKS, e gli indirizzi di rete con i tuoi.
2. Preparazione
2.1 EEPROM e ordine di boot
Avvia il Pi dalla microSD (abilita SSH e crea l’utente con Raspberry Pi Imager), poi:
sudo apt update && sudo apt full-upgrade -y sudo rpi-eeprom-update -a sudo raspi-config # Advanced Options > Boot Order > NVMe/USB Boot sudo reboot
2.2 Pacchetti
sudo apt install cryptsetup cryptsetup-initramfs dropbear-initramfs busybox rsync
2.3 Partizionamento NVMe (/dev/nvme0n1)
Con sudo fdisk /dev/nvme0n1 crea tabella GPT, partizione 1 da 512 MB (tipo EFI/FAT) e partizione 2 con il resto del disco.
2.4 Cifratura LUKS2
sudo cryptsetup luksFormat --type luks2 --cipher aes-xts-plain64 \ --key-size 512 --pbkdf argon2id /dev/nvme0n1p2 sudo cryptsetup open /dev/nvme0n1p2 cryptroot sudo mkfs.ext4 /dev/mapper/cryptroot
Scegli una passphrase lunga. Ti verra’ chiesta a ogni avvio.
3. Copia del sistema sull’NVMe
3.1 Formatta, monta e copia
sudo mkfs.vfat -F32 /dev/nvme0n1p1 sudo mkdir -p /mnt/newroot sudo mount /dev/mapper/cryptroot /mnt/newroot sudo mkdir -p /mnt/newroot/boot/firmware sudo mount /dev/nvme0n1p1 /mnt/newroot/boot/firmware sudo rsync -axHAX --info=progress2 / /mnt/newroot/ sudo rsync -rt /boot/firmware/ /mnt/newroot/boot/firmware/ sudo blkid /dev/nvme0n1p1 /dev/nvme0n1p2
Annota i due UUID: p1 (FAT) e p2 (LUKS).
3.2 Entra nel chroot
for d in dev dev/pts proc sys run; do sudo mount --bind /$d /mnt/newroot/$d; done
4. Configurazione (dentro il chroot)
4.1 /etc/crypttab
cryptroot UUID=<UUID-p2> none luks,initramfs
4.2 /etc/fstab (sostituisci le righe vecchie)
/dev/mapper/cryptroot / ext4 defaults,noatime 0 1 UUID=<UUID-p1> /boot/firmware vfat defaults 0 2
4.3 /boot/firmware/cmdline.txt
Il file deve contenere una sola riga. Rimuovi ogni root=PARTUUID=… e ogni riferimento a firstboot. Parte base:
console=tty1 root=/dev/mapper/cryptroot rootfstype=ext4 rootwait
In fondo alla stessa riga, aggiungi una delle due opzioni di rete (serve a dropbear):
DHCP: ip=:::::eth0:dhcp IP fisso: ip=192.168.1.50::192.168.1.1:255.255.255.0:pi5:eth0:off
Per l’IP fisso il formato e’ ip=IP::GATEWAY:NETMASK:HOSTNAME:INTERFACCIA:off. Adatta i valori alla tua rete.
4.4 /boot/firmware/config.txt
Aggiungi sotto la sezione [all]:
auto_initramfs=1
Se l’NVMe non viene rilevato al boot, aggiungi anche dtparam=pciex1.
5. Sblocco via SSH con dropbear
5.1 Chiave SSH sul tuo PC
Se non ne hai una: ssh-keygen -t ed25519. Poi mostra la chiave pubblica con cat ~/.ssh/id_ed25519.pub.
5.2 Installa la chiave nel chroot
mkdir -p /etc/dropbear/initramfs nano /etc/dropbear/initramfs/authorized_keys # incolla la chiave pubblica chmod 600 /etc/dropbear/initramfs/authorized_keys
5.3 /etc/dropbear/initramfs/dropbear.conf
DROPBEAR_OPTIONS="-I 300 -j -k -p 2222 -s -c cryptroot-unlock"
Significato: timeout 300 s, nessun port forwarding (-j -k), porta 2222, solo chiave (-s), comando forzato di sblocco.
5.4 Genera l’initramfs e verifica
update-initramfs -u -k all ls /boot/firmware | grep initramfs lsinitramfs /boot/firmware/initramfs_2712 | grep -E "dropbear|cryptsetup"
Devi vedere il file initramfs_2712 e righe con dropbear e cryptsetup.
6. Chiusura e primo avvio
exit sudo umount -R /mnt/newroot sudo cryptsetup close cryptroot sudo shutdown now
Togli la microSD e riaccendi. Verifica che l’ordine di boot dia priorita’ all’NVMe.
7. Sblocco all’avvio
- Locale: la console chiede la passphrase, digitala sulla tastiera collegata.
Remoto: ssh -p 2222 [[mailto:root@192.168.1.50|root@192.168.1.50]] e inserisci la passphrase. La sessione si chiude e dopo circa 30 secondi il Pi risponde sul normale SSH (porta 22).
Per evitare avvisi di host key diversa, nel tuo ~/.ssh/config aggiungi una voce separata:
Host pi5-unlock HostName 192.168.1.50 Port 2222 User root HostKeyAlias pi5-unlock
8. Sicurezza e manutenzione
Backup dell’header LUKS: sudo cryptsetup luksHeaderBackup /dev/nvme0n1p2 --header-backup-file header.img. Conservalo fuori dal Pi (se l’header si rovina, i dati sono persi).
Passphrase di recupero: sudo cryptsetup luksAddKey /dev/nvme0n1p2.
Dopo ogni aggiornamento del kernel l’initramfs si rigenera da solo; in caso di dubbio esegui sudo update-initramfs -u -k all.
- Limite noto: /boot non e’ cifrato, quindi un attaccante con accesso fisico potrebbe manomettere l’initramfs. Se e’ un rischio per te, valuta firma del boot e Secure Boot del Pi 5.
9. Risoluzione problemi
Si ferma su waiting for root device: aggiungi nvme in /etc/initramfs-tools/modules e rigenera l’initramfs.
Dropbear non risponde: controlla il parametro ip= in cmdline.txt (interfaccia e rete corrette) e che la porta sia 2222.
- Avviso di host key cambiata: usa la voce pi5-unlock descritta sopra.
Emergenza: avvia dalla microSD, riapri il volume con cryptsetup open /dev/nvme0n1p2 cryptroot, monta e rientra nel chroot (sezione 3.2).