Szyfrowana partycja /home
29 kwietnia 2007, lipiec
Zastanów się co by było gdyby z Twojego komputera zostały wykradzione ważne informacje dotyczące nowego projektu, który przygotowuje firma w której pracujesz. Przerażające prawda? Jeżeli jesteś zainteresowany, jak dodatkowo zabezpieczyć się przed kradzieżą danych, to zapraszam do lektury artykułu, w którym pokażę jak zaszyfrować katalog /home, tak aby nawet złodziej z fizycznym dostępem do maszyny nie mógł uzyskać dostępu do Twoich danych.
Na początek trochę teorii. Do szyfrowania wykorzystamy następujące programy:
- DM-Crypt — darmowe oprogramowanie umożliwiające szyfrowanie całych partycji dyskowych, szyfruje dane jeszcze przed zapisem na partycji, wchodzi w skład kernela 2.6.4 i następnych wersji,
- LUKS — (Linux Unified Key Setup) — standardowy system szyfrowania dysków dla Linuksa,
- cryptsetup — narzędzie umożliwiające jednoczesne wykorzystanie LUKS i DM-Crypt.
Pobieranie potrzebnego oprogramowania
Programem, który będzie nam potrzebny, jest cryptsetup z obsługą LUKS. Jeśli nasza dystrybucja zawiera ten program w repozytoriach (jak np. Ubuntu), wystarczy wydać polecenie sudo apt-get install cryptsetup. W przeciwnym przypadku w konsoli wpisujemy:
wget http://luks.endorphin.org/source/cryptsetup-luks-1.0.4.tar.bz2
W ten sposób pobierzemy źródła programu, którego instalacja odbywa się standardowo:
./configure
make
make install
Instalacja powinna przebiec bez większych problemów.
Opis najważniejszych opcji cryptsetupa
root@host:~# cryptsetup OPTIONS action name device -- ogólna składnia
OPTIONS(opcje):
-c -- algorytm szyfrowania, domyślnie AES z 256-bitowym kluczem,
-h -- wyświetla menu pomocy,
-y -- weryfikacja użytkownika poprzez dwukrotne zapytanie o hasło,
-d -- wczytuje klucz/hasło z pliku,
ta opcja jest ignorowana, jeżeli użyjesz opcji -d:
-s -- rozmiar klucza (w bitach).
action(akcja):
create -- tworzy mapę dysku,
remove -- usuwa mapę dysku,
reload -- przeładowuje mapę dysku,
resize -- zmniejsza bądź zwiększa rozmiar mapy,
status -- pokazuje stan,
name -- nazwa mapy w /dev/mapper/,
device -- dysk, który chcesz zaszyfrować.
.
Teraz, kiedy znamy już podstawowe opcje, możemy zabrać się do pracy. Cryptsetup jest programem pracującym w środowisku tekstowym i nie jest dostępna na niego żadna nakładka graficzna, więc jeśli nie lubisz pracy z konsolą, będziesz musiał ją polubić.
Inicjowanie katalogu /home
Na potrzeby artykułu zakładamy, że dysk na którym znajduje się katalog do zaszyfrowania oznaczony jest jako /dev/hdc6.
Zanim będziemy mogli utworzyć zaszyfrowaną partycję, musimy ją najpierw zainicjować:
root@host:~# cryptsetup luksFormat /dev/hdc6
WARNING!
=========
This will overwrite data on /dev/hdc6 irrevocably.
Are you sure? (Type uppercase yes): YES
Enter LUKS passphrase:
Verify passphrase:
Command successful.
Zostajemy poproszeni o hasło, podajemy je dwa razy (hasło będzie później wykorzystane do weryfikacji).
Wybór odpowiedniego algorytmu
Następnie musimy zadecydować jakim algorytmem chcemy zaszyfrować katalog /home. Algorytmy te muszą być dostępne w naszej kompilacji jądra. Aby sprawdzić dostępne algorytmy, wpisujemy: cat /proc/crypto.
Jeżeli nie masz wkompilowanych żadnych opcji kryptograficznych (algorytmy nie powinny być ładowane jako moduły), przed uruchomieniem programu skonfiguruj odpowiednio jądro (opcje kryptograficzne znajdują się w konfiguracji kernela w zakładce Cryptographics options).
Następnie wpisujemy:
root@host:~# cryptsetup -c wybrany_przez_nas_algorytm -y luksFormat /dev/hdc6
Jeżeli nie wiemy na jaki algorytm się zdecydować, pomijamy opcję -c. Domyślnym algorytmem jest AES.
Mapowanie i tworzenie systemu plików
Następnym krokiem jest utworzenie mapowania.
Wpisujemy:
root@host:~# cryptsetup luksOpen /dev/hdc6 home
Zostajemy ponownie zapytani o podane przez nas wcześniej hasło w celu zweryfikowania naszej tożsamości. Jeżeli nie nastąpiły żadne komplikacje, w /dev/mapper powinna pojawić się mapa katalogu /home.
Następnie powinniśmy założyć system plików na naszej wirtualnej kopii katalogu:
root@host:~# mkfs.ext2 -m 0 /dev/mapper/home
W moim przykładzie wybrałem ext2, ale może to być dowolny system plików np.: ext3 czy reiserfs.
Następnie przekopiujemy aktualną zawartość katalogu /home na mapę:
root@host:~# cp -a /home /dev/mapper/home
Dodawanie dodatkowych haseł dla użytkowników
LUKS posiada również bardzo ciekawą funkcję. Mianowicie nie tylko root może mieć dostęp do katalogu. Aby umożliwić to innym użytkownikom, musimy dodać kilka nowych haseł dla osób, które będą miały dostęp do zaszyfrowanego katalogu. Aby dodać te hasła, wywołujemy cryptsetup z opcją luksAddKey:
root@host:~# cryptsetup luksAddKey /dev/hdc6
Enter any LUKS passphrase:
Verify passphrase:
key slot 0 unlocked.
Enter new passphrase for key slot:
Verify passphrase:
Command sucessful.
Zostajemy poproszeni o wpisanie hasła, które podawaliśmy na samym początku, a następnie ustalamy nowe hasło dla wybranego użytkownika. Hasła mogą być takie same jak hasła do kont użytkowników, przez co nie narażasz ich na kolejne trudne hasła do zapamiętania. Jednak przy takim rozwiązaniu system jest mniej bezpieczny, ponieważ napastnik znając hasło do konta ma możliwość dostępu do zaszyfrowanych plików.
Aby sprawdzić listę dodanych kluczy/haseł, wpisujemy:
root@host:~# cryptsetup luksDump /dev/hdc6
Z kolei, aby usunąć odpowiedni klucz wpisujemy:
root@host:~# cryptsetup luksDelKey numer_klucza
Montowanie
Teraz możemy zamontować naszą partycję tak, jak oddzielny dysk:
root@host:~# mount /dev/mapper/home /mnt/home/
I to na tyle. Od tej pory nasz katalog domowy jest szyfrowany. A co z montowaniem po restarcie?
Po restarcie komputera będziemy musieli ponownie zmapować katalog /home. W tym celu wykonujemy polecenia:
root@host:~# cryptsetup -y luksOpen /dev/hdc6
root@host:~# mount /dev/mapper/home /mnt/home
Automatyczne montowanie zaszyfrowanych plików
Wiadomo, że ciągłe ręczne montowanie może stać się bardzo uciążliwe. Jest jednak sposób, aby temu zapobiec. Do automatycznego montowania podczas logowania wykorzystamy dwa linuksowe programy:
- PAM — pozwala on na połączenie ze sobą wielu technik kryptograficznych, dlatego użytkownik nie musi zawracać sobie głowy oddzielną implementacją każdego klucza zaszyfrowanego innym algorytmem
- pam_mount — jest to nakładka na PAM, która umożliwia montowanie oddzielnych wolumenów dla każdego użytkownika i, co najważniejsze, obsługuje crypt
Pam_mount działa prawie niezauważalnie, ponieważ sam proces montowania jest niewidzialny dla zwykłego użytkownika.
Instalacja PAM jak i pluginu przebiega tak samo, a więc po rozpakowaniu wchodzimy do odpowiednich katalogów i wykonujemy polecenia:
./configure
make
make install
Gdy mamy już zainstalowane oba programy, musimy pogrzebać trochę w pliku /etc/security/pam_mount.conf. Nie będę tutaj przedstawiał całego wyglądu tego pliku, ponieważ jest w nim wszystko świetnie opisane. Na końcu tego pliku dodajemy wiersz:
volume * crypt - /dev/hdc6/home /mnt/home fstype=ext2,async,nodev,fsck - -
Ogólna składnia wygląda tak: volume użytkownik system_plików serwer wolumen punkt_montowania opcje_montowania algorytm_szyfrowania ścieżka_do_klucza
Na koniec musimy jeszcze edytować plik /etc/pam.d/pam_mount. Sprawdzamy czy są w nim następujące wpisy (jeżeli nie, to dodajemy je):
auth required pam_mount.so use_first_pass
session required pam_mount.so use_first_pass
Otwieramy plik /etc/pam.d/login i zaraz za wpisem @include common-session dodajemy wpis @include common-pammount
Tak właśnie dobrnęliśmy do końca.
Podsumowanie
Wykorzystanie szyfrowania plików nie jest łatwe. Dlatego, jeśli nie jesteś zmuszony tego robić, lepiej sobie odpuścić. Pamiętaj, że jeżeli podczas szyfrowania wyłączą prąd a Ty nie masz w UPS-a, sytuacja może być nieciekawa. Otóż szyfrowanie odbywa się “w locie”, czyli pliki zostają szyfrowane zanim jeszcze zostaną zapisane na dysku twardym, tak więc grozi Ci całkowita utrata danych. Oczywiście są pewne plusy. Na przykład kiedy Twój komputer zostanie skradziony, złodzieje nie będą mieli dostępu do wybranego przez Ciebie katalogu, a nawet całej partycji lub jeżeli dla kaprysu chciałbyś odseparować od innych katalogów swój prywatny katalog.
Bibliografia:
Korekta: t_ziel
Komentarze (RSS) | Trackback (URI)
Liczba komentarzy: 22
W komentarzach możesz używać prostych znaczników HTML. Przykłady:
- Link: <a href="jaklinux.org">Linux dla każdego</a>,
- Wytłuszczenie: <strong>tekst pogrubiony</strong>,
- Kursywa: <em>tekst pochylony</em>,
- Przekreślenie: <strike>
tekst przekreślony</strike>, - Kod: <code>
printf("blok kodu");</code>, - Cytat: <blockquote>cytat</blockquote>



Świetny tekst - przydałoby się jeszcze jakieś porównanie z rozwiązaniem True Crypt - ja się przymierzam do szyfrowania partycji i nie wiem które z tych rozwiazań wybrać.
W tekście przydałaby się też informacja, czy operację tą musimy zrobić na czystym dysku - czy nie usunie nam wszystkich naszych plików podczas operacji inicjowania szyfrowania.
Osobiście polecam (jeżeli jesteś początkujący w szyfrowaniu) użycie TrueCrypt, ponieważ jest dużo łatwiejszy w użyciu i jest tak samo funkcjonalny jak cryptsetup. Kończę właśnie pisanie tekstu o TrueCrypt, więc możesz trochę poczekać.
Jeżeli chodzi o sposób szyfrowania opisany w tym tekście to nie usuwa on istniejących danych.
Czy w Ubuntu 7.04 w podstawowym jaju (2.6.20-15-generic) sa dostepne jakies algorytmy - czy należy rekompilować jądro? Jak wpisuje “cat /proc/crypto” to wyskakuje mi :
name : md5
driver : md5-generic
module : kernel
priority : 0
refcnt : 1
type : digest
blocksize : 64
digestsize : 16
i nie za bardzo wiem jak to odczytać
@Huk: Masz wkompilowany algorytm MD5
tyle że danych “Zaszyfrowanych” w ten sposób (md5) nie da się odzyskać.
A czy jest jakiś sposób, aby zaszyfrowana partycja wydawałą się czysta? Tj. żeby można było rozpoznać system plików, ale nie można było odczytać ani danych, ani informacji o tym, że w ogole są na partycji oraz ich polożeniu?
Można zaszyfrować partycję (przynajmniej w Ubuntu) tak, żeby ukryć informacje nie tylko o danych, ale nawet o tym, czy coś na niej jest.
To tworzy zaszyfrowany obraz dysku, czy robi jakiś własny system plików na partycji?
I jak z wydajnością? To chyba dość poważnie obciąża procesor, mam rację?
W skrócie: tworzysz partycję z jakimkolwiek systemem plików, a potem montujesz ją przez “mapę” (/dev/mapper) z odpowiednim sposobem szyfrowania. Wszystkie dane zapisywane na dysku są szyfrowane wybranym algorytmem, a przed odczytem, deszyfrowane. Jak się uprzesz to zamontujesz tę partycję normalnie, ale wtedy dostaniesz “krzaki” zamiast danych.
Co do wydajności — korzystałem na laptopie Intel Centrino 1.7Mhz z podobnej konfiguracji i nie zauważyłem różnicy wydajności.
Dobrym pomyslem byloby wypelnienie partycji przypadkowymi danymi.
np:
cat /dev/urandom > /dev/da0
a pozniej:
cat /dev/urandom > /dev/mapper/home
a na samym koncu dopiero
newfs /dev/mapper/home
Skorzystałem z tych samych narzędzi przy HOWTO: http://www.saout.de/tikiwiki/tiki-index.php?page=looptutorial
Mam 900 MHz i nie widzę różnicy w wydajności szyfrowanej partycji
Tak, masz rację, ale jest pewien problem. Jeżeli użytkownik ma słabszy komputer wypełnianie dość pojemnej partycji jak /home będzie nieco czasochłonne.
Lepiej zrobic raz a dobrze nic pozniej sie zastanawiac czy biegly znajdzie jakis memory-leak w sektorach…
Nie wiem jak działa dokładnie cryptsetup, ale miłym zwyczajem jest wrzucenie losowych danych na partycję przed stawianiem szyfrowanego systemu plików. (jakiś cat /dev/urandom >> /dev/partycja)
Debian Etch pozwala zestawić CryptoLVM w trakcie instalacji. Zrobiłem tak na swoim laptopie i muszę przyznać, że nie sądziłem wcześniej, że to jest aż tak łatwe.
Tak, odnośnie do nowej wersji Debian’a właśnie została dodana taka funkcja przez co cały proces następuje praktycznie automatycznie.
Nie rozumiem…
Złodzieje sie nie dostaną do katalogu /home na skradzionym komputerze, przecież ten katalog będzie automatycznie montowany.
@ktoś
Poczytaj o plausible deniability (http://www.freeotfe.org/docs/plausible_deniability.htm). W TrueCrypt i FreeOTFE można robić takie rzeczy ‘out of the box’. Zazwyczaj robi się to poprzez umieszczenie na zaszyfrowanej partycji ‘pustej’ danych innego wolumenu zaszyfrowanych innym kluczem (hasłem), przesuwając trochę początek danych, aby nie nadpisać metadanych partycji niby-pustego kontenera. We FreeOTFE i TrueCrypcie za partycję podstawową robi FAT (ale pewnie można poeksperymentować z innymi FS-ami i ręcznym offsetem).
Warto zauważyć, że FreeOTFE potrafi montować woluminy utworzone pod linuksem: “Linux compatibility (Cryptoloop “losetup”, dm-crypt and LUKS supported)” w Windows.
Jest też darmowy gadżet (http://www.ce-infosys.com/english/products/free_compusec.html), który potrafi zaszyfrować cały dysk (nie partycję!) z bootującym Windows, ale to już niestety nie jest free software.
Moze to ci pomoze, znalazlem cos takiego w sieci
http://czytelnia.ubuntu.pl/index.php/2007/04/03/szyfrowane-systemy-plikow/
JAKI jest klucz dostępu do endorphin 2.7.1?????????????????????????????????????
w artykule jest drobny blad (lepiej pozno zauwazyc niz wcale;p)
zamiast:
cryptsetup luksOpen /dev/hdc6powinno byc
cryptsetup luksOpen /dev/hdc6 homeby zgadzalo sie z reszta artykulu. bez tego ostatniego parametru nie przejdzie
Dzięki za wyłapanie, poprawione.
jeszcze dokladnie to samo w przykladzie montowania:
root@host:~# cryptsetup -y luksOpen /dev/hdc6
root@host:~# mount /dev/mapper/home /mnt/home