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 0Premete 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
;;
esacMettete 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.
