Installare Arch Linux in una partizione cifrata

Da GolemWiki.
Jump to navigation Jump to search

Impedire che i nostri dati possano cadere nelle mani delle persone sbagliate è un'esigenza che sta diventando sempre più forte. Esistono tecnologie relativamente semplici da usare e allo stesso tempo molto sicure per mettere al sicuro i nostri dati, come l'utilizzo di un filesystem cifrato.

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), che può quindi essere utilizzata come token di accesso.

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: dal 2010 circa, quasi tutti i processori dispongono di acceleratori hardware per la crittografia.

Processori più vecchi possono comunque essere impiegati, anche se hanno prestazioni leggermente inferiori, che nell'uso quotidiano non sono comunque percepibili.

  • Crittografia: gli odierni metodi di cifratura non possono essere forzati nella loro essenza, un furto di dati crittografati è imputabile solamente a bug o a mancanze umane (ottenere la chiave di cifratura rubandola fisicamente oppure estorcendola da chi ne è in possesso).

Il concetto

La creazione di un disco crittografato richiede due passaggi:

  1. Creazione del disco (partizionamento di un disco fisico o creazione di un disco [File Img|immagine virtuale])
  2. Formattazione del disco (o della partizione) utilizzando una chiave di cifratura

La lettura/scrittura di un disco crittografato consiste in altrettanti pochi e semplici passaggi:

  1. Associazione del disco ad un device node tramite la chiave di cifratura
  2. Montaggio del device node (che verrà utilizzato poi in maniera trasparente come una normalissima partizione)

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

Riflettere bene su come si partiziona il disco: ridimensionare delle partizioni cifrate in un secondo momento è una procedura laboriosa, a meno di non utilizzare una delle recenti versioni di KDE Partition Manager (2020). Dal kernel 3.2 (2015) si può utilizzare stabilmente btrfs su LUKS, e si può creare un'unica grande partizione cifrata, suddivisa poi in diversi sottovolumi btrfs.

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

oppure

 $ openssl rand -base64 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 di root:

 # 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. Se la chiave di cifratura non viene fornita, sarà richiesta una password.

Il programma chiederà di confermare l'operazione rispondendo YES (maiuscolo) alla richiesta di formattazione.

Ripetere la procedura per tutte le (altre eventuali) 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, aprirlo con:

 # cryptsetup --key-file /path/chiave.key luksOpen /dev/sda2 rootfs

rootfs è il nome utilizzeremo per accedere alla partizione cifrata in maniera trasparente, e che sarà utilizzato per creare il link di accesso in /dev/mapper/rootfs.

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 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 mkinitcpi o

Per far sì che il kernel possa decifrare il filesystem in fase di avvio, aggiungere i seguenti hooks nella riga corrispondente del file /etc/mkinitcpio.conf:

encrypt shutdown

quindi rigenerare l'init ram disk con:

 # mkinitcpio -P

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.

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.

EncFS: un'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.
    • Lavora a livello utente, non richiede permessi di amministratore
  • Contro
    • Lavora a livello utente, non richiede permessi di amministratore, e non permette di cifrare l'intera installazione, ma solo i file selezionati
    • 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/user/bin/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=cafebabe-b00b5-deadbeef /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

Risorse