ECryptfs jako alternatywa dla encfs

Spis treści

Dnia 2014-10-07 w Debianie była aktualizacja pakietu encfs , która to zawierała informację na temat audytu bezpieczeństwa jaki się dokonał parę miesięcy wstecz. Wyniki niezbyt dobrze wypadły, a nawet można powiedzieć, że wręcz katastrofalnie. Generalnie cały test został skwitowany słowami, że jeśli szyfrujemy pliki przy pomocy tego narzędzia, to jesteśmy relatywnie bezpieczni, nawet w przypadku jeśli ktoś te pliki przechwyci. Natomiast jeśli zaczniemy zmieniać/dodawać pliki i ten ktoś ponownie przechwyci nasz zaszyfrowany katalog, wtedy może on bez problemu odszyfrować całą jego zawartość. Jeśli wykorzystujemy encfs lokalnie, to być może nam nic nie grozi, nawet w przypadku raidu NSA na naszą chałupę. Problem w tym, że ogromna rzesza ludzi wykorzystuje encfs do zaszyfrowania plików w chmurze, np. na Dropbox'ie czy MEGA, a jak wiadomo, przy każdej synchronizacji, zmiany w danym katalogu są przesyłane do chmury i wszelkie zabezpieczenie jakie daje encfs diabli biorą. Może najwyższy czas zainteresować się ecryptfs?

Czym jest eCryptfs

Ja używałem encfs do szyfrowania katalogów w serwisach takich jak Dropbox, Spideroak oraz na MEGA i niestety zmuszony byłem usunąć całą ich zawartość. Zrobiłem to od razu, tuż po przeczytaniu podlinkowanego we wstępie artykułu i to nawet bez zastanawiania się. Jedyne co, to została mi odszyfrowana kopia lokalna katalogu. Niemniej jednak, nie uśmiecha mi się pakować tych plików bezpośrednio do kontenera LUKS czy TrueCrypt i chciałbym by opcja szyfrowania pojedynczych plików została. Szukając info na sieci na temat tego czym by tutaj zastąpić encfs , doszukałem się eCryptfs.

Cóż to takiego ten cały eCryptfs ? Zgodnie z tym co piszą na stronie projektu, jest to system plików, który przechowuje metadane kryptograficzne w nagłówkach zaszyfrowanych plików. eCryptfs jest częścią kernela i nie potrzeba instalować żadnych dodatkowych rzeczy by działał, w przeciwieństwie do encfs . No chyba, że ktoś potrzebuje pewnych narzędzi zawartych w pakiecie ecryptfs-utils ale można się też obejść i bez nich. Po zaszyfrowaniu plików, można je przesłać na innego linux'a i tam dokonać deszyfracji przy pomocy klucza, który jest przechowywany w keyring'u kernela. Do obsługi tego keyring'a potrzebne jest narzędzie keyctl zawarte w pakiecie keyutils .

Generalnie eCryptfs zwykło używać się do zaszyfrowania katalogu domowego użytkownika i przy tej operacji przydają się te narzędzia dostarczane z pakietem ecryptfs-utils , tylko są też pewne ograniczenia wynikające z ich używania. Przede wszystkim, maksymalna ilość obsługiwanych katalogów per user to jeden. Akurat na katalog /home/$USER/ . Dodatkowo, nie mamy możliwości określenia długości klucza. Jest wkodowany na sztywno i jest to AES 128 -- trochę słabo. Tak czy inaczej wszystko to, co można zrobić przy pomocy natywnych narzędzi w stosunku do katalogu domowego, można też uczynić ręcznie w stosunku do każdego innego katalogu i tu mamy już spore pole manewru.

eCryptfs może być montowany przez plik /etc/fstab . W przypadku encfs nie szło w prosty sposób tego zrobić, choć nie powinno się używać pliku fstab do obsługi montowania zasobów należących do użytkownika. Niemniej jednak, jeśli jesteśmy jedynym użytkownikiem naszego PC i przy tym, posiadamy zaszyfrowany system, możemy sobie dość znacząco ułatwić życie w przypadku korzystania z szyfrowanych katalogów trzymanych w chmurze.

Szyfrowanie katalogu /home/$USER/ przy pomocy eCryptfs

Szyfrowanie katalogu domowego z wykorzystaniem ubuntowych narzędzi sprowadza się do zalogowania się na konto root'a i wydania jednego polecenia. Ja na potrzeby testów, stworzyłem dodatkowego użytkownika i to jego katalog domowy zaszyfrowałem:

# adduser morfikanin

# ecryptfs-migrate-home -u morfikanin
INFO:  Checking disk space, this may take a few moments.  Please be patient.
INFO:  Checking for open files in /home/morfikanin
Enter your login passphrase [morfikanin]:

************************************************************************
YOU SHOULD RECORD YOUR MOUNT PASSPHRASE AND STORE IT IN A SAFE LOCATION.
  ecryptfs-unwrap-passphrase ~/.ecryptfs/wrapped-passphrase
THIS WILL BE REQUIRED IF YOU NEED TO RECOVER YOUR DATA AT A LATER TIME.
************************************************************************


Done configuring.

chown: cannot access '/dev/shm/.ecryptfs-morfikanin': No such file or directory
INFO:  Encrypted home has been set up, encrypting files now...this may take a while.
sending incremental file list
./
.bash_logout
            220 100%    0.00kB/s    0:00:00 (xfr#1, to-chk=2/4)
.bashrc
          3,515 100%    3.35MB/s    0:00:00 (xfr#2, to-chk=1/4)
.profile
            675 100%  329.59kB/s    0:00:00 (xfr#3, to-chk=0/4)

========================================================================
Some Important Notes!

 1. The file encryption appears to have completed successfully, however,
    morfikanin MUST LOGIN IMMEDIATELY, _BEFORE_THE_NEXT_REBOOT_,
    TO COMPLETE THE MIGRATION!!!

 2. If morfikanin can log in and read and write their files, then the migration is complete,
    and you should remove /home/morfikanin.vvDPp6xm.
    Otherwise, restore /home/morfikanin.vvDPp6xm back to /home/morfikanin.

 3. morfikanin should also run 'ecryptfs-unwrap-passphrase' and record
    their randomly generated mount passphrase as soon as possible.

 4. To ensure the integrity of all encrypted data on this system, you
    should also encrypt swap space with 'ecryptfs-setup-swap'.
========================================================================

Jeśli dokonujemy szyfrowania katalogu domowego użytkownika, jego pliki zostaną pierw przeniesione do /home/$USER.vvDPp6xm/ , a następnie skopiowane do podmontowanego folderu i tym samym zostaną zaszyfrowane. Także jeśli mamy sporo plików w katalogu /home/$USER/ , to ten proces może trochę zająć. W tym przypadku były trzy małe pliki tekstowe.

Zgodnie z powyższymi instrukcjami, logujemy się teraz na konto użytkownika, którego katalog domowy zaszyfrowaliśmy i sprawdzamy czy możemy odczytywać/zapisywać jego pliki:

$ ls -al /home/
total 40
drwxr-xr-x  7 root       root        4096 Oct 11 06:34 .
drwxr-xr-x 24 root       root        4096 Oct  9 10:37 ..
drwxr-xr-x  3 root       root        4096 Oct 11 06:34 .ecryptfs
drwx------  2 root       root       16384 Jun 27  2013 lost+found
drwxr-xr-x 80 morfik     morfik      4096 Oct 11 00:11 morfik
drwx------  3 morfikanin morfikanin  4096 Oct 11 06:50 morfikanin
drwx------  2 morfikanin morfikanin  4096 Oct 11 06:34 morfikanin.vvDPp6xm

$ ls -al /home/morfikanin/
total 80
drwx------ 3 morfikanin morfikanin 4096 Oct 11 06:50 .
drwxr-xr-x 7 root       root       4096 Oct 11 06:34 ..
lrwxrwxrwx 1 morfikanin morfikanin   35 Oct 11 06:34 .Private -> /home/.ecryptfs/morfikanin/.Private
-rw-r--r-- 1 morfikanin morfikanin  220 Oct 11 06:34 .bash_logout
-rw-r--r-- 1 morfikanin morfikanin 3515 Oct 11 06:34 .bashrc
lrwxrwxrwx 1 morfikanin morfikanin   36 Oct 11 06:34 .ecryptfs -> /home/.ecryptfs/morfikanin/.ecryptfs
-rw-r--r-- 1 morfikanin morfikanin  675 Oct 11 06:34 .profile

$ touch test

$ echo test > test

$ cat test
test

Wygląda w porządku. W katalogu .Private są trzymane zaszyfrowane pliki. Katalog /home/$USER/ , w którym się znajdujemy, jest punktem montowania.

Musimy także odczytać zaszyfrowane hasło przy pomocy ecryptfs-unwrap-passphrase i gdzieś je sobie zapisać. Jeśli to hasło przepadnie, nie uda nam się już odzyskać plików z tego katalogu.

$ ecryptfs-unwrap-passphrase
Passphrase:
4ce20ef0799aba39d28d511a452a0f90

Po tym jak się wylogujemy z konta, podgląd katalogu domowego będzie się prezentował następująco:

# ls -al /home/morfikanin
total 8.0K
dr-x------ 2 morfikanin morfikanin 4.0K Oct 11 06:34 ./
drwxr-xr-x 7 root       root       4.0K Oct 11 06:34 ../
lrwxrwxrwx 1 morfikanin morfikanin   35 Oct 11 06:34 .Private -> /home/.ecryptfs/morfikanin/.Private/
lrwxrwxrwx 1 morfikanin morfikanin   36 Oct 11 06:34 .ecryptfs -> /home/.ecryptfs/morfikanin/.ecryptfs/
lrwxrwxrwx 1 morfikanin morfikanin   56 Oct 11 06:34 Access-Your-Private-Data.desktop -> /usr/share/ecryptfs-utils/ecryptfs-mount-private.desktop
lrwxrwxrwx 1 morfikanin morfikanin   52 Oct 11 06:34 README.txt -> /usr/share/ecryptfs-utils/ecryptfs-mount-private.txt

Krótko pisząc, katalog domowy został odmontowany po wylogowaniu się użytkownika i nikt nie ma dostępu do jego plików, przynajmniej w formie odszyfrowanej.

Automontowanie zasobu odbywa się za pośrednictwem modułu PAM. Jeśli nie wiemy czy mamy aktywowany ten moduł, możemy to sprawdzić wpisując w terminalu pam-auth-update jako root:

ecryptfs-pam-konfiguracja

Po udanej akcji zaszyfrowania katalogu domowego, kasujemy wcześniej utworzony automatycznie katalog z backup'em /home/$USER.vvDPp6xm/ :

# rm -R /home/morfikanin.vvDPp6xm/

Katalog .ecryptfs

Każdy katalog /home/$USER/ ma podkatalog .ecryptfs, w którym to znajdują się informacje niezbędne do operowania na zaszyfrowanym katalogu domowym użytkownika. Mamy tam poniższe pliki:

# ls -al /home/.ecryptfs/morfikanin/.ecryptfs/
total 20K
drwx------ 2 morfikanin morfikanin 4.0K Oct 11 06:34 ./
drwxr-xr-x 4 morfikanin morfikanin 4.0K Oct 11 06:34 ../
-rw------- 1 morfikanin morfikanin   17 Oct 11 06:34 Private.mnt
-rw------- 1 morfikanin morfikanin   34 Oct 11 06:34 Private.sig
-rw-r--r-- 1 morfikanin morfikanin    0 Oct 11 06:34 auto-mount
-rw-r--r-- 1 morfikanin morfikanin    0 Oct 11 06:34 auto-umount
-r-------- 1 morfikanin morfikanin   48 Oct 11 06:34 wrapped-passphrase

Pliki auto-mount oraz auto-umount to puste pliki i moduł PAM sprawdza ich obecność i jeśli istnieją, to automatycznie montuje/demontuje zasób, gdy użytkownik się loguje/wylogowuje do/z systemu. Sam zaszyfrowany katalog jest montowany w miejscu określonym w pliku Private.mnt . Z kolei w pliku Private.sig są przechowywane sygnatury haseł, którymi to są szyfrowane pliki i ich nazwy. W pliku wrapped-passphrase znajduje się losowo wygenerowane i zaszyfrowane hasło służące do automatycznego montowania katalogu domowego wraz z logowaniem się użytkownika do systemu. By odszyfrować to hasło, trzeba podać inne hasło, w tym przypadku jest to hasło do konta użytkownika w systemie -- to tego hasła używa moduł PAM.

Domyślnie, zarówno pliki w katalogu jak i ich nazwy są szyfrowane niezależnie dwoma różnymi kluczami. Jeśli podejrzymy keyring w krenelu dla tego użytkownika, ujrzymy tam dwa wpisy:

$ keyctl list @u
2 keys in keyring:
167322969: --alswrv  1001  1001 user: d2a0514b5e5288d3
645190684: --alswrv  1001  1001 user: 5edd65cdfbbb0a0f

Hash po prawej stronie to sygnatura hasła, na podstawie której kernel identyfikuje konkretne klucze w keyring'u. Są one także zapisane w pliku Private.sig :

# cat /home/.ecryptfs/morfikanin/.ecryptfs/Private.sig
5edd65cdfbbb0a0f
d2a0514b5e5288d3

Mechanizm działania eCryptfs

To jak ten mechanizm działa dokładnie, zostało wyjaśnione na blogu jednego z twórców eCryptfs. W skrócie, gdy logujemy się do systemu, moduł pam_ecryptfs przy pomocy hasła do naszego konta deszyfruje symetrycznie plik wrapped-passphrase zlokalizowany w katalogu ~/.ecryptfs/ . W tym pliku domyślnie znajduje się 128-bitowy losowo wygenerowany klucz. Po odszyfrowaniu, jest on solony i hash'owany 65536 razy przy wykorzystaniu hash'a sha512. Następnie taki klucz jest ładowany do keyring'a kernela i to przy jego pomocy są szyfrowane nagłówki plików, w których to znajdują się unikatowe klucze szyfrujące same pliki. Dzięki takiemu rozwiązaniu, mając dwa pliki o takiej samej odszyfrowanej zawartości, po zaszyfrowaniu będą miały kompletnie inną formę. Wszystkie nowsze wersje kernela szyfrują także nazwy plików i robią to osobnym kluczem. W tym przypadku, hasło określone w pliku wrapped-passphrase jest wczytywane drugi raz i solone inną wartością niż miało to miejsce wcześniej, po czym jest ono również hash'owane 65536 razy przy użyciu sha512 , a wynikowy klucz jest dodawany do keyring'a kernela. Dlatego też, na innej maszynie, przy pomocy znanego tylko nam hasła, możemy odszyfrować konkretny plik.

Powyżej, w keyring'u kernela, mamy dwie sygnatury. Sprawdźmy zatem czy faktycznie pochodzą one od zaszyfrowanego hasła służącego do montowania katalogu domowego. By je porównać, trzeba wydobyć zaszyfrowane hasło z pliku i dodać je do keyring'a:

$ ecryptfs-unwrap-passphrase
Passphrase:
4ce20ef0799aba39d28d511a452a0f90

$ ecryptfs-add-passphrase --fnek
Passphrase:
Inserted auth tok with sig [5edd65cdfbbb0a0f] into the user session keyring
Inserted auth tok with sig [d2a0514b5e5288d3] into the user session keyring

Jak widać powyżej, obie sygnatury się zgadzają.

Odzyskiwanie/przenoszenie zaszyfrowanego katalogu

Jeśli znaleźlibyśmy się w sytuacji krytycznej, tj. stracilibyśmy pliki w katalogu .ecryptfs, lub zwyczajnie chcielibyśmy odtworzyć zaszyfrowany katalog na innej maszynie ale mamy do dyspozycji tylko zaszyfrowane pliki oraz odszyfrowane hasło, możemy przeprowadzić poniższe kroki by uzyskać dostęp do zaszyfrowanego katalogu. Na potrzeby testu wylogowałem się z konta użytkownika, którego katalog domowy poddałem szyfrowaniu. Następnie nadpisałem kompletnie pliki w katalogu /home/morfikanin/.ecryptfs/:

# cd /home/
# > ./morfikanin/.ecryptfs/wrapped-passphrase
# > ./morfikanin/.ecryptfs/Private.mnt
# > ./morfikanin/.ecryptfs/Private.sig

# ls -al ./morfikanin/.ecryptfs/
total 8.0K
drwx------ 2 morfikanin morfikanin 4.0K Oct 11 08:12 ./
drwxr-xr-x 4 morfikanin morfikanin 4.0K Oct 11 06:34 ../
-rw------- 1 morfikanin morfikanin    0 Oct 11 08:17 Private.mnt
-rw------- 1 morfikanin morfikanin    0 Oct 11 08:17 Private.sig
-rw-r--r-- 1 morfikanin morfikanin    0 Oct 11 06:34 auto-mount
-rw-r--r-- 1 morfikanin morfikanin    0 Oct 11 06:34 auto-umount
-rw-r--r-- 1 morfikanin morfikanin    0 Oct 11 08:17 wrapped-passphrase

W tej chwili, bez posiadania odszyfrowanej formy hasła nie jesteśmy w stanie odzyskać zaszyfrowanych plików. Musimy zatem zaszyfrować hasło potrzebne do zamontowania katalogu /home/$USER/ przy pomocy ecryptfs-wrap-passphrase podając w Passphrase to wrap odszyfrowaną formę hasła, a w Wrapping passphrase hasło do logowania do systemu:

# ecryptfs-wrap-passphrase ./morfikanin/.ecryptfs/wrapped-passphrase
Passphrase to wrap:
Wrapping passphrase:

Sprawdzamy czy jesteśmy w stanie odszyfrować hasło, które znalazło się w pliku:

# ecryptfs-unwrap-passphrase ./morfikanin/.ecryptfs/wrapped-passphrase
Passphrase:
4ce20ef0799aba39d28d511a452a0f90

Zatem ten krok mamy z głowy. Definiujemy także gdzie zamontować zaszyfrowany zasób:

# echo "/home/morfikanin/" > ./morfikanin/.ecryptfs/Private.mnt

Potrzebne nam są jeszcze sygnatury kluczy szyfrujących. W Passphrase: podajemy odszyfrowane hasło do montowania:

# ecryptfs-add-passphrase --fnek
Passphrase:
Inserted auth tok with sig [5edd65cdfbbb0a0f] into the user session keyring
Inserted auth tok with sig [d2a0514b5e5288d3] into the user session keyring

Uzupełniamy sygnatury:

# echo 5edd65cdfbbb0a0f > ./morfikanin/.ecryptfs/Private.sig
# echo d2a0514b5e5288d3 >> ./morfikanin/.ecryptfs/Private.sig

Teraz już tylko zostało nam przetestować czy po zalogowaniu się, katalog /home/$USER/ zostanie automatycznie odszyfrowany i zamontowany. W moim przypadku, wszystko przebiegło bez większych problemów.

Szyfrowanie folderu ~/Private/

Jeśli chcemy zaszyfrować inny folder niż domowy, możemy to zrobić przy pomocy narzędzia ecryptfs-setup-private . Działać to będzie na tej samej zasadzie co szyfrowanie całego folderu domowego, z tym, że zostanie ograniczone tylko do folderu ~/Private/ . Korzystając z ecryptfs-setup-private nie mamy możliwości ani dostosowania długości klucza, który wynosi 128 bitów, ani też określenia innego katalogu niż tego domyślny. Poniżej jest przedstawione wykorzystanie ww. narzędzia:

morfik:~$ ecryptfs-setup-private
Enter your login passphrase [morfik]:
Enter your mount passphrase [leave blank to generate one]:

************************************************************************
YOU SHOULD RECORD YOUR MOUNT PASSPHRASE AND STORE IT IN A SAFE LOCATION.
  ecryptfs-unwrap-passphrase ~/.ecryptfs/wrapped-passphrase
THIS WILL BE REQUIRED IF YOU NEED TO RECOVER YOUR DATA AT A LATER TIME.
************************************************************************


Done configuring.

Testing mount/write/umount/read...
Inserted auth tok with sig [b91ce3811ab95844] into the user session keyring
Inserted auth tok with sig [c1884ffbc9e246b7] into the user session keyring
Inserted auth tok with sig [b91ce3811ab95844] into the user session keyring
Inserted auth tok with sig [c1884ffbc9e246b7] into the user session keyring
Testing succeeded.

Logout, and log back in to begin using your encrypted directory.

I to w zasadzie tyle. By móc korzystać z tego folderu, musimy się ponownie zalogować w systemie. Dobrze jest też sprawdzić po zalogowaniu czy folder jest poprawnie montowany przez wydanie polecenia mount :

$ mount
...
/home/morfik/.Private on /home/morfik/Private type ecryptfs (rw,nosuid,nodev,relatime,ecryptfs_fnek_sig=c1884ffbc9e246b7,ecryptfs_sig=b91ce3811ab95844,ecryptfs_cipher=aes,ecryptfs_key_bytes=16,ecryptfs_unlink_sigs)

Po wylogowaniu się, folder powinien zostać automatycznie zdemontowany.

Istnieje też, co prawda, opcja sprecyzowania, który folder chcemy zaszyfrować i gdzie go zamontować ale w takim przypadku, PAM nie jest w stanie montować/demontować takiego katalogu, dlatego też darujemy sobie tę konfigurację.

Szyfrowanie dowolnego folderu

Ja zbytnio nie potrzebuję ani szyfrować katalogu domowego, ani katalogu ~/Private/ , bo mam zaimplementowane pełne szyfrowanie dysku na bazie LUKS. Poza tym, problem z powyższym rozwiązaniem jest oczywisty jeśli chodzi o przechowywanie tak zaszyfrowanych plików w różnego rodzaju chmurach. Mianowicie, jak udostępnić taki folder, np. na Dropbox? Dropbox wymaga od nas by udostępniane pliki umieszczać w określonym przez niego katalogu. Z kolei z MEGA jest trochę lepiej, bo możemy precyzować foldery niezależnie i możemy wybrać zaszyfrowany folder ~/.Private/ i go przesłać do chmury. A co w przypadku, gdy nam nie odpowiada położenie katalogu ~/.Private/ albo też co w przypadku gdybyśmy chcieli mieć wiele zaszyfrowanych folderów? Tego typu konfiguracji nie sprostają ubuntowe narzędzia. Jest to, co prawda, wykonalne ale trzeba ręcznie stworzyć cały setup.

Na sam początek potrzebujemy kilka katalogów -- po dwa na każdy zaszyfrowany zasób. Dodatkowo, nadajemy im odpowiednie prawa dostępu:

# cd /media/Server/test/
# mkdir .1 1 .2 2 .3 3
# chmod 500 1 2 3
# chmod 700 .1 .2 .3

# ls -al
total 32K
drwxr-xr-x  8 morfik morfik 4.0K Oct 11 20:07 ./
drwxr-xr-x 18 morfik morfik 4.0K Oct 11 19:35 ../
drwx------  2 morfik morfik 4.0K Oct 11 19:36 .1/
drwx------  2 morfik morfik 4.0K Oct 11 19:36 .2/
drwx------  2 morfik morfik 4.0K Oct 11 20:07 .3/
dr-x------  2 morfik morfik 4.0K Oct 11 20:07 1/
dr-x------  2 morfik morfik 4.0K Oct 11 20:07 2/
dr-x------  2 morfik morfik 4.0K Oct 11 20:07 3/

To jaką konfigurację sobie obierzemy, zależy tylko od nas. Możemy mieć wszystkie katalogi na jedno hasło, lub każdy na inne. Niemniej jednak, w przypadku posiadania wielu katalogów, hasła do nich będziemy musieli przechowywać w postaci czystego tekstu gdzieś na dysku, dlatego, też jeśli mamy niezaszyfrowany system, to hasło może zostać przechwycone, z czym należy się jak najbardziej liczyć.

Na necie doszukałem się informacji na temat pliku ~/.ecryptfsrc i próbowałem przy jego pomocy zaszyfrować katalogi. Niby się nawet udało to zrobić ale tylko z konta użytkownika root. Nie szło za to przenieść tej konfiguracji na zwykłego user'a. Sam plik ma poniższą postać:

key=passphrase
passphrase_passwd=4490af7434bebacd
#passphrase_passwd_file=/mnt/usb/passwd_file.txt
#ecryptfs_unlink_sigs
ecryptfs_xattr
ecryptfs_key_bytes=32
ecryptfs_cipher=aes
ecryptfs_passthrough=n
ecryptfs_sig=eb8898761ad51521
ecryptfs_fnek_sig=eb8898761ad51521

Dodatkowo są jakieś problemy z sygnaturami i nie idzie ustawić w tym pliku dwóch różnych, co powoduje, że nagłówki plików i nazwy plików są szyfrowane tym samym kluczem. Poza tym, natknąłem się na szereg błędów przy montowaniu, także raczej odradzam korzystanie z tego pliku.

Na szczęście istnieje inne rozwiązanie, przy pomocy którego udało mi się osiągnąć pożądaną przeze mnie konfigurację. Zakłada ona wykorzystanie autostartu środowiska graficznego. Schemat działania jest prosty. Wczytujemy hasło i na jego podstawie są generowane dwie sygnatury, które są umieszczane w keyring'u kernela. Wszystkie opcje szyfrowania umieszczamy w pliku /etc/fstab . Dodatkowo, w opcjach dodajemy users tak, by montowanie tych zasobów mogło odbywać się także z konta zwykłego użytkownika ale tylko tego będącego członkiem grupy users .

Na początek zajmijmy się hasłem. By wygenerować jakiś rozsądny losowy ciąg znaków (32 bajty), wpisujemy w terminal poniższe polecenie:

$ od -x -N 32 --width=32 /dev/urandom | head -n 1 | sed "s/^0000000//" | sed "s/\s*//g"
dde1109bb38ede1b9d7309929a956365b132d454d8ea77636e0b02a792e9e82b

Teraz tym hasłem musimy nakarmić ecryptfs-add-passphrase :

$ ecryptfs-add-passphrase --fnek
Passphrase:
Inserted auth tok with sig [49d33e33ef5a3ecb] into the user session keyring
Inserted auth tok with sig [80d9a32888b65b44] into the user session keyring

Uzyskane w ten sposób sygnatury wpisujemy do pliku /etc/fstab wraz z dodatkową konfiguracją:

/media/Server/test/.1 /media/Server/test/1 ecryptfs    defaults,user,noauto,nofail,ecryptfs_sig=49d33e33ef5a3ecb,ecryptfs_fnek_sig=80d9a32888b65b44,ecryptfs_cipher=aes,ecryptfs_key_bytes=32 0 0
/media/Server/test/.2 /media/Server/test/2 ecryptfs   defaults,user,noauto,nofail,ecryptfs_sig=49d33e33ef5a3ecb,ecryptfs_fnek_sig=80d9a32888b65b44,ecryptfs_cipher=aes,ecryptfs_key_bytes=32 0 0
/media/Server/test/.3 /media/Server/test/3 ecryptfs  defaults,user,noauto,nofail,ecryptfs_sig=49d33e33ef5a3ecb,ecryptfs_fnek_sig=80d9a32888b65b44,ecryptfs_cipher=aes,ecryptfs_key_bytes=32 0 0

By przetestować montowanie zasobów, wydajemy poniższe polecenia:

$ keyctl list @u
2 keys in keyring:
769826815: --alswrv  1000  1000 user: 49d33e33ef5a3ecb
185921157: --alswrv  1000  1000 user: 80d9a32888b65b44

morfik:~$ mount -i /media/Server/test/1
morfik:~$ mount -i /media/Server/test/2
morfik:~$ mount -i /media/Server/test/3

$ mount
...
/media/Server/test/.1 on /media/Server/test/1 type ecryptfs (rw,nosuid,nodev,noexec,relatime,ecryptfs_fnek_sig=80d9a32888b65b44,ecryptfs_sig=49d33e33ef5a3ecb,ecryptfs_cipher=aes,ecryptfs_key_bytes=32,_netdev,user=morfik)
/media/Server/test/.2 on /media/Server/test/2 type ecryptfs (rw,nosuid,nodev,noexec,relatime,ecryptfs_fnek_sig=80d9a32888b65b44,ecryptfs_sig=49d33e33ef5a3ecb,ecryptfs_cipher=aes,ecryptfs_key_bytes=32,_netdev,user=morfik)
/media/Server/test/.3 on /media/Server/test/3 type ecryptfs (rw,nosuid,nodev,noexec,relatime,ecryptfs_fnek_sig=80d9a32888b65b44,ecryptfs_sig=49d33e33ef5a3ecb,ecryptfs_cipher=aes,ecryptfs_key_bytes=32,_netdev,user=morfik)

By zautomatyzować proces montowania zasobów na starcie systemu, do autostartu Openbox'a (lub innego środowiska graficznego) dodajemy poniższą zwrotkę:

if [ -z "$(mount | grep ecryptfs)" ] ; then
      printf "%s" "dde1109bb38ede1b9d7309929a956365b132d454d8ea77636e0b02a792e9e82b" | ecryptfs-add-passphrase --fnek -
      mount -i /media/Server/test/1
      mount -i /media/Server/test/2
      mount -i /media/Server/test/3
fi

Za każdym razem gdy będziemy wywoływać graficzną sesję logowania, system sprawdzi czy jakieś zaszyfrowane katalogi są zamontowane i jeśli nie są, załaduje sygnatury do keyring'a kernela, po czym podmontuje zasoby.

Powyższą zwrotkę możemy także dodać do pliku ~/.profile lub ~/.bashrc jeśli interesuje nas dostęp do zaszyfrowanych katalogów wyłącznie spod TTY.

Odszyfrowywanie pojedynczych plików

Jeśli bylibyśmy zmuszeni z jakiegoś powodu pobrać surową kopię pliku z Dropboxa, możemy tak uzyskany plik bez większego problemu odszyfrować. Wystarczy stworzyć dwa katalogi i w jednym z nich umieścić zaszyfrowany plik. Następnie znając hasło, możemy określić sygnatury:

# printf "%s" "dde1109bb38ede1b9d7309929a956365b132d454d8ea77636e0b02a792e9e82b" | ecryptfs-add-passphrase --fnek -
Inserted auth tok with sig [49d33e33ef5a3ecb] into the user session keyring
Inserted auth tok with sig [80d9a32888b65b44] into the user session keyring

Mając sygnatury, możemy przejść do katalogu, w którym stworzyliśmy dwa testowe podkatalogi i z konta root dokonać zamontowania zasobu:

# mount -t ecryptfs .1 1
Select key type to use for newly created files:
 1) tspi
 2) passphrase
Selection: 2
Passphrase:
Select cipher:
 1) aes: blocksize = 16; min keysize = 16; max keysize = 32
 2) blowfish: blocksize = 8; min keysize = 16; max keysize = 56
 3) des3_ede: blocksize = 8; min keysize = 24; max keysize = 24
 4) twofish: blocksize = 16; min keysize = 16; max keysize = 32
 5) cast6: blocksize = 16; min keysize = 16; max keysize = 32
 6) cast5: blocksize = 8; min keysize = 5; max keysize = 16
Selection [aes]: 1
Select key bytes:
 1) 16
 2) 32
 3) 24
Selection [16]: 2
Enable plaintext passthrough (y/n) [n]:
Enable filename encryption (y/n) [n]: y
Filename Encryption Key (FNEK) Signature [49d33e33ef5a3ecb]: 80d9a32888b65b44
Attempting to mount with the following options:
  ecryptfs_unlink_sigs
  ecryptfs_fnek_sig=80d9a32888b65b44
  ecryptfs_key_bytes=32
  ecryptfs_cipher=aes
  ecryptfs_sig=49d33e33ef5a3ecb
WARNING: Based on the contents of [/root/.ecryptfs/sig-cache.txt],
it looks like you have never mounted with this key
before. This could mean that you have typed your
passphrase wrong.

Would you like to proceed with the mount (yes/no)? : yes
Would you like to append sig [49d33e33ef5a3ecb] to
[/root/.ecryptfs/sig-cache.txt]
in order to avoid this warning in the future (yes/no)? : no
Not adding sig to user sig cache file; continuing with mount.
Mounted eCryptfs

Sprawdzamy, czy plik został pomyślnie odszyfrowany:

# ls -al .1/
total 19M
drwxr-xr-x 2 morfik morfik 4.0K Oct 12 02:03 ./
drwxr-xr-x 4 morfik morfik 4.0K Oct 12 02:03 ../
-rw-r--r-- 1 morfik morfik  19M Oct 11 00:20 ECRYPTFS_FNEK_ENCRYPTED.FXbOcDQ6N4OQfkZidLU.rJ-fktfdjINirZfMNdk7XKECoP8wqi2eqiHmZJmgAms1xrIVSmwYtw5.l2s-

# ls -al 1/
total 19M
drwxr-xr-x 2 morfik morfik 4.0K Oct 12 02:03 ./
drwxr-xr-x 4 morfik morfik 4.0K Oct 12 02:03 ../
-rw-r--r-- 1 morfik morfik  19M Oct 11 00:20 2014_10_11_00_13_29.tar.gz

Trzeba tylko pamiętać, by po skończonej robocie, zdemontować zaszyfrowany katalog.

Dodatkowe zabezpieczenia

Jako, że opcje szyfrowania mamy zdefiniowane w pliku /etc/fstab oraz, że hasło w postaci zwykłego tekstu widnieje w pliku autostartu środowiska graficznego, trzeba odpowiednio zabezpieczyć te pliki. W przypadku /etc/fstab , ustawiamy prawa dostępu na 600, podobnie postępujemy z plikiem openboxa:

# chmod 600 ~/.config/openbox/autostart
# chmod 600 /etc/fstab

Jeśli nie korzystamy z pełnego szyfrowania dysku, a jedynie szyfrujemy katalog domowy, musimy także pomyśleć o zaszyfrowaniu przestrzeni wymiany, jeśli takową posiadamy w systemie, oraz o zabezpieczeniu katalogu /tmp/ . Ubuntowe narzędzia od eCryptfs dostarczają oprogramowanie, które potrafi zaszyfrować SWAP ale z tego co czytałem, to działa ono jedynie pod ubuntu.

Doczytałem się także informacji, że eCryptfs może obsługiwać certyfikaty zamiast haseł, co potrafi dodatkowo zwiększyć bezpieczeństwo zaszyfrowanych danych. Tylko, że ten ficzer zwyczajnie nie działa:

# ecryptfs-manager

eCryptfs key management menu
-------------------------------
        1. Add passphrase key to keyring
        2. Add public key to keyring
        3. Generate new public/private keypair
        4. Exit

Make selection: 3
Select key type to use for newly created files:
Selection:
Select key type to use for newly created files:
Selection: 1
Select key type to use for newly created files:
Selection: 2
Select key type to use for newly created files:
Selection: 4
Select key type to use for newly created files:
Selection: ^C

Jak widać powyżej, nie ma żadnego typu klucza. Dodatkowo, w syslog'u można zaobserwować poniższy błąd:

ecryptfs-manager: Error initializing key module [/usr/lib/x86_64-linux-gnu/ecryptfs/libecryptfs_key_mod_gpg.so]; rc = [-22]
ecryptfs-manager: Key module [tspi] does not have a key generation subgraph transition node
ecryptfs-manager: Key module [passphrase] does not have a key generation subgraph transition node

Pozostaje mieć nadzieję, że wszystkie błędy, na które natrafiłem przy przejściu z encfs na eCryptfs zostaną wyeliminowane.

Prace nad encfs

Doszukałem się informacji, że prace nad encfs ruszyły oraz, że kod projektu został przeniesiony na github'a i jak pisze twórca, ten projekt teraz zależy głównie od społeczności. Przez trzy i pół roku aplikacja przebywała w stanie uśpienia ale 10 marca 2015 roku doczekała się wersji 1.8.

Mikhail Morfikov avatar
Mikhail Morfikov
Po ponad 10 latach spędzonych z różnej maści linux'ami (Debian/Ubuntu, OpenWRT, Android) mogę śmiało powiedzieć, że nie ma rzeczy niemożliwych i problemów, których nie da się rozwiązać. Jedną umiejętność, którą ludzki umysł musi posiąść, by wybrnąć nawet z tej najbardziej nieprzyjemniej sytuacji, to zdolność logicznego rozumowania.