Volumi criptati LUKS - Creazione e uso con cryptmount: differenze tra le versioni

Da Guide@Debianizzati.Org.
Vai alla navigazione Vai alla ricerca
Nessun oggetto della modifica
Riga 1: Riga 1:
==Introduzione==
Un accesso indesiderato ai nostri dati si tende a pensare che possa avvenire da un'intrusione da rete. Certamente questo è lo scenario tipico, ma non bisognerebbe scordare che il più delle volte per accedere a un dato contenuto su un certo supporto, basta avere accesso "fisico" al supporto stesso.
Apt-cacher � un programma che ha lo scopo di creare una cache di pacchetti deb su un server, per poi renderli disponibili a tutte le macchine presenti sulla LAN. In questo modo � possibile limitare la banda utlizzata in uscita e velocizzare i tempi di installazione.
Questo è molto più importante oggi giorno di quanto non fosse fino a pochi anni fa a causa della diffusione di sistemi di memorizzazione di massa portabili, estremamente comodi e che ci stiamo abituando ad avere sempre con noi, nello zaino, in una tasca o marsupio.
Altro scenario interessante è quello nel quale i dati in questione sono contenuti in un computer acceso e connesso alla rete, ma sono dati che ci interessa avere a disposizione esclusiva del nostro utente, e quindi se un'intrusione ci deve proprio essere è utile rendere all'intruso la vita molto dura nell'ottenimento di quei dati sensibili.
In questa guida sono contenuti i passi necessari per cifrare una partizione o una periferica (rimovibile o meno) o creare un file che useremo come loop device cifrata (con il vantaggio di essere estremamente trasportabile e archiviabile). Questo sarà mostrato nello scenario più semplice, quello con accesso ai file da parte di un singolo utente. La tecnologia usata però è quella nota col nome di [http://luks.endorphin.org/ LUKS] (Linux Unified Keys Setup) che consente l'utilizzo della crittografia in scenari molto più articolati, con una base di compatibilità che andrà sempre crescendo in tutto il mondo linux (questo è uno degli obiettivi del progetto). È bene fare le cose fin da subito compatibili con uno standard che sarà sempre più importante oltre che ricco di potenzialità, soprattutto pensando a quanto la riservatezza dei propri dati digitali sia sempre più sentita come importante anche dagli utenti semplici.


A differenza di apt-proxy (http://apt-proxy.sourceforge.net/), apt-cacher ha una struttura completamente piatta, per cui i pacchetti dela cache sono conservati in una unica directory anche se provengono da repository diversi; questa soluzione ne rende l'utilizzo pi� semplice e immediato.
Le tecniche mostrate in questa guida sono ancora "rozze" nel senso che richiedono per l'utente che le usa di autenticarsi come root, però possono costituire una base di partenza. {{Box|Disclaimer|Appena riuscirò a trovare la tecnica per evitare l'autenticazione come root, aggiornerò questa guida, rendendo la cifratura più adatta a sistemi multi-utente}}
                             
La distribuzione cui ci si riferisce è Etch, ma il discorso dovrebbe subire modifiche minime o nulle sia per Lenny che per Sid.
==Installazione==
=='''Prerequisiti e preparazione del sistema'''==
Per installare apt-cache � sufficiente digitare sul server che dovr� contenere la cache
{{Box|Hardware|A livello hardware la cifratura con algoritmo AES è molto leggera quindi può essere eseguita anche su macchine molto datate, o piccoli sistemi embedded.}}
<pre>
La prima cosa da controllare prima di cimentarsi nella criptazione è l'abilitazione del kernel a usare l'algoritmo AES. I kernel precompilati di debian sono tutti già abilitati, quindi il controllo non dovrebbe essere necessario. In un terminale eseguiamo<pre>cat /proc/crypto</pre> e con il kernel 2.6.18 di etch dovremmo ottenere (in base anche ai moduli caricati) qualcosa tipo<pre>name        : sha256
# apt-get install apt-cacher
driver      : sha256-generic
</pre>
module      : sha256
priority    : 0
type        : digest
blocksize    : 64
digestsize  : 32


==Configurazione==
name        : aes
Per configurare apt-cacher � necessario:
driver      : aes-generic
module      : aes
priority    : 100
type        : cipher
blocksize    : 16
min keysize  : 16
max keysize  : 32


1) modificare il file
...</pre>
<pre>
Ovviamente a noi interessa la sezione che inizia con '''name        : aes'''. Se non dovesse comparire dobbiamo controllare che il modulo '''aes''' sia caricato e ottenere un'output simile a questo: <pre>lsmod | grep aes
/etc/default/apt-cacher
aes                    28160  2</pre>.
</pre>
Se l'output dovesse essere vuoto dobbiamo caricare il modulo '''aes''' con l'usuale comando '''modprobe aes'''.
ponendo ad 1 il valore di AUTOSTART. In questo modo apt-cacher si avvier� automaticamente ad ogni sessione. Nel caso vogliate avviare/fermare apt-cacher manualmente baster� usare il comando
<pre>
# /etc/init.d/apt-cacher {start|stop|restart|force-reload}
</pre>
2) modificare il file
<pre>
/etc/apt-cacher/apt-cacher.conf
</pre>
che contiene tutte le opzioni configurabili.
Riportiamo il file di configurazione originale per completezza
<pre>
#################################################################
# This is the config file for apt-cacher. On most Debian systems
# you can safely leave the defaults alone.
#################################################################


# cache_dir is used to set the location of the local cache. This can
Se non usaimo un kernel precompilato debian, dobbiamo controllare che l'algoritmo di cifratura sia stato compilato: dal menu "'''Linux Kernel Configuration'''" seguiamo la voce "'''Cryptographic options  --->'''" e abilitiamo la voce <pre>AES cipher algorithms</pre> o la strettamente legata <pre>AES cipher algorithms (i586)</pre>
# become quite large, so make sure it is somewhere with plenty of space.
cache_dir=/var/cache/apt-cacher


# The email address of the administrator is displayed in the info page
Sistemato il kernel passiamo all'installazione del software necessario:<pre>aptitude install cryptsetup</pre>che installerà tutte le dipendenze necessarie (piccole: l'installazione completa di tutte le sue dipendenze sta sotto i 2MB di spazio disco!).
# and traffic reports.
admin_email=root@localhost


# For the daemon startup settings please edit the file /etc/default/apt-cacher.
=='''Preparazione del file o della periferica'''==
==='''Creare una loop device da un file'''===
Per preparare un file di dimensione fissata (in base alla quantità e tipo di dati che vorremo salvare cifrati) usiamo il comando dd:<pre>dd if=/dev/zero of=/home/nomeutente/immagine_cifrata ibs=1M count=10</pre>per creare un file da poi usare di 10MB nella home di "nomeutente" (perdonate la poca fantasia).


# Daemon port setting, only useful in stand-alone mode. You need to run the
Autentichiamoci come root e montiamo il file appena creato in loop. Prima di tutto impostiamo il file appena creato come una loop device (ammettendo che questa sia la prima periferica in loop del sistema):<pre>/sbin/losetup /dev/loop/0 /home/nomeutente/immagine_cifrata</pre>
# daemon as root to use privileged ports (<1024).
==='''Creare la partizione criptata'''===
daemon_port=3142
Per chi invece di cifrare un file montato in loop, deve cifrare una block device ordinaria, basta che sappia quale nome le abbia assegnato il kenrel (con precisione, perché la procedura seguente cancellerà tutti i dati nella periferica).
{{Box|Periferiche|D'ora in poi chiameremo /dev/periferica la block device sulla quale scriveremo i dati cifrati, sia essa la periferica in loop del paragrafo precedente (/dev/loop/0) o una periferica ordinaria}}
Creiamo la partizione LUKS:<pre>cryptsetup --verify-passphrase --verbose --hash=sha256 --cipher=aes-cbc-essiv:sha256 --key-size=256 luksFormat /dev/periferica


# optional settings, user and group to run the daemon as. Make sure they have
WARNING!
# sufficient permissions on the cache and log directories. Comment the settings
========
# to run apt-cacher as the native user.
This will overwrite data on /dev/periferica irrevocably.
group=www-data
user=www-data


# optional setting, binds the listening daemon to one specified IP. Use IP
Are you sure? (Type uppercase yes):  </pre>Come dice il messaggio bisogna rispondere con uno '''YES''' interamente maiuscolo.
# ranges for more advanced configuration, see below.
Ci verrà di seguito chiesta una parola d'ordine e la sua conferma; mentre le digiteremo non vedremo nulla cambiare nel terminale:<pre>Enter LUKS passphrase:
# daemon_addr=localhost
Verify passphrase:
Command successful.</pre>
A questo punto dobbiamo dare istruzioni al device mapper di mappare la periferica LUKS appena creata in una block device virtuale sulla quale scrivere i nostri dati in chiaro (e poi essi saranno scritti cifrati su /dev/periferica):<pre>cryptsetup luksOpen /dev/periferica criptata</pre>Questo creerà la periferica '''/dev/mapper/criptata''', sulla quale noi andremo a creare il file system che più ci interessa (su periferiche piccole come quella in esempio non conviene usare un file system con indicizzazione come reiserfs o ext3, bensì un più semplice ext2 o una fat):<pre>mkfs -t ext2 /dev/mapper/criptata</pre>Non ci rimane che montarla in una cartella di prova per verificare che sia tutto corretto (funzionamento, dimensioni desiderate ecc.):<pre>mount -t auto /dev/mapper/criptata /mnt/prova</pre>


# If your apt-cacher machine is directly exposed to the Internet and you are
=='''Rimozione della periferca criptata'''==
# worried about unauthorised machines fetching packages through it, you can
Per rimuovere la periferica cifrata bisogna innanzi tutto smontarla, poi bisogna dire a cryptsetup di chiudere la periferica (il che automaticamente eliminerà il nodo creato dal device mapper):<pre>umount /mnt/prova
# specify a list of IPv4 addresses which are allowed to use it and another
/sbin/cryptsetup luksClose criptata</pre>
# list of IPv4 addresses which aren't.
==='''Rimozione di una loop device'''===
# Localhost (127.0.0.1) is always allowed. Other addresses must be matched
Nel caso che la nostra periferica sia un file montato in loop, è consigliabile eliminare il collegamento che il nostro file immagine ha con la periferica loop cui l'abbiamo associato; questo ci permetterà di spostare o eliminare il file senza creare malfunzionamenti nelle periferiche di loop, così come ci consentirà di aprire nuove periferiche in loop ripartendo dalla numero 0:<pre>/sbin/losetup -d /dev/loop0</pre>
# by allowed_hosts and not by denied_hosts to be permitted to use the cache.
# Setting allowed_hosts to "*" means "allow all".
# Otherwise the format is a comma-separated list containing addresses,
# optionally with masks (like 10.0.0.0/22), or ranges of addresses (two
# addresses separated by a hyphen, no masks, like '192.168.0.3-192.168.0.56').
allowed_hosts=*
denied_hosts=


# And similiarly for IPv6 with allowed_hosts_6 and denied_hosts_6.
=='''Automatizzazione dei passi necessari'''==
# Note that IPv4-mapped IPv6 addresses (::ffff:w.x.y.z) are truncated to
A questo punto dobbiamo solo creare uno script da eseguire come root, per fare tutte le operazioni di creazione e montaggio, o viceversa di smontaggio e rimozione automaticamente.
# w.x.y.z and are handled as IPv4.
Di seguito sono riportati due script, uno per il caso di file montato ricorsivamente, l'altro per il caso di periferica ordinaria.
allowed_hosts_6=fec0::/16
In entrambi i casi il montaggio della periferica criptata avviene nella cartella "criptata" nella home dell'utente; è necessario quindi creare la cartella:<pre>mkdir /home/'''nomeutente'''/criptata</pre>
denied_hosts_6=
==='''Scritp per file immagine'''===
<pre>#Utilizzo di un file immagine come periferica criptata
#!/bin/bash


# This thing can be done by Apache but is much simplier here - limit access to
case $1 in
# Debian mirrors based on server names in the URLs
        monta)
#allowed_locations=ftp.uni-kl.de,ftp.nerim.net,debian.tu-bs.de
                if [ -f /home/'''nomeutente'''/immagine_cifrata ]; then
                    echo "Impostazione periferica ricorsiva (loop)."
                    /sbin/losetup /dev/loop0 /home/'''nomeutente'''/immagine_cifrata
                fi


# Apt-cacher can generate usage reports every 24 hours if you set this
                if [ $? = 0 ]; then
# directive to 1. You can view the reports in a web browser by pointing
                    /sbin/cryptsetup luksOpen /dev/loop0 criptata
# to your cache machine with '/apt-cacher/report' on the end, like this:
                else
#      http://yourcache.example.com/apt-cacher/report
                    echo "Impostazione periferica ricorsiva non riuscita."
# Generating reports is very fast even with many thousands of logfile
                fi
# lines, so you can safely turn this on without creating much
# additional system load.
generate_reports=1


# Apt-cacher can clean up its cache directory every 24 hours if you set
                if [ $? = 0 ]; then
# this directive to 1. Cleaning the cache can take some time to run
                    mount /dev/mapper/criptata /home/'''nomeutente'''/criptata
# (generally in the order of a few minutes) and removes all package
                fi
# files that are not mentioned in any existing 'Packages' lists. This
# has the effect of deleting packages that have been superseded by an
# updated 'Packages' list.
clean_cache=1


# The directory to use for apt-cacher access and error logs.
                if [ $? !=0 ]; then
# The access log records every request in the format:
                    echo "Impossibile montare la periferica criptata."
# date-time|client ip address|HIT/MISS/EXPIRED|object size|object name
                    /sbin/cryptsetup luksClose criptata
# The error log is slightly more free-form, and is also used for debug
                    /sbin/losetup -d /dev/loop0
# messages if debug mode is turned on.
                fi
# Note that the old 'logfile' and 'errorfile' directives are
        ;;
# deprecated: if you set them explicitly they will be honoured, but it's
        smonta)
# better to just get rid of them from old config files.
                umount /dev/mapper/criptata
logdir=/var/log/apt-cacher


# apt-cacher can use different methods to decide whether package lists need to
                if [ $? = 0 ]; then
# be updated,
                    /sbin/cryptsetup luksClose criptata
# A) looking at the age of the cached files
                else
# B) getting HTTP header from server and comparing that with cached data. This
                    echo "Smontaggio non riuscito."
# method is more reliable and avoids desynchronisation of data and index files
                fi
# but needs to transfer few bytes from the server every time somebody requests
# the files ("apt-get update")
# Set the following value to the maximum age (in hours) for method A or to 0
# for method B
expire_hours=0


# Apt-cacher can pass all its requests to an external http proxy like
                if [ $? = 0 ]; then /sbin/losetup -d /dev/loop0
# Squid, which could be very useful if you are using an ISP that blocks
                else echo "Chiusura periferica criptata non riuscita."
# port 80 and requires all web traffic to go through its proxy. The
                fi
# format is 'hostname:port', eg: 'proxy.example.com:8080'.
        ;;
http_proxy=proxy.example.com:8080
        *)
        echo "Usage: $1 {monta|smonta}" >&2
        exit 1
        ;;
esac</pre>
==='''Scritp per periferica ordinaria'''===
In questo esempio viene usata la prima partizione di una scheda di memoria SD (/dev/mmcblk0p1 con lettore compatibile con il modulo sdhci).
<pre>#!/bin/bash


# Use of an external proxy can be turned on or off with this flag.
case $1 in
# Value should be either 0 (off) or 1 (on).
        monta)
use_proxy=0
                echo "Verifica presenza SD:"
                if [ -b /dev/mmcblk0p1 ] ; then
                    echo "."
                else
                    echo "La periferica non è inserita!"
                    exit 2
                fi


# External http proxy sometimes need authentication to get full access. The
                if [ $? = 0 ]; then /sbin/cryptsetup luksOpen /dev/mmcblk0p1 criptata
# format is 'username:password'.
                fi
http_proxy_auth=proxyuser:proxypass


# Use of external proxy authentication can be turned on or off with this flag.
                if [ $? = 0 ]; then
# Value should be either 0 (off) or 1 (on).
                    mount /dev/mapper/criptata /home/'''nomeutente'''/criptata
use_proxy_auth=0
                fi


# Rate limiting sets the maximum bandwidth in bytes per second to use
                if [ $? != 0 ]; then
# for fetching packages. Syntax is fully defined in 'man wget'.
                    echo "Il file system cifrato non può essere montato."
# Use 'k' or 'm' to use kilobits or megabits / second: eg, 'limit=25k'.
                    /sbin/cryptsetup luksClose criptata
# Use 0 or a negative value for no rate limiting.
                fi
limit=0
        ;;
        smonta)
#Smonto il file system criptato e controllo che lo smontaggio sia avvenuto correttamente
                umount /dev/mapper/criptata
                if [ $? != 0 ]; then
                    echo "Smontaggio non riuscito."
                fi


# Debug mode makes apt-cacher spew a lot of extra debug junk to the
#Chiudo il nodo in /dev/mapper e controllo
# error log (whose location is defined with the 'logdir' directive).
                /sbin/cryptsetup luksClose criptata
# Leave this off unless you need it, or your error log will get very
                if [ $? = 0 ]; then
# big. Acceptable values are 0 or 1.
                    echo "Nodo cifrato in /dev/mapper rimosso."
debug=0
                else echo "Chiusura periferica criptata non riuscita"
                fi
        ;;
        *)
        echo "Usage: $1 {monta|smonta}" >&2
        exit 1
        ;;
esac</pre>


# Adapt the line in the usage info web page to match your server configuration
# example_sources_line=deb&nbsp;http://<b>my.cacher.server:3142/</b>ftp.au.debian.org/debian&nbsp;unstable&nbsp;main&nbsp;contrib&nbsp;non-free


# Print a 410 (Gone) HTTP message with the specified text when accessed via
: [[Utente:GipPasso|GipPasso]]
# CGI. Useful to tell users to adapt their sources.list files when the
# apt-cacher server is beeing relocated (via apt-get's error messages while
# running "update")
#cgi_advise_to_use = Please use http://cacheserver:3142/ as apt-cacher access URL
#cgi_advise_to_use = Server relocated. To change sources.list, run perl -pe "s,/apt-cacher\??,:3142," -i /etc/apt/sources.list
 
# Server mapping - this allows to hide real server names behind virtual paths
# that appear in the access URL. This method is known from apt-proxy. This is
# also the only method to use FTP access to the target hosts. The syntax is simple, the part of the beginning to replace, followed by a list
#of mirror urls, all space separated. Multiple profile are separated by semicolons
# path_map = debian ftp.uni-kl.de/pub/linux/debian ftp2.de.debian.org/debian ; ubuntu archive.ubuntu.com/ubuntu ;
#security security.debian.org/debian-security ftp2.de.debian.org/debian-security
# Note that you need to specify all target servers in the allowed_locations
# options if you make use of it. Also note that the paths should not overlap
# each other. FTP access method not supported yet, maybe in the future.
</pre>
 
Le opzioni pi� importanti sono:
 
# <code>cache_dir</code> che determina la directory in cui verr� salvata la cache
# <code>allowed_hosts</code> che specifica uno o pi� indirizzi a cui limitare l'accesso alla cache
# <code>daemon_port</code> che specifica la porta sulla quale ascolta apt-cacher
 
==Client==
Non � necessario installare apt-cacher sui client. Per accedere alla cache potrete:
 
'''Metodo 1''' (pi� veloce)
 
modificare il file
 
<pre>
/etc/apt/apt.conf
</pre>
 
inserendo una riga da del tipo
 
<pre>
Acquire::http::Proxy "http://server_con_cache:porta/";
</pre>
 
Chiariamo il concetto con un esempio. <br>
Supponiamo che il server abbia hostname computer e apt-cacher ascolti sulla porta 3142 (quella di default).
 
La nuova riga da inserire per utilizzare la cache sar�
 
<pre>
Acquire::http::Proxy "http://computer:3142/";
</pre>
 
 
'''Metodo 2'''
 
dovrete solo modificare il file
 
<pre>
/etc/apt/sources.list
</pre>
 
inserendo una riga da del tipo
 
<pre>
deb http://server_con_cache:porta/repository_da_utilizzare/debian [flavour] [sezioni]
</pre>
 
Chiariamo il concetto con un esempio. <br>
Supponiamo che il server abbia hostname computer e apt-cacher ascolti sulla porta 3142 (quella di default). Supponiamo poi che il repository utilizzato sia
 
<pre>
deb http://ftp.it.debian.org/debian unstable main contrib non-free
</pre>
 
La nuova riga da inserire per utilizzare la cache sar�
 
<pre>
deb http://computer:3142/ftp.it.debian.org/debian unstable main contriib non-free
</pre>
 
 
----
 
Baster� poi salvare e lanciare un
 
<pre>
# apt-get update
</pre>
 
per cominciare ad utilizzare la cache.
 
Importante notare che tutte le righe dovranno presentare la dicitura deb http e non deb ftp.
 
==Importare Pacchetti==
A questo punto siamo pronti per usare apt-cacher. Se per� si hanno gi� a disposizione tanti pacchetti installati sul server e presenti nella directory
 
<pre>
/var/cache/apt/archives
</pre>
 
potreste volerli importare nella cache. Niente di pi� semplice :)
 
Copiate tutti i pacchetti nella directory
 
<pre>
/var/cache/apt-cacher/import
</pre>
 
e poi lanciate il comando
 
<pre>
# /usr/share/apt-cacher/apt-cacher-import.pl
</pre>
 
che mette a disposizione tutti i pacchetti importati nella cache.
 
Non resta che augurare happy caching!
 
 
----
Autore: giorsat <br>
Esteso da: [[Utente:Sal|Sal]]
 
[[Categoria:Server]][[Categoria:Apt]]
[[Categoria:Repository]]

Versione delle 02:17, 10 dic 2007

Un accesso indesiderato ai nostri dati si tende a pensare che possa avvenire da un'intrusione da rete. Certamente questo è lo scenario tipico, ma non bisognerebbe scordare che il più delle volte per accedere a un dato contenuto su un certo supporto, basta avere accesso "fisico" al supporto stesso. Questo è molto più importante oggi giorno di quanto non fosse fino a pochi anni fa a causa della diffusione di sistemi di memorizzazione di massa portabili, estremamente comodi e che ci stiamo abituando ad avere sempre con noi, nello zaino, in una tasca o marsupio. Altro scenario interessante è quello nel quale i dati in questione sono contenuti in un computer acceso e connesso alla rete, ma sono dati che ci interessa avere a disposizione esclusiva del nostro utente, e quindi se un'intrusione ci deve proprio essere è utile rendere all'intruso la vita molto dura nell'ottenimento di quei dati sensibili. In questa guida sono contenuti i passi necessari per cifrare una partizione o una periferica (rimovibile o meno) o creare un file che useremo come loop device cifrata (con il vantaggio di essere estremamente trasportabile e archiviabile). Questo sarà mostrato nello scenario più semplice, quello con accesso ai file da parte di un singolo utente. La tecnologia usata però è quella nota col nome di LUKS (Linux Unified Keys Setup) che consente l'utilizzo della crittografia in scenari molto più articolati, con una base di compatibilità che andrà sempre crescendo in tutto il mondo linux (questo è uno degli obiettivi del progetto). È bene fare le cose fin da subito compatibili con uno standard che sarà sempre più importante oltre che ricco di potenzialità, soprattutto pensando a quanto la riservatezza dei propri dati digitali sia sempre più sentita come importante anche dagli utenti semplici.

Le tecniche mostrate in questa guida sono ancora "rozze" nel senso che richiedono per l'utente che le usa di autenticarsi come root, però possono costituire una base di partenza.

Info.png Disclaimer
Appena riuscirò a trovare la tecnica per evitare l'autenticazione come root, aggiornerò questa guida, rendendo la cifratura più adatta a sistemi multi-utente

La distribuzione cui ci si riferisce è Etch, ma il discorso dovrebbe subire modifiche minime o nulle sia per Lenny che per Sid.

Prerequisiti e preparazione del sistema

Info.png Hardware
A livello hardware la cifratura con algoritmo AES è molto leggera quindi può essere eseguita anche su macchine molto datate, o piccoli sistemi embedded.

La prima cosa da controllare prima di cimentarsi nella criptazione è l'abilitazione del kernel a usare l'algoritmo AES. I kernel precompilati di debian sono tutti già abilitati, quindi il controllo non dovrebbe essere necessario. In un terminale eseguiamo

cat /proc/crypto

e con il kernel 2.6.18 di etch dovremmo ottenere (in base anche ai moduli caricati) qualcosa tipo

name         : sha256

driver  : sha256-generic module  : sha256 priority  : 0 type  : digest blocksize  : 64 digestsize  : 32

name  : aes driver  : aes-generic module  : aes priority  : 100 type  : cipher blocksize  : 16 min keysize  : 16 max keysize  : 32

...

Ovviamente a noi interessa la sezione che inizia con name  : aes. Se non dovesse comparire dobbiamo controllare che il modulo aes sia caricato e ottenere un'output simile a questo:

lsmod | grep aes
aes                    28160  2

.

Se l'output dovesse essere vuoto dobbiamo caricare il modulo aes con l'usuale comando modprobe aes.

Se non usaimo un kernel precompilato debian, dobbiamo controllare che l'algoritmo di cifratura sia stato compilato: dal menu "Linux Kernel Configuration" seguiamo la voce "Cryptographic options --->" e abilitiamo la voce

AES cipher algorithms

o la strettamente legata

AES cipher algorithms (i586)

Sistemato il kernel passiamo all'installazione del software necessario:

aptitude install cryptsetup

che installerà tutte le dipendenze necessarie (piccole: l'installazione completa di tutte le sue dipendenze sta sotto i 2MB di spazio disco!).

Preparazione del file o della periferica

Creare una loop device da un file

Per preparare un file di dimensione fissata (in base alla quantità e tipo di dati che vorremo salvare cifrati) usiamo il comando dd:

dd if=/dev/zero of=/home/nomeutente/immagine_cifrata ibs=1M count=10

per creare un file da poi usare di 10MB nella home di "nomeutente" (perdonate la poca fantasia). Autentichiamoci come root e montiamo il file appena creato in loop. Prima di tutto impostiamo il file appena creato come una loop device (ammettendo che questa sia la prima periferica in loop del sistema):

/sbin/losetup /dev/loop/0 /home/nomeutente/immagine_cifrata

Creare la partizione criptata

Per chi invece di cifrare un file montato in loop, deve cifrare una block device ordinaria, basta che sappia quale nome le abbia assegnato il kenrel (con precisione, perché la procedura seguente cancellerà tutti i dati nella periferica).

Info.png Periferiche
D'ora in poi chiameremo /dev/periferica la block device sulla quale scriveremo i dati cifrati, sia essa la periferica in loop del paragrafo precedente (/dev/loop/0) o una periferica ordinaria

Creiamo la partizione LUKS:

cryptsetup --verify-passphrase --verbose --hash=sha256 --cipher=aes-cbc-essiv:sha256 --key-size=256 luksFormat /dev/periferica

WARNING!
========
This will overwrite data on /dev/periferica irrevocably.

Are you sure? (Type uppercase yes):  

Come dice il messaggio bisogna rispondere con uno YES interamente maiuscolo. Ci verrà di seguito chiesta una parola d'ordine e la sua conferma; mentre le digiteremo non vedremo nulla cambiare nel terminale:

Enter LUKS passphrase:
Verify passphrase:
Command successful.

A questo punto dobbiamo dare istruzioni al device mapper di mappare la periferica LUKS appena creata in una block device virtuale sulla quale scrivere i nostri dati in chiaro (e poi essi saranno scritti cifrati su /dev/periferica):

cryptsetup luksOpen /dev/periferica criptata

Questo creerà la periferica /dev/mapper/criptata, sulla quale noi andremo a creare il file system che più ci interessa (su periferiche piccole come quella in esempio non conviene usare un file system con indicizzazione come reiserfs o ext3, bensì un più semplice ext2 o una fat):

mkfs -t ext2 /dev/mapper/criptata

Non ci rimane che montarla in una cartella di prova per verificare che sia tutto corretto (funzionamento, dimensioni desiderate ecc.):

mount -t auto /dev/mapper/criptata /mnt/prova

Rimozione della periferca criptata

Per rimuovere la periferica cifrata bisogna innanzi tutto smontarla, poi bisogna dire a cryptsetup di chiudere la periferica (il che automaticamente eliminerà il nodo creato dal device mapper):

umount /mnt/prova
/sbin/cryptsetup luksClose criptata

Rimozione di una loop device

Nel caso che la nostra periferica sia un file montato in loop, è consigliabile eliminare il collegamento che il nostro file immagine ha con la periferica loop cui l'abbiamo associato; questo ci permetterà di spostare o eliminare il file senza creare malfunzionamenti nelle periferiche di loop, così come ci consentirà di aprire nuove periferiche in loop ripartendo dalla numero 0:

/sbin/losetup -d /dev/loop0

Automatizzazione dei passi necessari

A questo punto dobbiamo solo creare uno script da eseguire come root, per fare tutte le operazioni di creazione e montaggio, o viceversa di smontaggio e rimozione automaticamente. Di seguito sono riportati due script, uno per il caso di file montato ricorsivamente, l'altro per il caso di periferica ordinaria.

In entrambi i casi il montaggio della periferica criptata avviene nella cartella "criptata" nella home dell'utente; è necessario quindi creare la cartella:

mkdir /home/'''nomeutente'''/criptata

Scritp per file immagine

#Utilizzo di un file immagine come periferica criptata
#!/bin/bash

case $1 in
        monta)
                if [ -f /home/'''nomeutente'''/immagine_cifrata ]; then
                    echo "Impostazione periferica ricorsiva (loop)."
                    /sbin/losetup /dev/loop0 /home/'''nomeutente'''/immagine_cifrata
                fi

                if [ $? = 0 ]; then
                    /sbin/cryptsetup luksOpen /dev/loop0 criptata
                else
                    echo "Impostazione periferica ricorsiva non riuscita."
                fi

                if [ $? = 0 ]; then
                    mount /dev/mapper/criptata /home/'''nomeutente'''/criptata
                fi

                if [ $? !=0 ]; then
                    echo "Impossibile montare la periferica criptata."
                    /sbin/cryptsetup luksClose criptata
                    /sbin/losetup -d /dev/loop0
                fi
        ;;
        smonta)
                umount /dev/mapper/criptata

                if [ $? = 0 ]; then
                    /sbin/cryptsetup luksClose criptata
                else
                    echo "Smontaggio non riuscito."
                fi

                if [ $? = 0 ]; then /sbin/losetup -d /dev/loop0
                else echo "Chiusura periferica criptata non riuscita."
                fi
        ;;
        *)
        echo "Usage: $1 {monta|smonta}" >&2
        exit 1
        ;;
esac

Scritp per periferica ordinaria

In questo esempio viene usata la prima partizione di una scheda di memoria SD (/dev/mmcblk0p1 con lettore compatibile con il modulo sdhci).

#!/bin/bash

case $1 in
        monta)
                echo "Verifica presenza SD:"
                if [ -b /dev/mmcblk0p1 ] ; then
                    echo "."
                else
                    echo "La periferica non è inserita!"
                    exit 2
                fi

                if [ $? = 0 ]; then /sbin/cryptsetup luksOpen /dev/mmcblk0p1 criptata
                fi

                if [ $? = 0 ]; then
                    mount /dev/mapper/criptata /home/'''nomeutente'''/criptata
                fi

                if [ $? != 0 ]; then
                    echo "Il file system cifrato non può essere montato."
                    /sbin/cryptsetup luksClose criptata
                fi
        ;;
        smonta)
#Smonto il file system criptato e controllo che lo smontaggio sia avvenuto correttamente
                umount /dev/mapper/criptata
                if [ $? != 0 ]; then
                    echo "Smontaggio non riuscito."
                fi

#Chiudo il nodo in /dev/mapper e controllo
                 /sbin/cryptsetup luksClose criptata
                if [ $? = 0 ]; then
                    echo "Nodo cifrato in /dev/mapper rimosso."
                else echo "Chiusura periferica criptata non riuscita"
                fi
        ;;
        *)
        echo "Usage: $1 {monta|smonta}" >&2
        exit 1
        ;;
esac


GipPasso