News Ticker

Cifrare un disco tramite Luks

Facendo riferimento a questo articolo vedremo come utilizzare luks con una singola chiave.

Nel momento in cui dobbiamo cifrare un disco, una partizione o piuttosto un Logical Volume, Luks può essere comodo per mantenere in sicurezza i nostri dati; ad esempio, potremmo voler cifrare la partizione di una chiavetta usb contenente nostri documenti personali, o magari intere parti del nostro filesystem… Insomma, in questi anni in cui la sicurezza è un’argomento più che quotidiano, è interessante vedere che Linux rende questa pratica alla portata di tutti!!

Luks utilizza il modulo dm_crypt fornendo una mappatura di basso livello che gestisce la codifica e decodifica dei dati del dispositivo; frapponendosi tra le operazioni di lettura/scrittua del kernel e le reali operazioni su disco, tutto quanto viene scritto (o messo in cache) sul nostro disco fisico viene cifrato.

Il suo funzionamento si basa sulla generazione di una chiave di crifatura usata per le operazioni di lettura-scrittura del disco, che a sua volta viene protetta tramite una password.
Vediamo come utilizzarlo.

Essend luks basato sul modulo mcrypt del kernel, per prima cosa andiamo a vedere se il modulo mcrypt è presente, e successivamente possiamo procedere all installazione di luks.

# lsmod | grep dm_crypt

Nel caso non avessimo output (il modulo non è caricato), carichiamolo con:

# modprobe dm_crypt
# lsmod | grep dm_crypt
dm_crypt               23177  0

Ora procediamo ad installare luks tramite il seguente comando:

Per distribuzioni Ubuntu e derivate:

$ sudo apt-get install crypt-setup

Per distribuzioni RHEL e derivate:

# yum install crypt-setup

Definiamo dunque la partizione che vogliamo criptare; useremo una chiavetta per il nostro esempio:

# fdisk -l /dev/sdb
Disk /dev/sdb: 2147 MB, 2147483648 bytes
22 heads, 16 sectors/track, 11915 cylinders, total 4194304 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xd1db9e5f

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048     4194303     2096128   83  Linux

La partizione che vogliamo cifrare è la prima della chiavetta sdb, ovvero /dev/sdb1.
Per fare questo utilizziamo il comando luksFormat che eseguirà una “pre-formattazione” del disco preparandolo alla cifratura:

# cryptsetup luksFormat /dev/sdb1

WARNING!
========
This will overwrite data on /dev/sdb1 irrevocably.

Are you sure? (Type uppercase yes): YES
Enter passphrase: 
Verify passphrase:

Verifichiamo due volte che il disco sia corretto, dopodiché scegliamo la nostra password (alcune regole possono essere definite per distribuzione, ad esempio CentOS7 richiede che la password sia almeno di 8 caratter).

Adesso andiamo ad aprire il nostro disco sempre tramite i comandi di cryptsetup:

# cryptsetup luksOpen /dev/sdb1 sdb1

Ovviamente ci verrà chiesta la password precedentemente inserita.

Una volta inserita, possiamo procedere alla creazione del filesystem:

# mkfs.ext4 /dev/mapper/sdb1 
...

Da notare che il comando di creazione del filesystem è stato dato sul Device Mapper /dev/mapper/sdb1. Questo è un device virtuale che ci permette di accedere al contenuto della partizione criptata tramite luks.

Terminata la creazione del filesystem, possiamo montare il disco come al solito:

# mount /dev/mapper/sdb1 /mnt/dati

E verificare che tutto sia come ce lo aspettiamo

# ls -l /mnt/dati
total 24
drwxr-xr-x 3 root root  4096 nov 26 15:59 .
drwxr-xr-x 4 root root  4096 nov 26 15:58 ..
drwx------ 2 root root 16384 nov 26 15:59 lost+found

Ricordiamoci, quando abbiamo finito di utilizzare il disco, di procedere al suo smontaggio come al solito:

# umount /mnt/dati

Ma, soprattutto, ricordiamoci di “chiudere” la sessione criptata del dispositivo stesso

# cryptsetup luksClose sdb1

Questo rimuove il device criptato, evitando che qualcun altro possa accedere a /dev/mapper/sdb1 e, quindi, ai nostri dati.

L’eventuale tentativo di mount della partizione, senza che avvenga prima la sua apertura tramite il comando cryptsetup, ritorna un’errore:

# mount /dev/sdb1 /mnt/disco/
mount: unknown filesystem type 'crypto_LUKS'

Come abbiamo visto, dunque, mettere un filesystem in sicurezza è un’operazione veloce ed indolore su Linux.

Giusto come nota a margine, se per caso aveste bisogno di leggere questo disco da una macchina Windows (magari per lanciare qualche script bash), è disponibile un tool opensource chiamato LibreCrypt che permette l’apertura (sempre tramite password) di partizioni Luks dall’OS di Redmond.

Non avete più scuse 🙂