Differences between revisions 15 and 16
Revision 15 as of 2024-01-29 10:04:47
Size: 15764
Editor: Kurgan
Comment:
Revision 16 as of 2024-01-29 10:14:38
Size: 15763
Editor: Kurgan
Comment:
Deletions are marked like this. Additions are marked like this.
Line 170: Line 170:
  echo -n $password | cryptsetup open $encrypted_device_name $unlocked_device_name -   echo -n "$password" | cryptsetup open $encrypted_device_name $unlocked_device_name -
Line 277: Line 277:
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" ;
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"
Line 286: Line 285:
  echo -n $password | cryptsetup open $encrypted_device_name $unlocked_device_name -   echo -n "$password" | cryptsetup open $encrypted_device_name $unlocked_device_name -

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.

  • Partiamo da un disco vuoto, creiamo una partizione GPT che lo occupi tutto, usando gdisk o il suo fratello più user friendly, cgdisk.
  • La partizione sarà di tipo 83 (linux) e le daremo un nome, per esempio "usb-backup-encrypted"

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.

  • Monto il disco fisico nominato /dev/disk/by-partlabel/usb-backup-encrypted e lo rendo disponibile come un device con il nome /dev/mapper/usb-backup-unlocked
    cryptsetup open /dev/disk/by-partlabel/usb-backup-encrypted usb-backup-unlocked
  • Ora posso formattare il device "decrittato"
    mkfs.ext4 /dev/mapper/usb-backup-unlocked
  • A questo punto posso montare il file system e usarlo liberamente
    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

  • Per visualizzare informazioni sulla partizione crittata (anche se non è montata)
    cryptsetup luksDump /dev/disk/by-partlabel/usb-backup-encrypted
  • Per aggiungere una password alla partizione crittata (anche se non è montata) usando il prossimo key slot libero (senza disattivare le password precedentemente impostate!). Notare che vi viene chiesta una delle password già impostate. Questo è necessario per poter decrittare la chiave "master" e poterla poi ri-crittare anche con la nuova password. Posso indicare uno slot specifico usando il parametro "--key-slot"
    # 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
  • Per modificare una password in uno slot specifico:
    cryptsetup  luksChangeKey /dev/disk/by-partlabel/usb-backup-encrypted  --key-slot 1
  • Per eliminare una password da uno slot specifico: (attenzione: se rimuoviamo tutte le password, non accederemo mai più al disco a meno che non abbiamo un backup dell' header LUKS!). Notare che se non specifichiamo il numero dello slot, verrà rimossa la password che viene inserita, dal primo slot che la contiene. (due slot possono contenere password identiche volendo)
    cryptsetup  luksRemoveKey /dev/disk/by-partlabel/usb-backup-encrypted  --key-slot 1
  • Per eliminare una password da uno slot specifico, senza conoscere la password che vogliamo rimuovere. In pratica così facendo un utente che conosce una password può eliminare la password di un altro utente senza conoscerla. Nota: usando questo comando non è possibile, almeno in teoria, killare per sbaglio lo slot del quale conosciamo la password. In altri termini, questo comando non dovrebbe mai "suicidarsi" eliminando lo slot che contiene la password che abbiamo digitato. In ogni caso meglio prima effettuare un backup dell'header e/o un controllo con luksOpen --test-passphrase (vedi più avanti). (notare la sintassi leggermente diversa, il numero dello slot è obbligatorio e non è preceduto da "--key-slot")
    cryptsetup  luksKillSlot /dev/disk/by-partlabel/usb-backup-encrypted 1
  • Per cancellare irrimediabilmente tutte le password da tutti gli slot, rendendo così impossibile il recupero dei dati a meno che non si abbia un backup dell'header LUKS medesimo: (Attenzione: non richiede nessuna conferma!)
    cryptsetup luksErase /dev/disk/by-partlabel/usb-backup-encrypted 
  • Per fare un backup dell'header LUKS. Con il backup sarà possibile accere al disco usando le password che erano in uso al momento del backup, indipendentemente da qualsiasi cosa sia successa all' header LUKS dopo il backup.
    cryptsetup luksHeaderBackup /dev/disk/by-partlabel/usb-backup-encrypted --header-backup-file /tmp/backup
  • Per provare se un header backuppato permette di accedere a un device crittato: (In pratica su usa un header su un file esterno per accedere al device, montandolo con il comando open e indicando un header su un file esterno. Ricordiamoci che se il comando riesce poi abbiamo il device montato, dobbiamo fare un close se non vogliamo usarlo ulteriormente.)
    cryptsetup -v --header /tmp/backup open /dev/disk/by-partlabel/usb-backup-encrypted usb-backup-unlocked
  • Per fare un restore dell'header LUKS da un file di backup, dopo averlo provato da file esterno e aver visto che funziona:
    cryptsetup luksHeaderRestore /dev/disk/by-partlabel/usb-backup-encrypted --header-backup-file /tmp/backup
  • Per fare un dump della master key: (Attenzione, il dump della master key permette di accedere ai dati anche senza conoscere le password. La master key non può essere cambiata se non distruggendo e rifacendo il volume crittato. La master key viene dumpata come ultime righe nel testo di output, preceduta dal testo MK dump:)
    cryptsetup luksDump /dev/disk/by-partlabel/usb-backup-encrypted --dump-master-key
  • Per verificare se in uno specifico slot è memorizzata una specifica password a noi nota. Serve se abbiamo più slot usati e non sappiamo quale password sia in quale slot.
    cryptsetup luksOpen --test-passphrase --key-slot 1 /dev/sdb1 && echo correct
  • Cambiare l' UUID della partizione crittata (utile se il kernel vecchio non usa /dev/disk/by-partlabel ma solo by-uuid)
    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

LinuxDebian/DmCrypt (last edited 2024-01-29 10:14:38 by Kurgan)