[glux] Chiave USB criptata

Andrea aerdan@inventati.org
Mer 15 Feb 2006 01:01:01 CET


CHIAVI USB CRIPTATE
-------------------------------------------------------------------------------

Mi documento su come creare una chiave USB criptata e trovo:

    http://www.fizban.net/static/articolios/html/secureFS.html

che fa decisamente al caso mio anche se in reatà creo un file all'interno del
filesystem e non un filesystem criptato.

Mi assicuro che non sia montata e formatto la chiavetta con:

    # fdisk /dev/sda

Cancello la partizione esistente e ne creo una nuova, ora formatto la partizione
in ext2 con:

    # mke2fs /dev/sda1
    mke2fs 1.37 (21-Mar-2005)
    Etichetta del filesystem=
    Tipo SO: Linux
    Dimensione blocco=4096 (log=2)
    Dimensione frammento=4096 (log=2)
    125952 inode, 251644 blocchi
    12582 blocchi (5.00%) riservati per l'utente root
    Primo blocco dati=0
    8 gruppi di blocchi
    32768 blocchi per gruppo, 32768 frammenti per gruppo
    15744 inode per gruppo
    Backup del superblocco salvati nei blocchi:
        32768, 98304, 163840, 229376

    Scrittura delle tavole degli inode: fatto
    Scrittura delle informazioni dei superblocchi e dell'accounting del
filesystem:
    fatto

Questo filesystem verrà automaticamente controllato ogni 21 mount, o
180 giorni, a seconda di quale venga prima. Usare tune2fs -c o -i per cambiare.

Ricompilo il kernel  con il supporto per:

    -Loopback device support - CONFIG_BLK_DEV_LOOP - loop
    -Cryptoloop Support - CONFIG_BLK_DEV_CRYPTOLOOP - cryptoloop
    -Device mapper support - CONFIG_BLK_DEV_DM - dm-mod
    -Crypt target support - CONFIG_DM_CRYPT - dm-crypt

Utilizzo l'algoritmo Rijndael perchè offre maggior livello di sicurezza e
prestazioni. Questo algoritmo permette di criptare con chiavi di 128, 192, 256
bits.

    -AES cipher algorithms (i586) - CONFIG_CRYPTO_AES_586 - aes-i586

Questi altri algoritmi sono comunque validi e per evenienza li inserisco anche
loro, non si sa mai ;)

    -Blowfish cipher algorithm - CONFIG_CRYPTO_BLOWFISH - blowfish
    -Twofish cipher algorithm - CONFIG_CRYPTO_TWOFISH - twofish
    -DES and Triple DES EDE cipher algorithms - CONFIG_CRYPTO_DES - des

Controllo la versione di losetup che servirà per montare il dispositivo
criptato. La man page non è utile in quanto non riporta se la versione permette
l'utilizzo di algoritmi arbitrari provo con:

    # losetup --help
    usage:
      losetup loop_device                                      # give info
      losetup -d loop_device                                   # delete
      losetup -f                                               # find unused
      losetup [ options ] {-f|loop_device} file                # setup
        where options include
        --offset <num>, -o <num>
            start at offset <num> into file.
        --pass-fd <num>, -p <num>
            read passphrase from file descriptor <num>
            instead of the terminal.
        --encryption <cipher>, -e <cipher>
            encrypt with <cipher>.
            Check /proc/crypto or /proc/crypto/cipher for available ciphers.
        --nohashpass, -N
        Don't hash the password given.  (previous versions hash, non-debian
doesn't.
        --keybits <num>, -k <num>
            specify number of bits in the hashed key given
            to the cipher.  Some ciphers support several key
            sizes and might be more efficient with a smaller
            key size.  Key sizes < 128 are generally not
            recommended
Pare che l'opzione --encryption permetta di scegliere tra diversi algoritmi
gestiti dal kernel. Inoltre:

    $ dpkg -l linux-util
    ii  util-linux     2.12p-4sarge1  Miscellaneous system utilities

percui sembra essere già patchato.

Installo il kernel e riavvio la macchina.

Carico i moduli:

    Module                  Size  Used by
    dm_crypt               10632  0
    dm_mod                 55932  1 dm_crypt
    cryptoloop              3840  0
    loop                   15880  1 cryptoloop
    aes_i586               39028  0

Ora il cat di /proc/crypto include aes-i586

    # cat /proc/crypto
    name         : aes
    module       : aes_i586
    type         : cipher
    blocksize    : 16
    min keysize  : 16
    max keysize  : 32

Creo un file che verrà criptato nella mia home dir di dimensioni a seconda
della chiavetta, la mia è da 918,3MB quindi creo un file da 900MB con:

    $ dd if=/dev/urandom of=~/crypto bs=1024k count=900

Verifico l'esistenza del file di dispositivo loop0:

    $ ls -l /dev/loop0
    brw-rw----  1 root disk 7, 0 2006-02-13 13:12 /dev/loop0

ora associo il file crypto al crypto loop device ed eseguo l'operazione da root
in quanto la mia utenza non ha permessi sufficienti per losetup:

    # losetup --keybits 256 -e aes-i586-256 /dev/loop0 ./crypto
    Password:
    ioctl: LOOP_SET_STATUS: Invalid argument

Ricevo lo stesso errore provando con blowfish-128 mentre con solo blowfish tutto
funziona quindi:

    # losetup --keybits 128 -e blowfish /dev/loop0 ./crypto

Adesso posso creare un file system vero e proprio e montarlo in una directory:

    # mke2fs /dev/loop0
    mke2fs 1.37 (21-Mar-2005)
    Etichetta del filesystem=
    Tipo SO: Linux
    Dimensione blocco=4096 (log=2)
    Dimensione frammento=4096 (log=2)
    115200 inode, 230400 blocchi
    11520 blocchi (5.00%) riservati per l'utente root
    Primo blocco dati=0
    8 gruppi di blocchi
    32768 blocchi per gruppo, 32768 frammenti per gruppo
    14400 inode per gruppo
    Backup del superblocco salvati nei blocchi:
            32768, 98304, 163840, 229376

            Scrittura delle tavole degli inode: fatto
            Scrittura delle informazioni dei superblocchi e dell'accounting del
            filesystem: fatto

            Questo filesystem verrà automaticamente controllato ogni 33 mount, o
            180 giorni, a seconda di quale venga prima. Usare tune2fs -c o -i
per
            cambiare.

    # mkdir /mnt/crypto
    # mount -t ext2 /dev/loop0 /mnt/crypto
    # mount
    [...]
    /dev/loop0 on /mnt/crypto type ext2 (rw)

Affinché il mio utente possa utilizzare il filesystem devo
impostare i permessi:

    # chown andrea:andrea /mnt/crypto/

Ora smonto il file system e rilascio il dispositivo di loop:

    # umount /mnt/crypto
    # losetup -d /dev/loop0

Copio il file crypto sulla chiave USB che viene montata da udev in
/media/usbdisk

    $ cp crypto /media/usbdisk

Dunque, la creazione del disco è terminata, per poterlo utilizzare occorre:

    montare        associare           montare il
    la chiave -->  il file-system -->  loop device --> lavoro -->
    USB su una     criptato a un       su una
    directory      loop device         directory

        smontare il      rilasciare      smontare
    --> loop device -->  il loop    -->  chiave USB
        dalla            device          dalla
        directory                        directory

quindi:

    # mount -t ext2 /dev/sda /media/usbdisk
    # losetup  --keybits 128 -e blowfish /dev/loop0 /media/usbdisk/crypto
    # mount -t ext2 /dev/loop0 /mnt/crypto/

    # mount
    [...]
    /dev/sda1 on /media/usbdisk type ext2 (rw)
    /dev/loop0 on /mnt/crypto type ext2 (rw)

Per smontare tutto:

    # umount /mnt/crypto/
    # losetup -d /dev/loop0
    # umount /media/usbdisk/

    # mount -t ext2 /dev/loop0 /mnt/crypto/
    mount: wrong fs type, bad option, bad superblock on /dev/loop0,
           missing codepage or other error
           In some cases useful info is found in syslog - try
           dmesg | tail  or so
    # tail /var/log/syslog
    [...]
    Feb 14 22:38:02 localhost kernel: VFS: Can't find ext2 filesystem on dev
loop0.

Non viene riconosciuto il filesystem quindi è possibile riprovare con losetup e
la password giusta.

Conclusioni... funziona ma è un po' laborioso

-- 
ð Gli uomini sono fratelli fra loro. Cessano di esserlo quando
¶ la terra viene divisa da steccati e confini.
ñ
²			Heinmot-Tayala-Ket, Nez Percé
€
¯ KeyID:   5AF81406   2005-01-03   [scadenza: 2015-01-01]
3 KeyFpr:  A4E2 7C7C CFC7 1B1E E405  6443 9E07 AF95 5AF8 1406


Maggiori informazioni sulla lista glux