Table of Contents

Dm-crypt

Usando dm-crypt (e i vari tool relativi) è possibile creare in modo quasi facile interi dischi o partizioni crittografati.

Il principale svantaggio di dm-crypt è che non esiste su sistemi diversi da Linux. L'altro ovvio svantaggio è che un danneggiamento del disco rischia di corrompere irrimediabilmente tutto il contenuto. Ah, ovviamente se vi dimenticate la password siete più o meno fregati.

Il vantaggio è che i vostri dati non saranno accessibili in alcun modo senza la password.

Sui moderni ambienti grafici (Gnome, Kde, Cinnamon, ecc) l'uso di dischi esterni crittografati è semplificato e integrato nella interfaccia grafica. Ma questo non è argomento che mi interessi per il momento.

Usando dm-crypt possiamo creare dischi crittografati in diversi formati (vedi man cryptsetup). Ora però mi occuperò solo del formato LUKS. Sta uscendo in questi giorni il nuovo formato LUKS2, che però per il momento non credo sia il caso di prendere in considerazione, per motivi di stabilità e compatibilità con i sistemi più vecchi.

Pacchetti necessari

È necessario avere installato il pacchetto "cryptsetup". Tecnicamente, servono i tool userspace (che stanno in cryptsetup in Debian) e il modulo del kernel dm_crypt, che dovrebbe essere presente nel kernel standard di Debian.

È utile anche avere i tool per gestire i dischi GPT, quindi il pacchetto "gdisk"

Come partizionare un disco

È possibile usare un intero disco come contenitore per i dati crittati, oppure una partizione. Se si vuole potersi riferire alla partizione per nome e non per device, occorre per forza usare una partizione GPT, in quanto solo nella struttura GPT è possibile dare un nome univoco e umanamente leggibile a una partizione. In alternativa, sarà possibile indicare la partizione (o il disco) usando lo UUID (/dev/disk/by-uuid/<uuid-del-mio-disco>), ma questo pone limiti quando per esempio si vogliono usare diversi dischi per lo stesso scopo, come ad esempio diversi dischi USB che si ruotano per fare un backup.

Pertanto, tenendo in considerazione che comunque i dati crittati potranno essere letti solo da Linux (almeno per ora), userò dischi esterni partizionati GPT.

Verificare le prestazioni dell' hardware

Prima di creare un disco crittato, possiamo voler verificare le prestazioni della nostra CPU per capire quali sono gli algoritmi più performanti. Eseguendo cryptsetup benchmark possiamo vedere le prestazioni massime dei vari algoritmi. Il default usato da cryptsetup, se non lo impostiamo diversamente, è aes-xts, il quale (almeno sulla mia cpu) è assolutamente il più performante.

Creare l' header LUKS

Questo comando crea di fatto la struttura dati necessaria a gestire il disco crittato in formato LUKS, impostando una password per la decrittazione (la password è impostata in maniera interattiva). Notare che faccio riferimento al disco usando il nome di partizione che ho dato prima. Potrei anche usare il nome del device, non cambia nulla. Fa sempre riferimento alla stessa partizione.

cryptsetup -v luksFormat /dev/disk/by-partlabel/usb-backup-encrypted

Montare il disco crittato e formattarlo

Ora dobbiamo montare il disco crittato e formattarlo, per poterlo usare come vogliamo.

cryptsetup open /dev/disk/by-partlabel/usb-backup-encrypted usb-backup-unlocked
mkfs.ext4 /dev/mapper/usb-backup-unlocked
mount /dev/mapper/usb-backup-unlocked /mnt

Smontare il disco crittato

Procediamo a rovescio, quindi prima smontiamo il file system dal device "decrittato", e poi lo disattiviamo.

umount /mnt
cryptsetup close usb-backup-unlocked

Comandi utili

cryptsetup luksDump /dev/disk/by-partlabel/usb-backup-encrypted
# nel primo slot libero
cryptsetup  luksAddKey /dev/disk/by-partlabel/usb-backup-encrypted

# specificando uno slot preciso
cryptsetup  luksAddKey /dev/disk/by-partlabel/usb-backup-encrypted --slot 5
cryptsetup  luksChangeKey /dev/disk/by-partlabel/usb-backup-encrypted  --key-slot 1
cryptsetup  luksRemoveKey /dev/disk/by-partlabel/usb-backup-encrypted  --key-slot 1
cryptsetup  luksKillSlot /dev/disk/by-partlabel/usb-backup-encrypted 1
cryptsetup luksErase /dev/disk/by-partlabel/usb-backup-encrypted 
cryptsetup luksHeaderBackup /dev/disk/by-partlabel/usb-backup-encrypted --header-backup-file /tmp/backup
cryptsetup -v --header /tmp/backup open /dev/disk/by-partlabel/usb-backup-encrypted usb-backup-unlocked
cryptsetup luksHeaderRestore /dev/disk/by-partlabel/usb-backup-encrypted --header-backup-file /tmp/backup
cryptsetup luksDump /dev/disk/by-partlabel/usb-backup-encrypted --dump-master-key
cryptsetup luksOpen --test-passphrase --key-slot 1 /dev/sdb1 && echo correct
cryptsetup luksUUID /dev/sdz1 --uuid <uuid che voglio impostare>

Un paio di script di backup su USB che usano dm-crypt

Questi sono un paio di script che usano dm-crypt per creare backup su dischi usb. La password è hardcoded nello script, il che lo rende potenzialmente poco sicuro. Lo scopo di questo script però è quello di rendere inutilizzabile il backup sul disco esterno, supponendo che non si abbia accesso al server sul quale è presente lo script con la relativa password. È logico che è opportuno scriversi da qualche parte la password e tenerla al sicuro separata dai dischi di backup. Senza la password il backup è inutile!

Backup con tar

 #!/bin/bash
#

# Impostazioni:
encrypted_device_name="/dev/disk/by-partlabel/usb-backup-encrypted"
unlocked_device_name="usb-backup-unlocked"
password="LA VOSTRA PASSWORD"
mountpoint="/mnt"
errori="0"

logger -t backup_usb Inizio backup

# check se il mountpoint e gia in uso
if  mountpoint -q $mountpoint; then
  echo `date` "ERRORE: Backup fallito: $mountpoint e' gia' montata!"
  logger -t backup_usb "Backup fallito: $mountpoint e' gia' montata!"
  errori="1" 

else

  # se non e in uso, la monto
  echo -n "$password" | cryptsetup open $encrypted_device_name $unlocked_device_name -
  mount /dev/mapper/$unlocked_device_name $mountpoint


  # se il mount e ok, posso fare il backup
  # altrimenti riporto un errore.

  if mountpoint -q $mountpoint; then

   echo `date` Ruoto i vecchi files  di backup
   logger -t backup_usb Ruoto i vecchi files di backup
   savelog -l -c 4 $mountpoint/*.tgz
   savelog -l -c 4 $mountpoint/*.log
   savelog -l -c 4 $mountpoint/*.lzo

   echo
   echo `date` Inizio il backup del sistema
   logger -t backup_usb Inizio il backup del sistema
   tar cvzf $mountpoint/sistema.tgz  --warning='no-file-changed' --warning='no-file-ignored' --warning='no-xdev' --one-file-system --totals --exclude /home --exclude /ud0 / > $mountpoint/sistema.log || { echo "============== ERRORE =============="; errori=1; }
   
   echo
   echo `date` Inizio il backup di ud0
   logger -t backup_usb Inizio il backup di ud0
   tar cvzf $mountpoint/ud0.tgz /ud0 --one-file-system --totals > $mountpoint/ud0.log || { echo "============== ERRORE =============="; errori="1"; }
  
   echo 
   echo `date` Inizio il backup delle home
   logger -t backup_usb Inizio il backup delle home
   tar cvzf $mountpoint/home.tgz /home --one-file-system --totals > $mountpoint/home.log || { echo "============== ERRORE =============="; errori="1"; }
  
   echo 
   echo `date` Inizio il backup della mail
   logger -t backup_usb Inizio il backup della mail
   ssh root@mail tar czf - --one-file-system /etc /var/vmail | dd of=$mountpoint/mail.tgz  > $mountpoint/mail.log || { echo "============== ERRORE =============="; errori="1"; }
  
   echo 
   echo `date` Inizio il backup dei dump di Proxmox
   logger -t backup_usb Inizio il backup dei dump di Proxmox
   cp /backupdisk/pve/*.lzo $mountpoint || { echo "============== ERRORE =============="; errori="1"; }
   echo

   echo `date` Smonto il disco
   logger -t backup_usb Smonto il disco
   sync
   sleep 5s

   umount $mountpoint || { echo "============== ERRORE =============="; errori="1"; }

   echo
   cryptsetup close $unlocked_device_name
   logger -t backup_usb Disco smontato - fine backup
   echo `date` "backup_usb Disco smontato - fine backup"

 else

   # ho un errore al mount.
   echo Backup fallito: non riesco ad accedere al disco removibile 
   logger -t backup_usb Backup fallito: non riesco ad accedere al disco removibile 
   errori="1"
 fi

fi

# se abbiamo errori, manda una mail di segnalazione a uno o piu destinatari email
# e scrivi un grosso banner in fondo al report
if [ "$errori" = "1" ]; then
        mail -s "`hostname -f` ERRORI NEL BACKUP" -- indirizzo1@dominio.tld,indirizzo2@dominio.tld  <<- EOF

        
        ATTENZIONE: ERRORI NEL BACKUP
        
        Verificare la mail relativa al backup per visualizzare i dettagli
EOF
        echo
        echo
        echo ==================================================
        echo ==================================================
        echo ========= ATTENZIONE: ERRORI NEL BACKUP ==========
        echo ==================================================
        echo ==================================================

else
        echo
        echo
        echo BACKUP CONCLUSO CON SUCCESSO
fi

Backup con rsnapshot

 #!/bin/bash
#

# Impostazioni:
encrypted_device_name="/dev/disk/by-partlabel/usb-backup-encrypted"
unlocked_device_name="usb-backup-unlocked"
password="LA VOSTRA PASSWORD"
mountpoint="/mnt"
errori="0"


logger -t backup_usb Inizio backup

# check se il mountpoint e gia in uso
if  mountpoint -q $mountpoint ; then
  echo "ERRORE: Backup fallito: $mountpoint e' gia' montata!"
  logger -t backup_usb "Backup fallito: $mountpoint e' gia' montata!"
  errori="1"

else

  # se non e in uso, la monto
  echo -n "$password" | cryptsetup open $encrypted_device_name $unlocked_device_name -
  mount /dev/mapper/$unlocked_device_name $mountpoint


  # se il mount e ok, posso fare il backup
  # altrimenti riporto un errore.

  if mountpoint -q $mountpoint; then

   echo 
   echo `date` Inizio il backup con rsnapshot
   logger -t backup_usb Inizio il backup con  rsnapshot
   rsnapshot daily || { echo "============== ERRORE =============="; errori="1"; }
   echo

   echo `date` Smonto il disco
   logger -t backup_usb Smonto il disco
   sync
   sleep 5s

   umount $mountpoint || { echo "============== ERRORE =============="; errori="1"; }

   echo
   cryptsetup close $unlocked_device_name
   logger -t backup_usb Disco smontato - fine backup
   echo `date` "backup_usb Disco smontato - fine backup"

 else

   # ho un errore al mount.
   echo Backup fallito: non riesco ad accedere al disco removibile ;
   logger -t backup_usb Backup fallito: non riesco ad accedere al disco removibile ;
   errori="1"
 fi

fi

# se abbiamo errori, manda una mail di segnalazione a uno o piu destinatari email
# e scrivi un grosso banner in fondo al report
if [ "$errori" = "1" ]; then
        mail -s "`hostname -f` ERRORI NEL BACKUP" -- indirizzo1@dominio.tld,indirizzo2@dominio.tld  <<- EOF

        
        ATTENZIONE: ERRORI NEL BACKUP
        
        Verificare la mail relativa al backup per visualizzare i dettagli
EOF
        echo
        echo
        echo ==================================================
        echo ==================================================
        echo ========= ATTENZIONE: ERRORI NEL BACKUP ==========
        echo ==================================================
        echo ==================================================

else
        echo
        echo
        echo BACKUP CONCLUSO CON SUCCESSO
fi