DMCRYPT

spialaspia@inventati.org

v0.1 13/03/2004


Guida all'installazione e utilizzo di dmcrypt (crittografia nel kernel linux)

1. Introduzione

dmcrypt e' un sistema per crittare partizioni, chiavette USB, cd, dvd o qualunque altro supporto di archiviazione di massa.

Il dmcrypt e' il successore del cryptoloop come sistema di crittazione di partizioni presente nel kernel linux. A differenza del cryptoloop pero' il dmcrypt non necessita di patch per il kernel e per il pacchetto util-linux. Il cryptoloop ha un problema di sicurezza (non molto grave), ed e' quindi consigliato passare al dmcrypt, che viene anche sviluppato molto piu' attivamente.

dmcrypt si appoggia sul device-mapper, un sistema presente nel kernel linux dalla versione 2.6, e utilizza le cryptoapi presenti nel kernel 2.6

homepage: http://www.saout.de/misc/dm-crypt/

INSTALLAZIONE:

Per sapere se il vostro kernel e' stato compilato con il supporto per dmcrypt, potete utilizzare il comando:

# cat /proc/config.gz | grep DM

oppure verificate il vostro /usr/src/linux/.config

e verificate che queste due opzioni siano presenti (indicano il supporto per il device mapper e il dmcrypt nel kernel, come modulo o statico)

CONFIG_BLK_DEV_DM=m oppure CONFIG_BLK_DEV_DM=y

CONFIG_DM_CRYPT=m oppure CONFIG_DM_CRYPT=y

se invece il supporto non e' attivato dovrete ricompilare il kernel. Le opzioni per attivare il supporto le trovate nella sezione

Device Drivers 
   --> [*] Multi-device support (RAID and LVM)
         --> [*] Device Mapper
                   --> [*] Crypt Target Support

Se avete compilato il device-mapper come modulo dovete caricarlo con

# modprobe dm_mod

il modulo dm_crypt invece dovrebbe autocaricarsi quando serve.

Sempre nel kernel verificate anche la presenza del supporto per gli argomenti di cifratura e di digest (sezione Cryptographic options).

Oltre a questo vi serve avere il pacchetto device-mapper installato, pacchetto che e' comunque presente ormai in tutte le principali distribuzioni linux.

2. Setup

E' possibile usare il dmcrypt direttamente, ma la procedura e' complicata, piu' comodo appoggiarsi al cryptsetup, un'applicazione per il setup che e' possibile scaricare dalla homapega ufficiale di dmcrypt.

il cryptsetup richiede libgcrypt e libdevmapper.

Se non usate devfs o udev lanciate lo script devmap_mknod.sh distribuito con il pacchetto device-mapper.

per l'utilizzo di cryptsetup lanciate

$ cryptsetup --help

e otterrete questo:

cryptsetup [OPTION...] <action> <name> [<device>]

le opzioni piu' importanti sono:

-c per specificare l'algoritmo a usare per la crittazione (fate cat /proc/crypto per vedere la lista degli algoritmi disponibili) l'algoritmo usato di default e' aes -h l'hash usato per creare la chiave di crittazione dalla passphrase (il default e' ripemd160) -s la dimensione della chiave di crittazione (di default sono 256 bit)

<action> invece definisce cosa deve fare il cryptsetup: create per creare un device remove per rimuovere un device reload per modificare il device attivo resize per ridimensionare il device attivo status per visualizzare informazioni sul device attivo

<name> e' il nome del device cosi' come compare sotto /dev/mapper/, a nostra scelta.

<device> e' il device crittato (es. /dev/loop0 ... /dev/loop7)

3. Utilizzo

ipotizziamo di voler creare un container (un file che conterra' i nostri dati crittati) di 200 Mb, che useremo per tenerci tutta la nostra posta.

il file container sara' /usr/local/container_posta

il nome del device gestito da devicemapper sara' dmcrypt_posta

il nome del device che useremo sara' /dev/loop4

il mount point sara' /home/utente/mail (Se la vostra posta e' attualmente in /home/utente/mail spostatela da un'altra parte)

Alcune delle seguenti operazioni andranno eseguite come root:

la prima cosa da fare e' creare il container di 200 Mb:

$ dd if=/dev/zero of=/usr/local/container_posta bs=1M count=200

adesso impostiamo il loop device associandolo al container:

$ losetup /dev/loop4 /home/utente/container

ora creiamo il device crittato:

$ cryptsetup -c aes -y create dmcrypt_posta /dev/loop4

vi sara' chiesta la password che proteggera' il filesystem crittato

formattiamo il file system (ext3):

$ mke2fs -j /dev/mapper/dmcrypt_posta

e infine montiamolo per vedere se funziona:

$ mount /dev/mapper/dmcrypt_posta /home/utente/mail

ora possiamo trasferire tutta la nostra posta in /home/utente/mail

Prima di spegnere il PC ricordatevi di smontare il file system usando questa sequenza di comandi, che smontano il file system, rimuovono il device ed effettuano il deattach del loop device

$ umount /home/utente/mail

$ cryptsetup remove posta_dmcrypt

$ losetup -d /dev/loop4

4. Script per semplificare l'utilizzo quotidiano

Per l'utilizzo quotidiano conviene crearsi uno script come questo che semplifica i vari passaggi:



#!/bin/bash

UTENTE=`whoami`

if [ "$UTENTE" != "root" ] ; then 
        echo "Devi essere root per usare questo script!!!!!"
exit 0
fi

function freeloop ()
{
        FREELOOP=""
        FREELOOP=`losetup -f`
}


# test per dmcrypt

if test $# != 2
then
        echo "Syntax: $0 1|2|3 ( 1=container1, 2=posta, 3=home) on|off"
        exit 100
fi

CIPHER=aes
HASH=rmd160
freeloop

case "$1" in
        1)
        CONTAINER=/home/utente/container
        NAME=secret1
        MPOINT=/mnt/dmcrypt
        LOOP=$FREELOOP
        ;;
        2)
        CONTAINER=/usr/local/container_posta
        NAME=posta
        MPOINT=/home/utente/mail/
        LOOP=$FREELOOP
        ;;
        3)
        CONTAINER=/mnt/usbpen1G
        NAME=myhome
        MPOINT=/home/utente
        LOOP=$FREELOOP
        ;;
        *)      
        echo "Il primo parametro definisce il container da usare"
        echo "1 - container     2 - posta       3 - home" 

        exit 1
        ;;
esac

case "$2" in
    on)
        if grep /dev/mapper/$NAME /etc/mtab > /dev/null; then
                echo "$MPOINT e' gia' montato"
                exit 1
        fi
        echo "mounting $CONTAINER on $MPOINT using loop $FREELOOP and name $NAME" 
        losetup $LOOP $CONTAINER
        cryptsetup -c $CIPHER create $NAME $LOOP
        mount /dev/mapper/$NAME $MPOINT
        df -hP /dev/mapper/$NAME
        ;;
    off)
        # find the loop device 
        LOOP=`cryptsetup status $NAME | grep device | awk '{print $2}'` 

        if grep /dev/mapper/$NAME /etc/mtab > /dev/null; then
                fuser -m $MPOINT > /dev/null && echo "IMPOSSIBILE SMONTARE $MPOINT, \
                qualcosa sta accedendo al filesystem...." && fuser -vm $MPOINT || \
                (umount $MPOINT; cryptsetup remove $NAME; losetup -d $LOOP; echo "$CONTAINER unmounted from $MPOINT")
        else 
                echo $MPOINT is not mounted 
                if [ -e /dev/mapper/$NAME ]; then
                echo "Removing the mapper " $NAME
                cryptsetup remove $NAME
                losetup -d $LOOP
                fi 
        fi
        ;;
     check)
        if grep /dev/mapper/$NAME /etc/mtab > /dev/null; then
                echo "$MPOINT e' montato, per fare il check devi smontarlo"
                exit 1
        fi
        echo "mounting $CONTAINER on $MPOINT"
        losetup $LOOP $CONTAINER
        cryptsetup -c $CIPHER create $NAME $LOOP
        read -p "sicuro di voler fare un e2fsck su questo container (y|n) ?" check
        if [ $check = "y" ] ; then 
                e2fsck /dev/mapper/$NAME
                $0 $1 off
        else
                exit
        fi
        ;;
      status)
        cryptsetup status $NAME
        echo 
        df -hP /dev/mapper/$NAME
        ;;
    *)
        echo "Il secondo parametro definisce l'azione (on|off|check|status)"
        exit 1
        ;;
esac