loop-AES: szyfrowany system plików
wersja 0.2
 

Spis treści

1. Wprowadzenie

2. Trochę teorii
3. Potrzebny soft
4. Kompilacja
5. Szyfrujemy


Posłowie


1. Wprowadzenie

    Wstępy zawsze są nudne i nikomu nie chce się ich czytać, więc
będę się streszczał. Do szyfrowania pojedynczych plików idealnie
nadaje się program gnupg. Nie nadaje się on jednak do szyfrowania
całego systemu plików. Dlatego też powstał ten dokument.

    Szyfrowany system plików może okazać się przydatny
na przykład wtedy, gdy ktoś podpierdoli dysk twardy z Twojego komputera.
Oczywiście nie poogląda on sobie wtedy gołych babek, które ściągnąłeś z Netu
bo wszystko jest zakodowane. Poważnie: kopie konfigów, logów, dane osobowe,
ważne dokumenty, gołe zdjęcia Twojej dziewczyny / chłopaka / zwierzęcia :)
System zostaje "odszyfrowany" na żądanie i można na nim
pracować (po podaniu hasła) jak na zwykłym, nieszyfrowanym. W każdej chwili
można go odmontować i wtedy znika wraz ze swoją zawartością.


2. Trochę teorii

    Wybór padł na loop-AES, więc czas napisać coś o nim.

    2.1. AES

    Najbardziej popularnym obecnie algorytmem szyfrowania symetrycznego
(ten sam klucz używany jest do szyfrowania i deszyfrowania) ciągle pozostaje DES.
Liczy on sobie przeszło 20 lat, więc jego czas powoli dobiega końca - ze względu
na wzrost mocy obliczeniowej, który dokonał się przez ostatnie ćwierćwiecze.

AES (ang. Advanced Encryption Standard) to konkurs rozpoczęty w 1997 roku,
mający na celu wyłonienie nowego standardu algorytmu szyfrującego. Po trzech latach
testów 15-tu kandydatów, wybrano 5 z nich: MARS, Rijndael, RC6, Serpent oraz Twofish.
Warunki, które im postawiono to m.in. publiczna dostępność specyfikacji oraz brak
ograniczeń patentowych i licencyjnych a także minimalna długość klucza - 128 bitów.

Zwycięzcą konkursu okazał się system, którego nazwę najtrudniej wymówić - Rijndael.
Może on pracować na kluczach o długości 128, 192 oraz 256 bitów i został
zatwierdzony przez NIST (ang. National Institute of Standards and Technology)
jako standard dla amerykańskiej administracji rządowej oraz sektora finansowego.

Aktualny stan wiedzy nie pozwala na skuteczny atak na szyfrowane AESem dane.
Atak brutalny także nie będzie skuteczny - wykrzystując miliard komputerów
pracujących równolegle, wszystkie możliwe klucze zostaną sprawdzone za 20 miliardów
lat. Po dodaniu do nich mojego wysłużonego Pentium 133 czas ten nieznacznie
zmaleje :). Podsumowując: w momencie pisania tego dokumentu (2003 r.) AES jest
nie-do-zajebania.

    2.2. Urządzenie loopback

     Istnieje ono w systemie plików jako /dev/loop (/dev/loop0, /dev/loop1, ...).
Odpowiedni sterownik w jądrze Linuxa, wykorzystując powyższe pliki,
udaje urządzenie blokowe (takie jak np. dysk twardy).
Loopback można łączyć z konkretnymi plikami / systemami plików i
wykonywać na nich różne dziwne rzeczy. W naszym przypadku posłuży ono do
szyfrowania "w locie" danych. Jest to bardzo szybka metoda, będąca dodatkowo
przeźroczysta dla programów pracujących na naszym systemie.

    Teraz powinieneś z grubsza domyślać się o co właściwie
chodzi z tym loop-AES. Wykorzystując AES będziemy przy pomocy
urządzenia loopback szyfrować co popadnie.


3. Potrzebny soft

Dobra, zaczynamy. Poniższe czynności wykonuje na Slacku 8.0 (jajko 2.4.20).
Powinieneś pobrać z Sieci: pakiet loop-AES oraz util-linux.
Ten drugi należy spaczować tym pierwszym. Chodzi o to, żeby do
programów mount, umount, swapon, losetup dołożyć obsługę AESa.
Podobno w niektórych dystrybucjach wersje ww. programów są
na to przygotowane i nie trzeba ich przekompilować - jeśli
coś o tym wiesz, daj znać.

Pobierz ostatnią dostępną wersję (u mnie 1.7c) loop-AES z:
http://loop-aes.sourceforge.net

Pobierz ostatnią dostępną wersję (u mnie 2.11z) util-linux z:
ftp://ftp.kernel.org/pub/linux/utils/util-linux/

Rozpakuj je do jakiegoś tymczasowego katalogu. Czas wspomnieć o jajcu.
loop-AES powinien działać na kernelach 2.0, 2.2 oraz nowszych 2.4.
Być może nie będziesz musiał nawet (re)kompilować jajeczka.
Tak czy siak, jego źródła powinieneś mieć w /usr/src/linux.


4. Kompilacja

Na początek o kernelu. Jeśli jesteś adminem z jajami, powinieneś wiedzieć
jak je kompilować. Przy okazji możesz wymienić jajko na (naj)nowsze.
Nie odpowiadam na pytania związane z kompilacją kernela - come back later.

Oto opcje oraz potrzebne wartości dla jajca:

CONFIG_MODULES = y
(konieczne: Loadable module support --> Enable loadable module support)

CONFIG_BLK_DEV_LOOP = n
(konieczne: Block devices --> Loopback device support)

CONFIG_KMOD = y
(zalecane: Loadable module support --> Kernel module loader)

Generalnie chodzi o to, że wyłączona zostaje w kernelu obsługa urządzenia
loop, zastąpi ją moduł utworzony przez pakiet loop-AES.

Jest bardzo prawdopodobne, że Twoje obecne jajco jest skomilowane z takimi
właśnie opcjami. Sprawdź to. A jeśli nie jesteś pewien, przekompiluj je,
zainstaluj oraz uruchom system ponownie.

Wracamy do czekających na nas programików.
Rozpakowałem je do /home/heniek/Soft/.
Fragment tego katalogu (u Ciebie może być inny) to:
loop-AES-v1.7c/
util-linux-2.11z/


Po wejściu do tego pierwszego, wydaję polecenie:
make
Proste jak drut. Właśnie stworzyłeś moduł loop.o, który został
wrzucony do odpowiedniego (pod)katalogu w /lib/modules/.....

Po wejściu do util-linux-2.11z/, wydaję polecenie:
patch -p1 < ../loop-AES-v1.7c/util-linux-2.11z.diff
Oczywiście domyślasz się, że pacz jest przygotowany dla określonej
wersji util-linux (przeważnie ostatniej, choć może być
pewne opóźnienie). Jeśli nie trafisz z wersją, poczekaj parę dni
albo ściągnij wcześniejszą, odpowiednią wersję util-linux.

Reszta wygląda tak (uważaj!):
./configure
make SUBDIRS="lib mount"

Okej. Powstały programiki mount, umount, swapon, losetup z obsługą
AESa. Teraz powinieneś zastąpić nimi te, które istnieją teraz w systemie.
Sprawdź ich lokalizację oraz prawa dostępu. U mnie musiałem poczynić
(jako root) następujące kroki z katalogu
/home/heniek/Soft/util-linux-2.11z/mount/:

# archiwizacja istaniejących binarek
cp /bin/mount /bin/mount.bak
cp /bin/umount /bin/umount.bak
cp /sbin/swapon /sbin/swapon.bak
cp /sbin/losetup /sbin/losetup.bak

# instalacja nowych
# tutaj szczególnie uważaj (prawa dostępu, linki, właściciel)
install -m 755 losetup swapon /sbin
install -m 4755 -o root mount umount /bin

Okej, masz nowe binarki, idziemy dalej.
Wracam do katalogu z kodem źródłowym loop-AES, u mnie
/home/heniek/Soft/loop-AES-v1.7c/. Teraz sprawdzimy sobie,
czy szafa gra.

Jeszcze jedna informacja, której autorem jest Urug:
"loop-AES wymaga gnupg (www.gnupg.org), i rzeczywiscie
w wypadku jego braku 'make tests' sie sypie"


Wykonaj polecenie:
make tests
Przez ekran powinno przewinąć się od cholery czarodziejskich poleceń
wykonujących się z szybkością światła (nawet na P133 :). Jeśli ostatnia
linijka będzie brzmiała: *** Tests result ok *** - gratuluję.

Z katalogu util-linux-2.11z/mount/ możesz pozgrywać sobie
jeszcze manuale (nadpisując stare). Jeśli możesz pozwolić sobie na
reboot serwerka, zrób to i zobacz, czy wszystko chodzi jak należy.
Instalacja zakończona, może trochę poszyfrujemy ?


5. Szyfrujemy

    Nasz system jest już gotowy - przejdźmy od słów do czynów.
Szyfrowany system plików powstanie na urządzeniu /dev/loopX.
Urządzenie to może być połączone albo z fizyczną partycją na dysku twardym
np. /dev/hdc2, albo z określonym plikiem (mogącym znajdować się
gdziekolwiek w istniejącym obecnie systemie plików). W tym drugim
przypadku plik stanowił będzie swojego rodzaju "pojemnik" na cały
szyfrowany system plików, przy pomocy urządzenia loop będzie
go można montować jak każdą inną partycję. Wyższą wydajność uzyskuje się
jednak w przypadku pierwszym. A jeśli mowa o wydajności, to szyfrowanie
"w locie" przy pomocy loop jest i tak bardzo szybkie.

  5.1. Szyfrowana partycja

Pierwszy przykład to szyfrowanie całej partycji. Jeśli nie posiadasz
żadnej wolnej - i tak to przeczytaj (w przypadku plików jest niemal
identycznie a nie będzie mi się chciało pisać tego samego raz jeszcze).

W moim przypadku wybór padł na /dev/hdc2, która ma pojemność
około 300 MB (ale kurwa zaszalałem). Nie muszę pisać, żebyś u siebie
odpowiednio zmienił nazwę partycji...

Plan jest taki: na /dev/hdc2, przy pomocy /dev/loop0,
utworzę szyfrowaną partycję typu ext2, którą podmontuję w
/mnt/tajne. Może nazwa tej ostatniej jest bez polotu, ale nie o
to tutaj chodzi.

a)
Na początku należy przygotować partycję. Możemy ją albo wypełnić
zerami (co jest szybsze) albo losowymi danymi (wolne, ale robi zupełną
rozpizduchę - nie widać wtedy nawet gdzie się zaczynają a gdzie kończą
szyfrowane dane).

Wypełnienie zerami wygląda tak:
dd if=/dev/zero of=/dev/hdc2 bs=4k
Na P133 "zerowanie" 300-megowej partycji trwało ok. 2 minut.

Wypełnianie danymi losowymi wygląda tak:
dd if=/dev/urandom of=/dev/hdc2 bs=4k
Na P133 "zaśmiecanie" 300-megowej partycji trwało ok. 25 minut.

b)
Teraz musimy skojarzyć określony loop z naszą partycją i ustawić
wybrać sposób szyfrowania. Wykorzystamy oczywiście AES (128 bitowy,
dostępny jest także 192 i 256 bitowy). Minimalna długość klucza (hasła)
to 20 znaków, oto ich zakres: a-zA-Z0-9./.

losetup -e AES128 -T /dev/loop0 /dev/hdc2

Polecenie losetup umożliwia kojarzenie, linkowanie urządzeń loop
z urządzeniami blokowymi (partycja) lub plikami zwykłymi. Mamy więc /dev/loop0
połączony z /dev/hdc2. Szyfrowanie dokonuje się w przeźroczysty dla nas
sposób. Od tej pory mamy dostępną w systemie nową partycję: /dev/loop0.

c)
A gdy mamy nową partycję, wypadałoby założyć na niej jakiś system plików.
Wybieramy nasz ulubiony, czyli ext2 :).

mkfs -t ext2 /dev/loop0

No i to chyba wszystko. Pozostało usunąć skojarzenie między partycją
a urządzeniem loop:

losetup -d /dev/loop0

Teraz sprawa wygląda tak: aby dostać się do naszej szyfrowanej partycji,
musimy utworzyć jej skojarzenie z odpowiednim urządzeniem loop a
następnie (po podaniu hasła) gdzieś ją podmontować (/mnt/tajne).

d)
Teraz możemy zrobić tak: albo montować naszą szyfrowaną partycję za
każdym razem ręcznie, albo utworzyć odpowiedni wpis w pliku /etc/fstab.

Wybór należy do Ciebie, tutaj zostaną omówione dwa sposoby.

  Montowanie "na żądanie"

Hmmm... niewiele różni się toto od podmontowanie każdej innej parycji.
Po prostu dochodzi fragment z losetup.

losetup -e AES128 -T /dev/loop0 /dev/hdc2
mount /dev/loop0 /mnt/tajne

Jak zauważa Tomcio44 (thx), "parametr -T jest niepotrzebny, gdyż wtedy
musimy podać hasło dwa razy co przy 20-znakowym jest sztuką :)".


Od tej pory wszystko, co umieszczone zostanie w /mnt/tajne jest
"w locie" szyfrowane. Aby odmontować naszą partycję i jej zawartość
uczynić nieczytelną robimy tak:

umount /mnt/tajne
losetup -d /dev/loop0


Najlepiej uprościć sobie życie i napisać krótkie skrypciki do montowania
i odmontowania szyfrowanych partycji.

A jeśli nie wierzysz, że wszystko działa jak należy to spróbuj dobrać
się jakoś do /dev/hdc2. Powodzenia :)

  Montowanie szyfrowanej z /dev/fstab

Jeśli chciałbyś montować szyfrowaną partycję automatycznie, w momencie
uruchamiania się systemu wystarczy taki wpis w /etc/fstab:

/dev/hdc2 /mnt/tajne ext2 defaults,loop=/dev/loop0,encryption=AES128 0 0

Oczywiście wtedy musisz być przy każdym reboocie sprzętu - system
będzie czekał na hasło w momencie uruchamiania się.

Możliwe jest jeszcze jedno wyjście - do opcji w /etc/fstab
dopisujesz noauto - wówczas system uruchomi się bez montowania
szyfrowanej, ale wszystko co będziesz musiał wpisać po zalogowaniu się
to mount /mnt/tajne oraz hasło. Taki sobie kompromis.


  5.2. Szyfrowany plik - pojemnik

To dopiero jest ciekawa sprawa. Zamiast szyfrować całą partycję,
możesz utworzyć plik dowolnej wielkości, który po drobnych zabiegach
będzie widoczy w systemie jako (szyfrowana) partycja. Można na niej
tworzyć pliki, katalogi, pełne prawa dostępu - a wszystko będzie
siedzieć w szyfrowanym pliku.

Do rzeczy. Poniższa procedura niewiele różni się od wcześniejszej,
dlatego ograniczę się do różnic między nimi.

a)
Na początek musimy stworzyć plik o określonym rozmiarze. Wybór jego
rozmiaru należy od Ciebie. Dla celów testowych utworzę 5-cio megabajtowy
plik /root/crypto. Przypominam raz jeszcze, że nie trzeba poświęcać
całej partycji tylko znaleźć wystarczające miejsce na już istniejącej.
Po kilku poleceniach możesz zamontować ten plik (a właściwie partycję)
np. jako /mnt/tajne2/.

Podobnie jak w przypadku partycji, plik tworzymy poleceniem dd:

dd if=/dev/zero of=/root/crypto bs=4k count=1280

Jeśli chcesz wypełnić plik losowymi danymi, jako "wejściowe" urządzenie
wybierz /dev/urandom (będzie to trwało kilka razy dłużej). Parametrem
count określasz wielkość pliku docelowego (count x bs).

Pewnie się zdziwisz, ale od tej pory postępujesz dokładnie tak, jak w
przypadku, gdy szyfrowałeś partycję. Wystarczy /dev/hdc2 zastąpić
/root/crypto. Fajne, co ? Pracujesz na pliku jak na zwykłej partycji.
Jeśli ciekawi Cię co kryje się we wnętrzu szyfrowanego /root/crypto,
sprawdź to :) / "zepsuty" terminal czyści się poleceniem reset /.
Pamiętaj też, że o wiele łatwiej skasować przez przypadek plik, niż
partycję - w tym przypadku cała jego zawartość idzie w cholerę.


Przy pomocy loop-AES można naprawdę czarować - dla jajka 2.4 można
na przykład szyfrować swapa. Ciekawe efekty można też uzyskać w połączeniu
z gnupg i podpisami kluczy. Najwięcej informacji i wskazówek znajduje
się w pliku README pakietu loop-AES.

Prawdę mówiąc nie mam pojęcia czy ktoś wykorzysta to co wyżej napisałem.
Temat rozbuduję, jeśli otrzymam od Was "znak - sygnał" (w postaci maili,
że komuś się to przyda). Właśnie doszedłem do wniosku, że czas dziabnąć
sobie kilka piw. Nie wiem jak Ty, ale ja mam zamiar dać dzisiaj
w palnik (z takich a nie innych powodów). Nara !


Posłowie

Jest to pierwsza wersja tego dokumentu i zawiera pewnie
jakieś błędy/niedoróbki/potknięcia itp. Będę bardzo wdzięczny
za wszelkie uwagi, komentarze, poprawki, wyrazy wdzięczności.
Z góry przepraszam za powyższe i mam nadzieję, że będziecie mnie
informować w których miejscach coś nie gra.
Jako (częściowe) wytłumaczenie przedstawiam fakt, że większość tej
pracy powstawała w późnych godzinach nocnych.

Ostatnia wersja tego dokumentu znajduje się pod niżej wymienionym adresem.
Kontakt ze mną: linio@terramail.pl
Wesprzyj finansowo autora - kliknij tutaj


 
===============================
Henryk Liniowski, Poznań 2003
http://linio.terramail.pl
===============================