Crypto home
Da Wikipedia, l'enciclopedia libera.
A volte si sente la necessita' di cifrare i propri dati personali, ma spesso ledomande che ci poniamo sono ?
- E' complesso adottare questa soluzione?
- E' realmente sicuro?
- Se uso un algoritmo molto complesso le prestazioni degradano?
Le risposte sono molto semplici:
- Con i mezzi che si hanno ora a disposizione direi proprio di no.
- AES ha uno spazio delle chiavi, nel nostro esempio, di 2^256 quindi un bruteforce su un numero di chiavi cosi' ampio e' altamente improbabile, inoltre non sono noti risultati di crittanalisi che lo indeboliscano.
- Se l'algoritmo e' ben implementato le prestazioni non degradano di molto, anzi si puo' dire che il degrado e' veramente trascurabile.
Contents |
SETUP DEL SISTEMA
Innanzitutto un kernel >=2.6.10, tutto quello che dobbiamo fare e' configurarlo in modo che sia in grado di usare l'algoritmo AES in questo modo.
# Code maturity level options --->
Prompt for development and/or incomplete code/drivers
# General setup --->
Support for hot-pluggable devices
# Device Drivers > Multi-device support (RAID and LVM).
Device mapper support
Crypt target support
# Cryptographic options --->
AES cipher algorithms
Dopo aver compilato e riavviato il vostro sistema potrete verificare se il modulo e' attivo in questo modo
%> ls -L /dev/mapper/control
se non avete il device mapper basta installare il pacchetto dmsetup.
Su Debian basta installare dmsetup con il comando e non e' necessario ricompilare il kernel
%> aptitude install dmsetup
Ora dobbiamo controllare se il supporto ad AES e' attivo
%> cat /proc/crypto
l'output dovrebbe essere il seguente:
name : aes
module : aes
type : cipher
...
se non si ha un output di questo tipo bisogna caricare il modulo a mano con
%> modprobe aes
ora ci serve un tool che ci permetta di gestire in modo semplice dmsetup: il package si chiama cryptsetup, sempre facendo riferimento a Debian
%> aptitude install cryptsetup
Ora iniziamo con il vero e proprio procedimento di encryption
CIFRARE LA PARTIZIONE DI HOME
Nel caso in cui si dispone di una partizione apposita per la home, per esempio /dev/hda3, si procede in questo modo:
Controllo se ci sono errori nella partizione
%> badblocks -c 10240 -s -w -t random -v /dev/hda3
Riempio la partizione di dati Random
%> dd if=/dev/urandom of=/dev/hda3
Creo una partizione LUKS -- Linux Unified Key Setup
%> cryptsetup --verify-passphrase --verbose --hash=sha256 \\
\\ --cipher=aes-cbc-essiv:sha256 --key-size=256 luksFormat /dev/hda3
Ora setto il device mapper
%> cryptsetup luksOpen /dev/hda3 home
per controllare se il tutto funziona
%> cryptsetup status home
/dev/mapper/home is active:
cipher: aes-cbc-essiv:sha256
keysize: 256 bits
device: /dev/.static/dev/hda3
offset: 2056 sectors
size: 20962706 sectors
mode: read/write
Ora creiamo il filesystem
%> mkfs.reiserfs /dev/mapper/home
Monto il filesystem
%> mount /dev/mapper/home /mnt/
Ci copio dentro i file della home e lo smonto
%> cp -axv /home/* /mnt/ && umount /mnt
Ora non ci rimane che settare ad hoc il nostro fstab
# <file system> <mount point> <type> <options> <dump> <pass>
/dev/mapper/home /home ext3 defaults 1 2
e il nostro crypttab
# <target device> <source device> <key file> <options>
home /dev/hda3 none luks
e il gioco e' fatto.
Alcune distro non supportano le partizioni LUCKS di default quindi non le
montano all'avvio, per ovviare a questo problema:
1. Creiamo un file /etc/init.d/cryptinit contenente il seguente script
#! /bin/sh
# if this script is executed when home is opened, tries to close it;
# otherwise, tries to open it, for three times, then continue without
# opening it
if [ -b /dev/mapper/home ]; then
/sbin/cryptsetup luksClose home
else
i=3
while [ $i -gt 0 ]; do
let "i -= 1"
/sbin/cryptsetup luksOpen /dev/hda3 home && i=0
done
fi
2. Lo rendiamo eseguibile
%> chmod +x /etc/init.d/cryptinit
3. Lo linkiamo in /etc/rcS.d
%> cd /etc/rcS.d
%> ln -sf ../init.d/cryptinit S28cryptinit
4. Editiamo fstab in questo modo
# <file system> <mount point> <type> <options> <dump> <pass>
/dev/mapper/home /home reiserfs defaults 1 2
DELEGARE A PAM L'AUTENTICAZONE
Un altro modo di crittare la nostra home e delegare a PAM l'autenticazione e' ilseguente:
Installare i pacchetti libpam-mount cryptsetup openssl
%> aptitude install libpam-mount cryptsetup openssl
aggiungere la seguente riga al file /etc/pam.d/common-auth
auth optional pam_mount.so use_first_pass
in modo da avere i permessi di montarla anche via ssh e in tutti gli altri modi che PAM ci permette
Aggiungere al file /etc/pam.d/common-session
session optional pam_mount.so
alternativamente si puo' aggiungere anche la riga "@include common-pammount" in entrambi i file di cui sopra
aggiungere la seguente riga al file etc/security/pam_mount.conf:
volume my_username crypt - /dev/hda4 /home/my_username cipher=aes aes-256-ecb /home/my_username.key
ora dobbiamo creare la chiave
echo "my dmcrypt password" | openssl aes-256-ecb > /home/my_username.key
oppure usare la stessa password che usiamo anche per il login aggiungendo al file /etc/security/pam_mount.conf la seguente linea
volume my_username crypt - /dev/hda3 /home/my_username cipher=aes - -
io personalmente consiglio quest'ultimo metodo.
Nel caso non si disponga di una partizione a parte per la home, questa potrebbe anche essere montata in un immagine loopback anziche' in un'apposita partizione
Creiamo un file di loopback grande abbastanza da contenere tutti i nostri file in questo modo:
%> dd if=/dev/urandom of=/home/secret bs= # count= #
sostituite ovviamente le # con il numero di byte
ora settiamo il file come un loop device
%> losetup /dev/loop0 /home/secret
ora creiamo il device logico in questo modo:
%> cryptsetup -y create mycryprt /dev/loop0
e formattiamolo
%> mkfs.reiserfs /dev/mapper/mycrypt
montiamolo
%> mount /dev/mapper/mycrypt /mnt/secret
Ora possiamo copiarci dentro i file che conteneva la nostra home, Pam pensera' ad autenticarvi ad ogni login decrittando la vostra home.
METODO VELOCE
Installare il software
%> aptitude install cryptsetup libpam_mount
Creare la partizione di loop
%> dd if=/dev/urandom of=/home/.joe.img bs=1M count=15000
Settare la partizione di loop
%> losetup /dev/loop0 /home/.joe.img
Creare il volume logico cifrato
%> cryptsetup -c aes-cbc-essiv:sha256 -y -s 256 --verify-passphrase luksFormat /dev/loop0
Formattare il volume logico
%> cryptsetup luksOpen /dev/loop0 cryptedhome %> mkfs.reiserfs /dev/mapper/cryptedhome %> cryptsetup luksClose cryptedhome
Montare il volume cifrato
%> mkdir /tmp/foo %> mount /dev/mapper/cryptedhome /tmp/foo
-- copiate i dati ---
settate PAM
/etc/security/pam_mount.conf: # # dm_crypt + LUKS. Monta /home/.user.img # # volume * crypt - /home/.&.img /home/& loop - - volume joe crypt - /home/.joe.img /home/joe loop,cipher=aes - -
ora editate i seguenti file
/etc/pam.d/login /etc/pam.d/gdm /etc/pam.d/ssh
aggiungendo la seguente riga all fine
@include common-pammount
Editate il file
/etc/pam.d/common-auth
Aggiungendo alla fine
auth optional pam_mount.so use_first_pass
Alla fine del file
/etc/pam.d/common-session
Aggiungete
session optional pam_mount.so
Autore
Andrea Ferraresi <andrea.ferraresi@gmail.com>
Si ringraziano:
- Stefano Spinucci
- Uwe Hermann
- http://www.kill-9.org
- Ivo Marino
- Tutti quelli che correggeranno o daranno un apporto a questa guida ( mandatemi le email con le vostre errata-corrige).
