ECryptfs jako alternatywa dla encfs

Kategoria: Artykuły, etykiety: ecryptfs, encfs, pam, szyfrowanie, openbox

Dodany: 2014-10-12 17:06 (zmodyfikowany: 2014-10-12 17:07)
Przez: morfik

Wyświetleń: 13493

Parę dni temu (2014-10-07) w debianie była aktualizacja pakietu encfs , która to zawierała informację na temat audytu bezpieczeństwa jaki się dokonał już parę miesięcy temu -- nie ma to jak powierzanie paczek odpowiedzialnym maintainerom. xD 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 przy pomocy tego narzędzia pliki, 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 ten ktoś może 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 dropboxie czy mega, a jak wiadomo, przy każdej synchronizacji, zmiany w danym katalogu są przesyłane do dropboxa i wszelkie zabezpieczenie jakie daje encfs diabli biorą.

Ja używałem encfs do szyfrowania katalogów na dropboxie, spideroaku oraz na mega i niestety zmuszony byłem wipe'nąć całą ich zawartość i zrobiłem to od razu tuż po przeczytaniu podlinkowanego wyżej artykułu i to bez zastanawiania się nawet. 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 LUKSa czy truecrypta 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ł, tak jak to miało miejsce w przypadku 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 w katalogu, można je przesłać na innego linuxa i tam dokonać deszyfracji przy pomocy klucza, który jest przechowywany w keyringu kernela. Do obsługi tego keyringu 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 -- maksymalna ilość obsługiwanych katalogów per user to 1 -- akurat na katalog /home/$USER/. Dodatkowo, nie mamy możliwości określenia długości klucza -- jest wkodowany na sztywno i jest to AES128 -- 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ż zrobić ręcznie w stosunku do każdego innego katalogu i tu mamy już spore pole manewru. Dodatkowo, eCryptfs może być montowany przez /etc/fstab -- tego nie dało się w prosty sposób uzyskać w encfs, choć nie powinno się używać fstaba 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/

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

root:~# adduser morfikanin
Adding user `morfikanin' ...
Adding new group `morfikanin' (1001) ...
Adding new user `morfikanin' (1001) with group `morfikanin' ...
Creating home directory `/home/morfikanin' ...
Copying files from `/etc/skel' ...
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Changing the user information for morfikanin
Enter the new value, or press ENTER for the default
        Full Name []:
        Room Number []:
        Work Phone []:
        Home Phone []:
        Other []:
Is the information correct? [Y/n]

root:~# 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 zbackupowane w /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/, 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ć pliki w swoim katalogu:

morfikanin@morfikownia:~$ 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

morfikanin@morfikownia:~$ ls -al
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

morfikanin@morfikownia:~$ touch test

morfikanin@morfikownia:~$ echo test > test

morfikanin@morfikownia:~$ 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.

morfikanin@morfikownia:~$ ecryptfs-unwrap-passphrase
Passphrase:
4ce20ef0799aba39d28d511a452a0f90

Po tym jak się wylogujemy z konta, podgląd katalogu domowego będzie się prezentował jak poniżej:

root:~# 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ć przez pam-auth-update :

  │ PAM profiles to enable:                              │
  │                                                                 │
  │    [*] Unix authentication                                      │
  │    [ ] Mount volumes for user                                   │
  │    [*] GNOME Keyring Daemon - Login keyring management          │
  │    [*] eCryptfs Key/Mount Management                            │
  │    [*] ConsoleKit Session Management                            │
  │    [*] Inheritable Capabilities Management                      |

Po udanej akcji zaszyfrowania katalogu domowego, kasujemy zbackupowany wcześniej automatycznie katalog /home/$USER.vvDPp6xm/ :

root:~# 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 -- mamy tam poniższe pliki:

root:~# 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 są 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 nazwy plików. W pliku wrapped-passphrase znajduje się losowo wygenerowane i zaszyfrowane przy tym 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:

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

Hashe po prawej stronie to sygnatury haseł, na podstawie których kernel identyfikuje konkretne klucze w keyringu -- są one także zapisane w pliku Private.sig :

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

Jak zatem ten mechanizm działa? Dokładnie zostało to 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 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 hashowany 65536 razy przy wykorzystaniu sha512. Następnie taki klucz jest ładowany do keyringa kernela i to nim 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ż hashowane 65536 razy przy użyciu sha512 , a wynikowy klucz jest dodawany do keyringu kernela. Dlatego też, na innej maszynie, przy pomocy znanego tylko nam hasła, możemy odszyfrować konkretny plik.

Powyżej, w keyringu 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 keyringa:

morfikanin@morfikownia:~$ ecryptfs-unwrap-passphrase
Passphrase:
4ce20ef0799aba39d28d511a452a0f90

morfikanin@morfikownia:~$ 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 na przykładzie /home/$USER/

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 z zaszyfrowanym katalogiem /home/$USER/ i nadpisałem kompletnie pliki w katalogu /home/morfikanin/.ecryptfs/ :

root:~# cd /home/
root:/home# > ./morfikanin/.ecryptfs/wrapped-passphrase
root:/home# > ./morfikanin/.ecryptfs/Private.mnt
root:/home# > ./morfikanin/.ecryptfs/Private.sig
root:/home# 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:

root:/home# 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:

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

Definiujemy także gdzie zamontować zaszyfrowany zasób:

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

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

root:/home# 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:

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

Teraz już tylko zostało nam przetestować czy po zalogowaniu się, katalog /home/$USER/ zostanie odszyfrowany i podmontowany automatycznie. 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 w/w 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 :

morfik:~$ 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 zaimplementowaną obsługę LUKSa dla całego mojego systemu. Poza tym, problem z powyższym rozwiązaniem jest oczywisty jeśli chodzi o przechowywanie tak zaszyfrowanych plików w różnego rodzaju chmurach -- jak udostępnić taki folder, np. na dropboxie? 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ą narzędzia ubuntowe. 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:

root:/media/Server/test# mkdir .1 1 .2 2 .3 3
root:/media/Server/test# chmod 500 1 2 3
root:/media/Server/test# chmod 700 .1 .2 .3
root:/media/Server/test# 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 przenieść tej konfiguracji na zwykłego usera. 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 keyringu kernela. Wszystkie opcje szyfrowania umieszczamy w pliku /etc/fstab . Dodatkowo, w opcjach fstaba 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 hasło -- by wygenerować jakiś rozsądny losowy ciąg znaków (32 bajty), wpisujemy w terminal poniższe polecenie:

morfik:~$ 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 :

morfik:~$ 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/13 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:

morfik:~$ 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 openboxa (lub jakiegoś ś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 keyringa 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:

root:/home/morfik/Desktop/router# 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 jest w postaci zwykłego tekstu widnieje w pliku autostartu openboxa, trzeba odpowiednio zabezpieczyć te pliki. W przypadku fstaba, ustawiamy dostęp na 600, podobnie z plikiem openboxa:

# chmod 600 /home/morfik/.config/openbox/autostart
# chmod 600 /etc/fstab

Jeśli nie korzystamy z full disk encryption, 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ą oprogramowania, które potrafi zaszyfrować SWAP ale z tego co czytałem, to działa ono jedynie pod ubuntu.

Z tego co wyczytałem na necie, eCryptfs potrafi 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 syslogu 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.

Makulatura

Pisane w oparciu o:

http://ecryptfs.org/documentation.html
https://help.ubuntu.com/12.04/serverguide/ecryptfs.html
https://help.ubuntu.com/community/EncryptedPrivateDirectory
https://wiki.archlinux.org/index.php/ECryptfs
http://www.linuxjournal.com/article/9400
http://ksouedu.com/doc/ecryptfs-utils/ecryptfs-faq.html
http://lwn.net/Articles/210502/
http://www.ibm.com/developerworks/library/l-key-retention/

OSnews Wykop Blip Flaker Kciuk Śledzik Facebook Identi.ca Twitter del.icio.us Google Bookmarks