Encrypted home con pam_mount

marzo 5, 2011
By

Da quando ho iniziato l’attività come consulente informatico ho iniziato ad avere una reale necessità di tenere al sicuro i dati miei e dei miei clienti.
Ovviamente una password cambiata spesso ed adeguatamente forte è un aiuto, ma non mette al riparo da chi abbia accesso fisico alla macchina.
Basta pensare allo scenario del portatile perso o rubato: tutti i dati sono a disposizione anche di uno smanettone liceale. Basta inserire una qualsiasi Ubuntu live et voilà, tutto il filesystem a disposizione, ivi compresi cookies dei siti, mail, cache varie …

Per mettersi al riparo da questi problemi una buona soluzione è la cifratura della cartella home dell’utente.

Questo obiettivo necessita di due passi principali per essere raggiunto:

  • Cifratura di una cartella (nel nostro caso la home)
  • Montaggio automatico al login della cartella cifrata

Il secondo punto non è realmente necessario, ma è tremendamente comodo. Ovviamente è possibile montare la cartella cifrata a mano in un momento successivo, ma così facendo bisogna ricordarsi anche di tenere pulita tutta la parte di /home relativa a firefox e browser vari, oltra alla history dei comandi. Un delirio insomma.

Come sempre il mio esempio è ambientato in una Gentoo, ma sarà abbastanza generico da poter essere replicato facilmente su qualsiasi distribuzione Linux.

Ubuntu fornisce già questo servizio da ormai qualche tempo; basta specificarlo al momento di creazione di un utente. Ci sono però molti motivi che mi portano a non usare Ubuntu lavorativamente parlando, quindi questa guida.

A livello di kernel basta abilitare il supporto a fuse, si trova in FileSystems -> Fuse. Dato che verrà utilizzato al login, quindi con kernel già avviato e / già montata è tranquillamente possibile compilarlo come modulo. Io personalmente l’ho compilato statico nel kernel.

A livello di pacchetti bisogna emergere fuse, encfs e pam_mount.

Fatto questo, come primo passo creeremo la directory /home/.utente (notare il punto) Andrà creata in /home una directory per ogni utente, compreso root se vorremo dare anche a quello una home cifrata

Creiamo anche una directory che servirà per il travaso della home esistente

il layout della /home a questo punto è:

/home/.utente

/home/utente_tmp

/home/utente <= al momento piena, ma sarà svuotata e diventerà il mount point

Il prossimo step è creare la cartella cifrata cone encfs che conterrà i file cifrati

encfs /home/.utente /home/utente_tmp

A questo punto vi saranno poste le domande relative alla cifratura

L’unica cosa degna di nota è la password che va tenuta uguale a quella di login,  pena l’impossibilità di montare automaticamente la home. Quando si dovrà cambiare la password di sistema bisognerà cambiare a mano anche quella di encfs. Questo  sarebbe scriptabile, ma è ben oltre i miei obiettivi, quindi lo lascio come esercizio per chi la trova una cosa necessaria

fatto questo bisogna trasferire i contenuti dentro la cartella cifrata

cp -R /home/utente/.[a-zA-Z0-9]* /home/utente_tmp

cp -R /home/utente/* /home/utente_tmp

A questo punto niente è ancora stato fatto in modo definitivo, quindi se qualcosa non è chiaro è il momento giusto per rivedere i propri passi. Coi passi successivi si andrà ad eliminare la /home reale e a smontare la cartella cifrata. Volendo possiamo eliminare i file della /home attuale in maniera sicura con  programmi come srm

Smontiamo la cartella cifrata:

fusermount -u /home/utente_tmp

installiamo pam_mount se già non l’abbiamo fatto e configuriamolo (ci sono ottime guide in rete su come abilitarlo, passandogli la password di login)

modifichiamo /etc/security/pam_mount.conf.xml  come segue

<volume user="YOUR_USER_HERE" fstype="fuse" path="encfs#/path/folder" mountpoint="/path/mntpoint" />

diventa

<volume fstype="fuse" path="encfs#/home/.%(USER)" mountpoint="~" options=" " fskeyhash=" " />

la direttiva fskeyhash in questo caso viene lasciata vuota e serve solo per evitare l’output di un warning da parte di pam_mount

Dopo quella riga mettiamo le direttive per fuse

<fusemount>mount.fuse %(VOLUME) %(MNTPT) -o allow_other,nonempty</fusemount>
<fuseumount>fusermount -u %(MNTPT)</fuseumount>

Come avete sicuramente notato passo le opzioni a fuse tramite questo nodo xml e non tramite la direttiva options nel nodo precedente. Questo è dovuto ad un comportamento errato di pam_mount rispetto  a fuse.

L’opzione nonempty fa sì che il file system venga montato anche se il mount point è già popolato, rendendo irraggiungibile il contenuto che c’era precedentemente (salvo uso di unionfs). Questo è comodo nel nostro caso perché per i più vari motivi di errate configurazioni può capitare che nel mount point siano finiti quei file generati automaticamente come ad esempio .bash_history

Ovviamente se siamo certi di essere stati molto ordinati e che le /home di destinazione siano completamente vuote possiamo anche eliminare quell’opzione.

L’unico aspetto un po’ noioso  di questo setup è che la password di encfs va tenuta allineata a amano con quella di login, pena il fallimento del montaggio automatico, ma questo è un piccolo disguido rispetto al vantaggio di sicurezza che se ne ricava complessivamente

Ovviamente questa guida è applicabile anche alle altre directories dove pensiamo ci siano dati degni di essere cifrati. Se per esempio volessimo cifrare in questa maniera anche la /var/www/sitoInSviluppo/ basterebbe mettere la cartella nella nostra home, e istruire pam_mount a farne il bind su /var/www al login, ovviamente sistemando prima i permessi in maniera adeguata

Ecco fatto, abbiamo messo al sicuro la nostra macchina anche rispetto a furti e accessi fisici 🙂

Tags: , , , , ,

One Response to Encrypted home con pam_mount

  1. alessio

    Ottimo articolo…
    avevo sperimentato qualcosa di simile, con le share di rete di samba… Unico problema è che ogni tanto il client (debian o ubuntu) si perde qualche connessione.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *


*