|
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 =============================== |