Criptare la home directory di un utente usando Legacy FileVault in OS X Lion

Ulteriore aggiornamento:
Con il rilascio dell’update 10.7.4 il problema non si presenta ulteriormente. Bisogna però pulire o eliminare manualmente i files secure.log che possono avere al proprio interno ancora l’evidenza della password in chiaro.

Aggiornamento:
con il rilascio della 10.7.3, un bug visualizza, tramite un opzione di DEBUG attiva, la password in chiaro dell’account che usa Legacy FileVault. Nell’attesa che venga risolto nella 10.7.4, ecco un possibile workaround. (fonte: ZDNet)

Leggendo in giro per la rete sembra che, una volta disattivato, Legacy FileVault non sia più attivabile sotto OS X Lion: bisogna passare a FileVault 2. Per chi utilizza rEFIt questo può essere un problema e se si usa solo Preferenze di Sistema non si riesce a riattivarlo.

Dopo aver fatto qualche ricerca e qualche esperimento ho trovato un modo per criptare la home directory di un nuovo utente usando FileVault 1 (alias Legacy FileVault). Ovviamente la tecnica si può utilizzare anche con account già esistenti. L’unico requisito sembra essere l’aver già impostato la FileVault Master Password, altrimenti il certificato utilizzato nel procedimento di seguito potrebbe non essere disponibile.

Alcune note prima di iniziare:

  • si userà quasi esclusivamente la linea di comando con Terminal ed il comando sudo, accessibile solo a chi è amministratore del proprio Mac
  • se non si comprende a fondo cosa si sta facendo, si richia la perdita di dati o addirittura di rendere il sistema inutilizzabile. Quindi è caldamente consigliato di eseguire prima un backup completo con Time Machine e di procurarsi un CD, DVD o chiavetta USB avviabile (ad esempio: il supporto di installazione di OS X) con cui eseguire il ripristino se necessario
  • non mi risulta documentazione ufficiale Apple che possa garantire il risultato di quanto riportato; posso dire che ha funzionato tutto correttamente sul mio MacBook Air con OS X Lion aggiornato da Snow Leopard che aveva già attivo FileVault 1
  • quanto segue è da considerare un esercizio di sperimentazione, per cui chi decide di provare lo fa solo a suo rischio e pericolo

Ricapitolando: se dovesse capitare qualcosa a voi, al vostro Mac o ai vostri cari in conseguenza all’uso di quanto qui descritto, non venite a lamentarvi da me perché vi risponderò: “Ve l’avevo detto di lasciar stare!” :)

Non vi siete scoraggiati? O siete solo curiosi? Ok, allora iniziamo.

Innanzitutto si acceda a Preferenze di Sistema > Utenti e gruppi. Accertiamoci che l’utente attuale sia amministratore.

Schermata Utenti e gruppi

Preferenze di Sistema > Utenti e gruppi

Prima di modificare la home dir di un utente esistente, è opportuno fare una prova con un nuovo utente: va creato premendo sul pulsante +. Se il pulsante è disabilitato, sbloccare il lucchetto ;). E’ sufficiente creare un utente Standard, senza privilegi amministrativi. Ad esempio:

utente:    fv1user
password:  fv1pwd

Creato l’utente, si apra Terminal. N.B. tutti i comandi che andranno eseguiti in esso sono qui riportati in grassetto, il resto del testo rappresenta il loro output.

Si abiliti la modalità superuser, inserendo la password dell’utente amministratore con cui si sta operando su OS X:

mbair:~ fabio$ sudo su
Password:
sh-3.2#

Il prompt della shell dovrebbe essere cambiato: se al posto del $ c’è il #, tutto ok. Ora si prepari l’ambiente:

sh-3.2# umask 077
sh-3.2# export SBUSERNAME="fv1user"
sh-3.2# export SBUID=$(id -u $SBUSERNAME)
sh-3.2# export SBGID=$(id -g $SBUSERNAME)
sh-3.2# echo Username $SBUSERNAME - UserID $SBUID GroupID $SBGID
Username fv1user - UserID 504 GroupID 20

Le variabili $SBUSERNAME, $SBUID e $SBGID devono contenere rispettivamente il nome dell’utente, il suo User ID e il suo Group ID. Lo User ID potrebbe essere diverso rispetto a quello riportato sopra. L’importante è che nella seconda riga si sia inserito correttamente tra virgolette il nome dell’utente di prova appena creato e che entrambi gli ID (che ci siamo fatti dare direttamente da OS X) siano numerici.

Tutti i comandi verranno eseguiti dalla home directory dell’utente appena creato, quindi:

sh-3.2# cd /Users/"$SBUSERNAME"
sh-3.2# pwd
/Users/fv1user

Prima bisogna creare l’immagine criptata in formato sparsebundle. Verrà richiesto di scegliere una password: si userà quella (fv1pwd) dell’utente appena creato:

sh-3.2# hdiutil create -size 300g \
   -encryption -agentpass \
   -certificate /Library/Keychains/FileVaultMaster.cer \
   -uid $SBUID -gid $SBGID \
   -mode 0700 -fs "HFS+J" -type SPARSEBUNDLE -layout SPUD \
   -volname "$SBUSERNAME" "$SBUSERNAME".sparsebundle
Inserisci una nuova password per proteggere "fv1user.sparsebundle":
Reinserisci la nuova password:
created: /Users/fv1user/fv1user.sparsebundle

Creata l’immagine vanno impostati i permessi necessari a FileVault:

sh-3.2# chown -R "$SBUSERNAME":staff "$SBUSERNAME".sparsebundle
sh-3.2#

Ora bisogna montare l’immagine, usando come mount point una dir locale (sbdest) e come password quella usata per creare l’immagine (fv1pwd):

sh-3.2# mkdir sbdest
sh-3.2# hdiutil attach -owners on -mountpoint sbdest \
   -stdinpass "$SBUSERNAME".sparsebundle
Enter disk image passphrase:
/dev/disk1           Apple_partition_scheme             
/dev/disk1s1         Apple_partition_map                
/dev/disk1s2         Apple_HFS                 /Users/fv1user/sbdest

In essa vanno copiati i contenuti della home dir di fv1user, evitando copie ricorsive con –exclude: ;)

sh-3.2# rsync -avxHE ./ sbdest/ \
   --exclude="$SBUSERNAME".sparsebundle/ --exclude="sbdest/"
building file list ... done
./
.CFUserTextEncoding
._.
Desktop/
._Desktop
Documents/
._Documents
Downloads/
._Downloads
Library/
._Library
Movies/
._Movies
Music/
._Music
Pictures/
._Pictures
Public/
._Public

(...)

sent 14196177 bytes  received 4142 bytes  28400638.00 bytes/sec
total size is 14170359  speedup is 1.00

Ovviamente la lista dei file copiati può differire da Mac a Mac. Si smonti l’immagine e si rimuova la cartella usata come mount point:

sh-3.2# hdiutil detach sbdest
"disk1" unmounted.
"disk1" ejected.
sh-3.2# rmdir sbdest
sh-3.2#

Ora l’immagine è pronta: bisogna solo dire ad OS X di usarla come home directory dell’utente fv1user. Quindi modifichiamo il suo plist, facendone prima una copia di backup:

sh-3.2# cd /private/var/db/dslocal/nodes/Default/users/
sh-3.2# cp fv1user.plist fv1user.plist.backup
sh-3.2# plutil -convert xml1 fv1user.plist
sh-3.2# nano fv1user.plist

Aperto nano va cercata la sequenza:

        <key>home</key>
        <array>
                <string>/Users/fv1user</string>
        </array>

dopo la quale va aggiunta la serie di nodi XML in grassetto, modificata opportunamente in modo da puntare al corretto sparsebundle:

        <key>home</key>
        <array>
                <string>/Users/fv1user</string>
        </array>
        <key>home_loc</key>
        <array>
                <string>&lt;home_dir&gt;&lt;url&gt;
                file://localhost/Users/fv1user/fv1user.sparsebundle
                &lt;/url&gt;&lt;/home_dir&gt;</string>
        </array>

Ciò che è compreso tra <string> e </string> va inserito su una sola riga. Salvare, dopodiché riconvertire il plist in formato binario:

sh-3.2# plutil -convert binary1 fv1user.plist
sh-3.2# 

Ora è tutto pronto: si può effettuare il login con il nuovo utente per per verificare se effettivamente è attivo FileVault 1. Ci sono vari modi:

  • accedere a Preferenze di Sistema > Sicurezza e privacy e verificare se ci sono sia FiIeVault che Legacy FileVault tra i pulsanti
  • aprire una finestra Terminale e lanciare un comando mount:
$ mount
(...)
/dev/disk1s2 on /Users/fv1user (hfs, local, nodev, nosuid, journaled,
  nobrowse)
  • creare un file nella home dir, effettuare il logout e verificare con un altro utente (tramite superuser) se il file appena creato esiste in /Users/fv1user/. Se non lo si trova, è perché è stato creato nell’immagine sparsebundle criptata. Chi non ci crede può verificare loggandosi di nuovo con il nuovo utente e troverà il file al suo posto ;)

A verifiche effettuate, con un altro utente tramite superuser si può cancellare tutto ciò che c’era originariamente nella home dir tranne la directory fv1user.sparsebundle che ne contiene la versione criptata.

P.S. chi usa FileVault 1 sa che al logout OS X recupera lo spazio disponibile visualizzando per qualche attimo la relativa schermata. Se si sta usando la batteria ciò non accade: bisogna fare il logout mentre il Mac è collegato all’alimentazione di rete elettrica.

Un ringraziamento a Jeff McCune per il suo articolo originale

26 thoughts on “Criptare la home directory di un utente usando Legacy FileVault in OS X Lion

  1. Pingback: How to Enable Legacy FileVault on Mac OSX 10.7 Lion | The Tabor Consulting Group

  2. Thank you for the accurate information. I went thru step by step and this worked great! Now, I know I can migrate my Legacy FileVault users over to a clean install of Lion, as Migration Assistant will not move FileVault 1 users! I prefer FileVault 1 for my users instead of FileVault 2 because I’m running Lion Server and my machine has to run headless and be able to reboot by itself without someone at the console to enter a password in EFI. The big problem with FileVault 2 is that it’s not appropriate for a server, at least as Apple has it working so far. Also, Legacy FileVault has better individual user security, both between users and between a user and an admin. With FileVault 1 you can have some limited user files outside the sparsebundle in the user’s directory to support remote ssh login, scripts, automated backups, etc. before the user’s sparsebundle is mounted.

  3. Pingback: Working on a Mac » Blog Archive » Encrypting an user home directory using Legacy FileVault in OS X Lion

  4. Yes, wonderful tutorial!!! Works like a charm. Side notes:

    Tried this with an original FV1 .sparseimage, but that didn’t work. Ran into problems copying files from the old image. Many I/O errors. I think due to access-restrictions. Ended up mounting old image in new account, then copying every file through Finder, which prompted me for root-access. Then everything went fine and all files are accessible again.

    Thanks a lot for your trouble to jot this all down into understandable bits and pieces for us!

    • I/O errors were of “Access denied” type? Maybe you can see some tracks of them using Console app. Anyway, I appreciated you found my tutorial useful :)

  5. What I find disturbing though is that I can find my FV sparse image password in plain text in the console window o_0

  6. Apparently, this doesn’t work anymore in Mountain Lion. Any ideas?

    It cannot find the needed certificate anymore.

  7. This is a “fantastico” writeup, and still works in Mountain Lion, with a couple of caveats:

    - The hdiutil step, creating the .sparsebundle, may not work right off the bat, if the file “Library/Keychains/FileVaultMaster.cer” does not exist. To remedy this, follow the instructions in the “Create a master password” section of this Apple KB: http://support.apple.com/kb/HT5077

    - After completing all of the instructions, I still do not see a “Legacy FileVault” button in System Preferences, Security & Privacy, FileVault, but everything works correctly nonetheless.

    Thanks for posting this!

    PS: For anyone who’s wondering *why* someone would want to do this when FileVault 2 is available: I administer Macs that are used by multiple people, some of whom have admin privileges. As long as none of the users have access to the FileVault master password, this method is a way (and, as far as I know, the *only* way) to ensure that the data in each user’s home directory cannot be accessed by anyone else.

  8. Thank-you very much for posting this tutorial, as I prefer Legacy File Vault than the new “full disk” encryption. Using Mountain Lion, I was sure to follow Joebob’s recommendation on creating a file vault “master password” first, before proceeding with your tutorial. After finishing the steps, the “Legacy FileVault” pop up under system preferences showed, and it appears everything went successful. Thanks again!

  9. Successfully created in mtn lion 10.8.4. Ran into a couple of problems on logout –

    Restart machine, login to fvuser1:
    It asks me for login password, followed by sparsebundle password. Login successful.

    Logout. Try to log back in. Asks me for login password, hangs for a minute then boots me back into the login window. End up restarting machine.

    Post restart #2 – login to fvuser1:
    Asks me for login password, hangs for a sec then logs me into OSX?! It doesn’t ask me for sparsebundle password.

    It seems that the sparsebundle may not be detaching upon logout. Any ideas?

      • I have. I tried creating a fresh sparsebundle last night using a newly created account. Still no joy. I am seeing some weird instance in /Users where it’s creating additional accounts of the users that fail to unmount their sparsebundle.

  10. I actually did verify that the sparsebundle stays mounted after logout. If I log out of fvuser1 and log into another account I can see the /dev/disk*s* of fvuser1 still mounted using the mount command in terminal. Another way to tell is checking /Users for a .fvuser1 account. (/Users/.fvuser1 will show up if the bundle is still mounted)

  11. Is it possible to use this procedure in conjunction with FileVault2 to have ‘double encryption’?
    My main interest is with the Master Password – does the FV1 master password serve as a master for FileVault2 and vice versa or would FV1 and FV2 each use independent master/recovery passwords?

    • I don’t know if it is possible or not, but I think it is not advisable. You may use any other crypto software if you want to try to get your target (e.g. TrueCrypt)

  12. Pingback: [GUIDE] Encrypt a user home folder, by using "Legacy FileVault" - tonymacx86.com

  13. Nice guide, but using the Directory Service Command Line Utility to change the home_loc key is simplier:

    dscl . -create /Users/fv1user HomeDirectory “file://localhost/Users/fv1user/fv1user.sparsebundle”

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>