środa, 22 czerwca 2011

Szyfrowanie partycji /home w Linuxie przy użyciu TrueCrypt

Zaczynając pisać poprzedni post w zasadzie miałem zamiar napisać o szyfrowaniu katalogu domowego przy użyciu TrueCrypt.
W czym zatem jest problem? Ano TrueCrypt nie wspiera dla Linuxa ‘full disk encryption’, czyli zaszyfrowania całego dysku twardego (partycji), włączając system operacyjny. Pod Windows podobno działa to dobrze choć sam nie sprawdzałem. Przy odrobinie wysiłku można sobie jednak z tą niedogodnością poradzić.

Na przykład na moim laptopie dysk jest podzielony w następujący sposób:
sda1 – Windows (ntfs)
sda5 – /
sda6 – /home
sda7 – /media/data (multimedia, itp.)
Na sda1 nie trzymam nic ważnego, no chyba że komuś będzie zależało na save’ach mojej ulubionej gry ;)

sda5 to root filesystem. A więc w zasadzie same pliki dystrybucyjne, nic co można było by uznać za warte zabezpieczenia przed osobami trzecimi.

sda6 to partycja /home, a więc tutaj trzymane są między innymi e-maile, historia komunikatorów, ustawienia przeglądarki (zapamiętane hasła..), i inne różne pliki używane do codziennej pracy. Zaszyfrowanie sda6 w całości to zdecydowanie dobry pomysł.

Zostaje jeszcze sda7 na którym ląduje np. muzyka czy zdjęcia. Generalnie też warto zaszyfrować, zwłaszcza że tutaj nie ma takiego problemu jak z /home. /media/data można sobie spokojnie montować kożystając z GUI będąc już zalogowanym do systemu, dokładnie tak jak w przypadku pamięci flash.

Problem z partycją /home polega na tym że trzeba ją podmonotować przed zalogowaniem użytkownika do systemu. Można to zrobić podczas startu systemu. W ten sposób że ładowanie poszczególnych usług zostaje przerwane i pojawia się prośba o podanie hasła do zaszyfrowanych partycji. Oczywiście nie zadziała to dobrze jeśli jest używany domyślny splash screen (Ubuntu). Ja akurat i tak go zawsze wyłączam bo lubię widzieć co się dzieje podczas startu. Bardziej eleganckie było by zintegrowanie tej funkcjonalności z managerem logowania, lub montowanie bezpośrednio przed zalogowaniem użytkownika na podstawie hasła systemowego. Mi jednak wystarcza takie naprostsze rozwiązanie jak opisane poniżej.

Żeby wyłączyć splash screen – w /boot/grub/menu.lst wystarczy skasowac słowo ‘splash’ przy definicji jądra z którego korzystamy.

Następnie żeby nie stracić danych które aktualnie znajduą się na /home, warto przeżucić je na drugą partycję. Stary dobry tar nam w tym pomoże.

cd /media/data/backups/
tar -cpf home.tar /home/

Kolejny krok to utworzenie nowego wolumenu TrueCrypt na partycji sda6. Uwaga: dane znajdujące się na partycji zostaną skasowane. Dlatego pierwszym krokiem była archiwizacja wszystkiego z /home. Po odpaleniu systemu, na ekranie logowania przełączamy się na konsolę kombinacją klaszy , logujemy i odmontowujemy partycję /home i zamieniamy na wolumen TrueCrypt.

# umount /dev/sda6

# truecrypt -c /dev/sda6

Obecnie TrueCrypt podczas tworzenia wolumenu zaoferuje sformatowanie go w FAT. My oczywiście wolimy coś lepszego, np. ext3. Dlatego można spokojnie wybrać „None”. Po zakończeniu tworzenia podłączamy wolumen i formatujemy go na ext3.

# truecrypt --filesystem=none /dev/sda6 /home

# truecrypt -l

1: /dev/sda7 /dev/mapper/truecrypt1 /media/data

2: /dev/sda6 /dev/mapper/truecrypt2 -

‘truecrypt -l’ wyświetlił nam listę podłączonych wolumenów. Wnioskujemy z niej, że urządzenie które chcemy sformatować to ‘/dev/mapper/truecrypt2′

# mkfs.ext3 /dev/mapper/truecrypt2

Dalej pozostaje już tylko podmontowanie zaszyfrowanego systemu plików pod /home i przekopiowanie plików z przygotowanego w pierwszym kroku archiwum

# truecrypt -d /dev/sda6

# truecrypt /dev/sda6 /home

# cd /

# tar -xpf /media/data/backups/home.tar

Po zakończeniu można wrócić do ekranu logowania i zalogować się jak zazwyczaj.

Niedogodność polega na tym że przy ponownym uruchomieniu komputera trzeba będzie ponownie podmontować partycję /home. Przełączanie się na konsole tekstowe i wpisywanie ręcznie komend za każdym razem to średnio fajny pomysł, dlatego uprościmy sobie życie dodając to do skryptów startowych.

W /etc/init.d wystarczy utworzyć nowy skrypt, np. truecrypt_mount o treści (skopiowanej z rc.local)

#! /bin/sh
### BEGIN INIT INFO
# Provides: truecrypt_mount
# Required-Start:
# Required-Stop:
# Default-Start:
# Default-Stop:
# Short-Description: Run truecrypt_mount
### END INIT INFO

PATH=/sbin:/usr/sbin:/bin:/usr/bin

. /lib/init/vars.sh
. /lib/lsb/init-functions

do_start() {
truecrypt -t -k „” –protect-hidden=no /dev/sda6 /home
truecrypt -t -k „” –protect-hidden=no /dev/sda7 /media/data
}

case „$1″ in
start)
do_start
;;
restart|reload|force-reload)
echo „Error: argument ‘$1′ not supported” >&2
exit 3
;;
stop)
;;
*)
echo „Usage: $0 start|stop” >&2
exit 3
;;
esac

Taki skrypt trzeba uczynić wykonywalnym i dodać do skryptów startowych

# chmod 666 truecrypt_mount

# update-rc.d truecrypt_mount start 99 S .

W procedurze do_start() wpisujemy polecenia które chcemy aby wykonały się podczas startu systemu.

Teraz podczas startu komputera, jeszcze przed odpaleniem trybu graficznego zostaniemy poproszeni przez TrueCrypt o podanie haseł do naszych zaszyfrowanych wolumenów.

1 komentarz: