• Immutable Page
  • Info
  • Attachments

Questa guida potrebbe rendere il sistema inagibile. Dovreste essere consapevoli di cosa si sta per fare. Procedete a vostro rischio e pericolo.

Filesystem LUKS criptato con chiave di avvio su dispositivo rimovibile

Usando questa guida sarà possibile settare una partizione criptata LUKS affinché si avvii tramite una chiave immagazzinata su un dispositivo rimovibile. In alternativa, se il dispositivo non fosse presente, verrà richiesta una passphrase.

  • LA CHIAVE NON SARÀ SALVATA SU UN FILE, MA I SUOI DATI SARANNO COPIATI IN MANIERA GREZZA SUL DISPOSITIVO RIMOVIBILE.

Il tutorial presuppone che si abbia già a disposizione una partizione criptata e un dispositivo rimovibile per salvare la chiave.

Chiameremo /dev/sdXX la partizione/drive criptata/o e /dev/sdY il dispositivo rimovibile.

Partizionare il dispositivo rimovibile

Formattate il dispositivo come desiderate, ma assicuratevi di creare una partizione non formattata dove salvare la chiave. Assicuratevi di creare una partizione non formattata e non lasciare semplicemente lo spazio inallocato. Per esempio potreste voler creare due partizioni: una fat32 per immagazzinare come al solito i file e una (non formattata) per la chiave. Per questo processo potete usare parted (da linea di comando) o gparted (interfaccia grafica di parted). Per installarli digitare:

$ sudo apt-get install parted

oppure

$ sudo apt-get install gparted

Ecco un esempio con parted:

$ sudo parted /dev/sdY
GNU Parted 1.8.9
Viene usato /dev/sdY
Benvenuti in GNU Parted. Digitare "help" per l'elenco dei comandi.
(parted) mklabel
Avviso: L'etichetta del disco su /dev/sdY verrà eliminata e tutti i dati su
questo disco saranno persi. Continuare?
Sì/Yes/No? Y                                                              
Tipo dell'etichetta del nuovo disco?  [msdos]? msdos                      
(parted) mkpartfs primary fat32 0 -8m
(parted) print                                                            
Modello: Generic USB Disk (scsi)
Disco /dev/sdY: 1032MB
Dimensione del settore (logica/fisica): 512B/512B
Tabella delle partizioni: msdos

Numero  Inizio  Fine    Dimensione  Tipo     File system  Flag
 1      512B    1024MB  1024MB      primary  fat32        lba 

(parted) mkpart primary 1024m -1s
(parted) print                                                                
Modello: Generic USB Disk (scsi)
Disco /dev/sdY: 1032MB
Dimensione del settore (logica/fisica): 512B/512B
Tabella delle partizioni: msdos

Numero  Inizio  Fine    Dimensione  Tipo     File system  Flag
 1      512B    1024MB  1024MB      primary  fat32        lba 
 2      1024MB  1032MB  7999kB      primary                   

(parted) quit       

Informazioni: Potrebbe essere necessario aggiornare /etc/fstab.   

Chiameremo /dev/sdY2 la partizione non formattata.

Creare la chiave

Ora dobbiamo creare una nuova chiave ed aggiungerla al drive criptato. Si può usare il seguente comando per generare una password da 256 bit (se il comando si blocca muovete il mouse o premete dei tasti sulla tastiera per generare l'entropia necessaria):

$ dd if=/dev/random of=keyfile.key bs=1 count=256

Ora aggiungete la chiave al dispotivo LUKS (quello criptato, non quello rimovibile):

$ sudo cryptsetup luksAddKey /dev/sdXX keyfile.key

Bisognerà fornire una chiave valida per quel dispositivo.

Scrivere la chiave sul dispositivo rimovibile

Ora andremo a scrivere la chiave generata direttamente sulla partizione non formatta del dispositivo rimovibile. La chiave NON sarà scritta come file, ma copiata come byte grezzi. Non sarà visibile quando montata su un sistema. La partizione non formattata ci garantisce un mezzo per accedere alla locazione dove è salvata la chiave e previene che altri sistemi interferiscano con il dispositivo.

Ora digitate semplicemente:

$ sudo dd if=keyfile.key of=/dev/sdY2 bs=1 count=256

A questo punto potete rimuovere in maniera sicura la chiave:

$ shred -u keyfile.key

Ottenere l'id della nuova partizione creata

Eseguite:

$ ls -l /dev/disk/by-id/ | grep sdY2

L'output sarà qualcosa del tipo:

lrwxrwxrwx 1 root root 10 2009-04-24 15:45 usb-Generic_USB_Disk_00000000000000-0:0-part2 -> ../../sdc2

Qui la cosa importante è:usb-Generic_USB_Disk_00000000000000-0:0-part2 (voi avrete una stringa differente). La useremo più tardi, con la denominazione di <ID>.

Creare il keyscript

Ora dobbiamo creare un keyscript che prenda la chiave dal dispositivo all'avvio e la usi per aprire il volume criptato.

Digitate:

$ sudo nano /usr/local/sbin/usbkeyscript.sh

e copiate il seguente testo:

# Return true if usplash is running, otherwise return false.
[ -x /sbin/usplash_write ] && usplash_exists='1'
usplash_running()
{
        [ -z "$usplash_exists" ] && return 1
        pidof "usplash" >/dev/null
        return $?
} 

fixup_verbosity()
{
        if [ "$(expr match "$(cat /proc/cmdline)" '.*quiet')" -gt "0" ]; then
                /sbin/usplash_write "VERBOSE off" 2>/dev/null
        else
                /sbin/usplash_write "VERBOSE on" 2>/dev/null
        fi
}


# Write output to the console. n: now newline s: status (no time)
write_to_console()
{

        read system_uptime no_var < /proc/uptime

        if [ "x$2" != "xs" ]; then 
                printf '[%8s0000] %s' "$system_uptime" "$1" >&2
        else
                printf '%s' "$1" >&2
        fi

        if [ "x$2" != "xn" ]; then
                printf '\n' >&2
        fi
}

# Write output to usplash
write_to_usplash()
{
        usplash_running
        if [ $? -eq 0 ]; then
                /sbin/usplash_write "VERBOSE on"
                /sbin/usplash_write "$1 $2"
                fixup_verbosity
        fi 
        
        write_to_console "$2" "$3"

        return 0
}


if [ "x$1" = "x" -o "x$1" = "xnone" ]; then
        write_to_usplash "TEXT" "Keyscript: not configured for external keydevice." >&2
        /lib/cryptsetup/askpass "Enter passphrase: "
        exit 0
else
        KEYDEVICE=$(echo $1 | cut -d# -f 1)
        KEYSIZE=$(echo $1 | cut -d# -f 2)
        KEYPOS=$(echo $1 | cut -d# -f 3)
fi      

SETTLETIMEOUT=5 #in secs
FIRSTDEVICETIMEOUT=100 #in decisecs
DEFAULTDEVICETIMEOUT=5  #in decisecs

DEVICETIMEOUT="${FIRSTDEVICETIMEOUT}"

if [ -f /tmp/usbkey-discover-done ]; then
        DEVICETIMEOUT="${DEFAULTDEVICETIMEOUT}"
fi

touch /tmp/usbkey-discover-done

write_to_usplash "TEXT" "Keyscript: waiting for udev to settle"

# Wait for udev to be ready, see https://launchpad.net/bugs/85640
if [ -x /sbin/udevsettle ]; then
    /sbin/udevsettle --timeout=${SETTLETIMEOUT} > /dev/null 2>&1
fi

write_to_usplash "TEXT" "Keyscript: searching for device..." "n"

# Wait for the KEYDEVICE to appear
slumber=${DEVICETIMEOUT}
while [ ! -b "${KEYDEVICE}" ]; do
/bin/sleep 0.1
slumber=$(( ${slumber} - 1 ))

if [ ${slumber} -lt 0 ]; then
        write_to_usplash "FAILURE"  "not found." "s"
        /lib/cryptsetup/askpass "Enter passphrase: "
        exit 0
fi
done

write_to_usplash "SUCCESS" "found." "s"

dd if=${KEYDEVICE} bs=1 count=${KEYSIZE} skip=${KEYPOS} 2> /dev/null

exit 0

Premete Ctrl+X e poi Enter per salvare il file. Ora cambiate i permessi:

$ sudo chmod 500 /usr/local/sbin/usbkeyscript.sh

Editare crypttab

A questo punto dobbiamo dire al sistema di eseguire il keyscript all'avvio per ottenere la chiave:

$ sudo nano /etc/crypttab

Troverete qualcosa del genere:

<mapper_device> /dev/<device> none luks

Dove<mapper_device>è il nome del dispositivo creato dopo avere montato con successo il disco criptato e <device> è il dispositivo fisico criptato.

Dovete modificare la linea come segue:

<mapper_device> /dev/<device> /dev/disk/by-id/<ID>#256#0 luks,keyscript=/usr/local/sbin/usbkeyscript.sh

Dove<ID>è l'id della partizione del dispositivo rimovibile di cui ci siamo occupati in precedenza, 256 è la lunghezza della chiave e 0 è l'offset dall'inizio della partizione dove è salvata la chiave. Il mio assomiglia a questo (ho editato dei nomi):

sdXX_crypt /dev/disk/by-uuid/00000000-1111-2222-3333-444444444444 /dev/disk/by-id/usb-Generic_USB_Disk_00000000000000-0:0-part2#256#0 luks,keyscript=/usr/local/sbin/usbkeyscript.sh

Premere nuovamente Ctrl+X e salvare il file.

Aggionare initramfs

Se il disco criptato sul quale state lavorando è quello che contiene la vostra root (/), dovete rigenerare initramfs per copiare i file che abbiamo creato/modificato su initramfs. Per prima cosa dovreste fare una copia di backup. Eseguite:

$ sudo cp /boot/initrd.img-$(uname -r) /boot/initrd.img-$(uname -r).bak

E ora eseguite:

$ sudo update-initramfs -u

Riavviare il sistema

A questo punto dovrebbe essere tutto a posto. Potete riavviare il sistema e sperare che tutto vada per il verso giusto. Se il sistema non si avvia potrete comunque montare la partizione che contiene i file di /boot dalla shell di recupero (recovery shell) e sostituire l'immagine initrd con quella di backup. Il sistema dovrebbe essere in grado di montare automaticamente il disco criptato se il vostro dispositivo rimovibile è presente, altrimenti vi chiederà la vostra password. Se tutto è andato a buon fine potete rimuovere l'immagine di backup con:

$ sudo rm /boot/initrd.img-$(uname -r).bak

Forzare la rimozione del dispositivo rimovibile

Non c'è nessuna sicurezza aggiuntiva nei dischi criptati se lasciate inserito il dispositivo. Questo script blocca l'avvio del sistema subito prima di gdm (schermata di login), finché il dispositivo non viene rimosso. Eseguite:

$ sudo nano /etc/init.d/remove-usbkeydevice

E incollate il seguente testo (le funzione di usplash sono editate da uno script che ho trovato sui forum di ubuntu, credito all'autore: StR34k):

### BEGIN INIT INFO
# Provides:          remove-usbkeydevice
# Required-Start:
# Required-Stop:
# Default-Start:        2 3 4 5
# Default-Stop:      
# Short-Description: Forces removal of the keydevice to continue boot.
# Description:
### END INIT INFO

KEYDEVICE=/dev/disk/by-id/<ID>

# Return true if usplash is running, otherwise return false.
[ -x /sbin/usplash_write ] && usplash_exists='1'
usplash_running()
{
        [ -z "$usplash_exists" ] && return 1
        pidof "usplash" >/dev/null
        return $?
} 

fixup_verbosity()
{
        if [ "$(expr match "$(cat /proc/cmdline)" '.*quiet')" -gt "0" ]; then
                /sbin/usplash_write "VERBOSE off" 2>/dev/null
        else
                /sbin/usplash_write "VERBOSE on" 2>/dev/null
        fi
}


# Write output to the console. n: now newline s: status (no time)
write_to_console()
{

        read system_uptime no_var < /proc/uptime

        if [ "x$2" != "xs" ];  then
                printf '[%8s0000] %s' "$system_uptime" "$1" >&2
        else
                printf '%s' "$1" >&2
        fi

        if [ "x$2" != "xn" ]; then
                printf '\n' >&2
        fi
}

# Write output to usplash
write_to_usplash()
{
        usplash_running
        if [ $? -eq 0 ]; then
                /sbin/usplash_write "VERBOSE on"
                /sbin/usplash_write "$1 $2"
                fixup_verbosity
        fi 
        
        write_to_console "$2" "$3"

        return 0
}

case "$1" in
start)

        if [ -b ${KEYDEVICE} ]; then
                write_to_usplash "TEXT" "Please remove your keydevice to continue."
        fi

        while [ -b ${KEYDEVICE} ]; do sleep 0.1; done

        exit 0;
        ;;
*)
        echo "Usage: remove-usbkeydevice start"
        exit 1
        ;;
esac

Mettete l'id della partizione del vostro dispositivo-chiave al posto di <ID>in cima allo script. Salvate ed uscite come al solito. Ora cambiate i permessi:

$ sudo chmod 755 /etc/init.d/remove-usbkeydevice

Dite al sistema di eseguirlo all'avvio:

$ sudo update-rc.d remove-usbkeydevice start 28 2 3 4 5 .

Questa guida è una traduzione dell'originale, reperibile a questo indirizzo: https://wiki.ubuntu.com/EncryptedFSRemovableKeyDeviceHowto, credito all'autore: Steven https://launchpad.net/~steven3000.


CategoryNuoviDocumenti