Installare Arch Linux in una partizione cifrata
Impedire che i nostri dati possano cadere nelle mani delle persone sbagliate è un'esigenza che sta diventando sempre più forte. Esistono tecnologie relativamente semplici e sicure per mettere al sicuro i nostri dati come l'utilizzo di un filesystem cifrato.
Prerequisiti
Requisiti e avvertimenti
Competenze di base: partizionamento, montaggio e smontaggio di device e node da riga di comando; familiarità con l'installazione di ArchLinux.
Requisiti della macchina: Qualsiasi computer supportato da Arch Linux (≥ Pentium 4 con 1 GB di RAM va più che bene), con lettore CD ed un disco fisso.
Sulla crittografia: gli odierni metodi di cifratura non possono essere forzati nella loro essenza, un furto di dati crittografati è imputabile solamente ad una mancanza umana (ottenere la chiave di cifratura rubandola fisicamente oppure estorcendola da chi ne è in possesso). Questa guida descrive la procedura per installare Arch Linux su una partizione cifrata, utilizzando una chiave di cifratura esterna che risiede su un supporto rimovibile (nel caso specifico, su una chiavetta USB).
Il concetto
La creazione di un disco crittografato richiede due passaggi essenziali:
- Creazione del disco (partizionamento di un disco fisico o creazione di un disco immagine virtuale, ad esempio con dd)
- Formattazione del disco (o della partizione) utilizzando una chiave di cifratura
La lettura di un disco crittografato consiste in altrettanti pochi e semplici passaggi:
- Associazione del disco ad un device node tramite la chiave di cifratura
- Montaggio del device node (che verrà utilizzato poi in maniera trasparente come un normalissimo disco)
Prima parte: Creazione delle partizioni e installazione del sistema
Partizionamento del disco
Avviare il disco live di installazione di Arch Linux. Prima di installare il sistema bisogna ovviamente partizionare il disco. Tutte le partizioni possono essere cifrate (/, /home, /var e persino l'area di swap) ma è indispensabile che almeno la partizione di /boot (in cui risiederà il kernel) non venga cifrata, altrimenti il bootloader non potrà caricare il sistema.
# fdisk -l # cfdisk /dev/sda
Pensare bene a come si partiziona il disco, in quanto non è possibile ridimensionare in seguito delle partizioni cifrate (si deve fisicamente eliminare la partizione e, una volta ridimensionata, va riformattata daccapo).
Creazione del filesystem cifrato con cryptsetup
Per creare il filesystem cifrato, sono necessari cryptsetup, che si trova già sul disco live di Arch Linux, e una chiave di cifratura. La chiave di cifratura può essere una password o un qualsiasi file. Per generare una chiave sicura "al volo" si può usare dd:
$ dd if=/dev/urandom of=chiave.key bs=1K count=10
È indispensabile salvarsi questa chiave da qualche parte: senza la chiave il disco sarà inaccessibile. Si può salvare, per esempio, su una chiavetta USB, che inseriremo ad ogni avvio del computer per sbloccare il contenuto del disco. Creata la chiave, formattare così la partizione:
# cryptsetup -c aes-xts-plain64 -s 512 luksFormat /dev/sda2 /path/chiave.key
Dove /path/chiave.key è il percorso al file contente la chiave di cifratura. Si suppone inoltre che /dev/sda2 contenga la partizione /, in quanto su /dev/sda1 è presente quella di /boot non cifrata. Il programma chiederà di confermare l'operazione rispondendo «YES» (maiuscolo) alla richiesta di formattazione. Ripetere la procedura per tutte le partizioni. Si può anche usare una diversa chiave per ogni partizione, oppure si possono formattare delle partizioni "in chiaro", senza crittografarle, con un semplice mkfs.ext4 /dev/sdaX
Apertura della partizione cifrata
Una volta creato il filesystem cifrato, lo si deve aprire e lo si deve associare ad un device node, che verrà poi symlinkato; ma non dobbiamo spaventarci più di tanto, in quanto penserà a tutto cryptsetup.
# cryptsetup --key-file /path/chiave.key luksOpen /dev/sda2 rootfs
rootfs è il nome utilizzeremo per accedere alla partizione cifrata in maniera trasparente.
Formattazione e montaggio della partizione cifrata
Creato il device node a cui è associato il nostro disco cifrato, possiamo operare su di esso normalmente, come se fosse un normalissimo disco. Pertanto:
# mkfs.ext4 /dev/mapper/rootfs # mount /dev/mapper/rootfs /mnt
Dove /dev/mapper/rootfs è il nome assegnato al device node in precendenza con cryptsetup luksOpen. Allo stesso modo, creare e montare anche la altre partizioni cifrate desiderate (/home, /var, ecc...) e installare normalmente Arch Linux con pacstrap /mnt base base-devel, fare il chroot, ecc... al momento di installare il bootloader GRUB2, seguire la seconda parte di questa guida.
Seconda parte: Rendere la procedura automatica al boot
Configurare GRUB2
(Si suppone di essere ancora nell'ambiente chroot dell'installazione) Aprire il file di configurazione /etc/default/grub e modificare la riga GRUB_CMDLINE_LINUX come segue:
GRUB_CMDLINE_LINUX="cryptdevice=/dev/sda2:cryptroot cryptkey=/dev/sdb1:auto:chiave.key"
Dopodichè, aggiornare il menu di GRUB2:
# grub-mkconfig -o /boot/grub/grub.cfg
In questo modo, GRUB2 utilizzerà la chiave chiave.key che risiede sul disco /dev/sdb1 (la nostra pennina USB) il quale è formattato con un filesystem che verrà riconosciuto automaticamente. Attenzione: se la pennina è formattata in FAT, allora sarà necessario aggiungere un modulo a GRUB2. Personalmente, consiglio di creare una seconda partizione di qualche manciata di MB alla fine della pennina, formattata in ext2, e destinata a contenere solamente la nostra chiave di cifratura, lontana da occhi indiscreti (soprattutto su Windows).
Configurare mkinitcpio
Per far sì che il kernel possa decifrare il filesystem in fase di avvio, occorre aggiungere gli hooks encrypt e shutdown nel file /etc/mkinitcpio.conf e rigenerare l'immagine del kernel con
# mkinitcpio -p linux
Configurare cryptsetup
Per montare automaticamente le partizioni cifrate /home, /var, ecc... modificare il file /etc/crypttab e aggiungere la seguente riga:
homefs /dev/sda6 /path/chiave.key cipher=aes-xts-plain64,size=512
Dove homefs è il nome che si vuole assegnare al device node, /dev/sda6 è la partizione che si vuole assegnare al device node, /path/chiave.key è il percorso alla chiave di cifratura (la stessa della /, oppure un'altra, a seconda di come si sono cifrate le partizioni in fase di installazione; a questo punto, visto che / è cifrata, una seconda chiave può anche risiedere in tale partizione).
Configurare fstab
Dopo aver configurato cryptsetup, si deve configurare /etc/fstab e istruirlo a montare le partizioni che cryptsetup ha assegnato ai device node in fase di avvio, secondo le istruzioni che abbiamo specificato in /etc/crypttab. Aprire /etc/fstab e modificarlo come segue:
/dev/mapper/homefs /home ext4 rw,relatime,data=ordered 0 2
Dove /dev/mapper/homefs è il device node scelto, /home è il punto di mount, ecc... Ripetere l'operazione per tutte le partizioni cifrate che si hanno. Si può anche avere qualche partizione non cifrata (ma a questo punto, a che servirebbe?)
Termine dell'installazione
Finalmente l'installazione e la configurazione del sistema è terminata, si smontino quindi tutte le partizioni e si riavvii il computer. Se tutto è andato liscio, all'avvio del sistema verrà chiesto di inserire la pennina USB con la nostra chiave di cifratura: inseriamola (entro i dieci secondi che abbiamo a disposizione) e il nostro Arch si avvierà! Buon proseguimento dell'installazione! Per qualsiasi informazione più approfondita, si rimanda alla pagina del wiki di Arch Linux in inglese.
Alternativa
Cifrare una directory può essere un'alternativa alla cifratura di un intero device. EncFS è un filesystem user-space montabile tramite FUSE che permette di effettuare questa operazione. Le diverse caratteristiche intrinseche rispetto ad un filesystem loopback determinano però diversi pregi e difetti:
Pro
- Selezionare selettivamente i contenuti da cifrare, rispetto ad avere un device completamente cifrato, appesantisce meno il lavoro della CPU specialmente quando si utilizzano processori datati privi del set di istruzioni AES.
- Dimensioni modificabili: un file system vuoto EncFS è composto da qualche dozzina di byte e può crescere a qualsiasi dimensione senza bisogno di essere riformattato. Con un dispositivi di cifratura a blocchi, si alloca un filesystem in anticipo con le dimensioni desiderate.
- Backup automatici: un filesystem EncFS può essere salvato con una politica per file. Un programma di backup è in grado di rilevare quali file sono cambiati, anche se non sarà in grado di decifrarli.
- Stratificazione/Separazione di fiducia: encfs può essere messo in cima ad altri filesystem al fine di aggiungere la crittografia a file system non cifrati.
Contro
- Meta-dati visibili: chiunque abbia accesso ai file crittografati può conoscere alcune informazioni (numero di file, permessi, dimensione)
Configurazione
Anche in questo caso esiste il modo per poter montare automaticamente una cartella cifrata all'avvio del sistema.
Dato che non è possibile passare opzioni all'eseguibile encfs su fstab è necessario creare un wrapper, cioè uno script da rendere eseguibile (es. /home/me/encfs.sh) che vada a recuperare la password da un file (es. encfs_password), magari contenuto in una chiavetta USB anch'essa montata automaticamente all'avvio.
- Wrapper
#!/bin/sh encfs --public --extpass="cat /mnt/USB/encfs_password" $*
A questo punto è possibile aggiungere all'/etc/fstab le seguenti righe.
# Montaggio automatico della penna USB all'avvio UUID=asfsdgsdgfasdfafa /mnt/USB auto defaults,auto 0 0
# Richiamo del wrapper /home/me/encfs.sh#/home/me/.encrypted /home/me/decrypted fuse rw,user,auto 0 0