2004 01 Loop AES – szyfrowane systemy plików [Bezpieczenstwo]


bezpieczeństwo
Loop-AES  szyfrowane
systemy plików
Skarbimir Kwiatkowski
ażdy, kto uzyska nieautoryzowany dostęp do
komputera, zwłaszcza fizyczny, jest w stanie
poznać wszystkie tajemnice powierzone jego
Kdyskom twardym. Jak wobec tego zabezpie-
czyć się przed ujawnieniem poufnych danych firmy lub
prywatnych sekretów, np. w przypadku kradzieży notebo-
oka albo gdy dostęp do komputera mają osoby trzecie? Jest
na to rada.
Linux oferuje wiele mechanizmów ochrony danych
opartych na silnej kryptografii. Otwartość zródeł stanowi
gwarancję, że nikt nie zostawił w nich otwartej tylnej furtki.
To ważna zaleta. Nie bez znaczenia jest też możliwość
dostosowania konfiguracji do potrzeb użytkownika w stop-
niu znacznie większym niż w przypadku  często niezbyt
elastycznych  produktów komercyjnych.
W dalszej części artykułu przedstawię kilka modelo-
wych rozwiązań opartych na jednym z najwygodniejszych
narzędzi kryptograficznych w Linuksie  module jądra Loop-
AES z wbudowaną obsługą szyfrowania. W odróżnieniu od
takich programów, jak gpg, mcrypt lub ccat, nadających
się do szyfrowania pojedynczych plików lub archiwów,
Loop-AES pozwala na wygodne szyfrowanie dużych porcji
danych, np. całych partycji (zarówno podstawowych, jak Rysunek 1. Strona NIST poświęcona AES
i logicznych) lub systemów plików utworzonych w zwy-
kłych plikach o niemal dowolnej wielkości. Dostęp do nich dzenia został umieszczony w module, obejdzie się nawet
uzyskujemy po wymagającym autoryzacji montowaniu za bez jego rekonfiguracji i rekompilacji.
pośrednictwem urządzenia loop. Do innych użytecznych
zastosowań modułu Loop-AES należą szyfrowanie partycji Praca z szyfrowanym systemem
wymiany (swap) oraz korzystanie z zabezpieczonych kryp- plików
tograficznie płyt CD. Z punktu widzenia użytkownika, praca z zaszyfrowanym
Niewątpliwym atutem tego modułu jest stosunkowo systemem plików  jeśli pominąć czynności związane z jego
duża elastyczność i przenośność. Możemy go użyć w sys- przygotowaniem i montowaniem  nie różni się niczym od
temach z jądrem z serii 2.0, 2.2, 2.4 oraz  choć czasami pracy na zwykłej, niezabezpieczonej partycji. Proces szyfro-
nie bez kłopotów  2.6. Nie ma przy tym znaczenia, czy wania danych jest "przezroczysty", odbywa się na poziomie
korzystamy z jądra dystybucyjnego czy samodzielnie zbu- jądra i nie wymaga wykonywania dodatkowych czynno-
dowanego. Loop-AES nie wymaga także nakładania łat na ści czy stosowania specjalnych narzędzi. Możemy więc
zródła jądra. Gdy obsługa urządzenia blokowego loopback tworzyć lub usuwać katalogi i pliki przy użyciu zwykłych
nie została wkompilowana w jądro lub sterownik tego urzą- poleceń systemowych (touch, mkdir, rm itp.), zapisywać
w nich dowolne dane, przenosić je z innych, niezaszyfrowa-
nych partycji za pomocą standarowego polecenia cp albo
O autorze:
między panelami ulubionego menedżera plików. Dopiero
Autor pracuje w Zakładzie Logiki i Semiotyki Uniwersytetu
próba "podejrzenia" zawartości zabezpieczonej partycji po
Mikołaja Kopernika w Toruniu. Od kilku lat wykorzystuje
odmontowaniu uświadomi nam, że wszystko to, co na niej
Linuksa, FreeBSD i Solaris w działalności zawodowej i poza-
zawodowej. Kontakt z autorem: autorzy@linux.com.pl. zapisaliśmy, prezentuje się jako zupełnie nieczytelny gąszcz
przypadkowych znaków.
30 styczeń 2004
loop-aes
Co i jak szyfrować?
Zanim wybierzemy konkretny model zastosowania Loop-
AES, warto zastanowić się  biorąc pod uwagę różne
istotne okoliczności  nad szczegółami rozwiązania.
Jakie dane naprawdę potrzebują ochrony? Czy posiadamy
wolną część dysku, którą możemy przeznaczyć na party-
cję szyfrowaną, czy raczej zależy nam na zabezpieczeniu
partycji już istniejących i wykorzystywanych? Czy chcemy
mieć możliwość łatwego usuwania lub przenoszenia
całości zaszyfrowanych danych, np. na płytach CD? Czy
korzystamy z tej maszyny sami, czy wspólnie z innymi?
Ile spośród tych osób ma mieć dostęp do wrażliwych
danych? Czy wygodniej i bezpieczniej będzie podzielić
je na części dostępne z osobna dla każdego uprawnione-
go, czy może użyć wspólnej partycji chronionej hasłem
dostępu albo kluczami GnuPG ? Czy potrzebujemy szyfro-
Rysunek 2. Schemat działania algorytmu AES
wanej partycji wymiany?
Ochrona prywatności lub tajemnic firmy jest ważna, nie tylko, czy rzeczywiście warto. Poufne dane zajmują na
ale starajmy się nie popadać w paranoję. Uczestnicy grup ogół tylko pewną część dysku, reszta to m.in. powszech-
dyskusyjnych czasem pytają:  czy mogę zaszyfrować całe nie używane programy, których zródła są publicznie
drzewo katalogów? . Oczywiście można to zrobić, pyta- dostępne. Szyfrując wszystko bez wyboru, najprawdopo-
dobniej zużyjemy niepotrzebnie część mocy obliczenio-
wej maszyny i przysporzymy sobie kłopotów związanych
AES z rekompilacją jądra, modyfikacją trybu uruchamiania
systemu itp. Z tego powodu odradzam ten pomysł. Uparci
Moduł Loop-AES, autorstwa Fina Jariego Ruusu, implementuje
eksperymentatorzy znajdą precyzyjną instrukcję w doku-
symetryczny szyfr blokowy Rijndael, który w 2000 r. został
mentacji modułu Loop-AES.
wyłoniony w konkursie ogłoszonym przez National Institute of
Standards and Technology (NIST) jako nowy standard zaawan-
Przygotowanie narzędzi
sowanej kryptografii. Z tego powodu Rijndael zwany jest najczę-
Przed rozpoczęciem pracy z szyfrowanymi systemami
ściej po prostu AES (Advanced Encryption Standard).
plików, musimy zaopatrzyć się w pliki zródłowe, które
Zwycięzca konkursu zastąpił wysłużony, zbyt powolny
i nie dość bezpieczny algorytm DES. Oprócz kryteriów tech- posłużą do zbudowania niezbędnych binariów:
nicznych, AES musiał spełnić warunki publicznej dostępności
specyfikacji, braku ograniczeń natury patentowo-licencyjnej
" zródła modułu Loop-AES (loop-AES-latest.tar.bz2);
oraz zapewnić wysoką wydajność. W finałowej piątce, prócz
Warto również zaopatrzyć się w Ciphers (ciphers-
opracowanego przez Belgów Joana Daemena i Vincenta Rijme-
latest.tar.bz2), zawierające zródła dodatkowych modu-
na algorytmu Rijndael, znalazły się również algorytmy Serpent
łów kryptograficznych, współpracujących z Loop-AES
i Twofish, stosowane w dodatkowych modułach z projektu
(loop_serpent.o, loop_twofish.o i loop_blowfish.o),
Loop-AES.
oraz zródła pomocniczego narzędzia Aespipe (aespi-
Algorytm AES użyty w module loop przetwarza niezaszyfro-
pe-latest.tar.bz2), służącego do szyfrowania danych
wany tekst na tekst zaszyfrowany o tej samej długości. Dane
w potoku (pipe). Ten ostatni program przyda się
szyfrowane są 128-, 192- lub 256-bitowym kluczem w 128-
nam, gdy będziemy chcieli zaszyfrować już istniejącą
bitowych blokach, co zapewnia bardzo silne rozproszenie,
i wykorzystywaną partycję, na której przechowujemy
a tym samym skuteczną ochronę przed rozszyfrowaniem (Ry-
sunek 2). Szyfrowanie bloków odbywa się w trybie CBC (Cipher pliki wymagające ochrony. Aespipe i Ciphers stanowią
Block Chaining), a jako klucz służy skrót hasła podanego przez
część tego samego projektu Loop-AES.
użytkownika, obliczany funkcją skrótu SHA-256, SHA-384 lub
" zródła zestawu narzędzi Util-linux (util-linux-2.12pre.
SHA-512.
tar.bz2);
Jak dotąd, nie są znane przypadki złamania AES. Atak
Programy mount, umount, losetup, swapon, swapoff
 siłowy , polegający na sprawdzaniu wszystkich kluczy, jest
muszą mieć zaimplementowaną obsługę kryptograficz-
przy obecnych mocach obliczeniowych komputerów nieefek-
ną, więc użyjemy odpowiednio połatanej wersji.
tywny, a możliwość ataku algebraicznego  dającego szansę
" zródła jądra lub co najmniej jego pliki nagłówkowe (w
otrzymania rezultatów w rozsądnym czasie  stanowi w tej
wielu dystrybucjach dostępne w osobnych pakietach),
chwili zaledwie przedmiot kontrowersji wśród specjalistów.
pliki nagłówkowe biblioteki glibc oraz kompilator
Zainteresowanym szczegółami polecam stronę domową
języka C (gcc).
projektu Rijndael, a także stronę NIST, poświęconą tematyce
AES.
www.linux.com.pl 31
bezpieczeństwo
block/loop.o, a następnie wydajemy polecenie depmod -a.
Powinno to umożliwić instalację Loop-AES.
Czas zbudować moduł. O ile pliki nagłówkowe jądra
są zlokalizowane w typowym miejscu (/lib/modules/
`uname -r`/build, /usr/src/linux, /usr/src/linux-`uname
-r` lub /usr/src/kernel-source `uname -r`), to po rozpa-
kowaniu archiwum wystarczy ograniczyć się do wyko-
nania polecenia make i zaktualizowania listy dostępnych
modułów:
tar jxvf loop-AES-latest.tar.bz2
cd loop-AES-v1.7e
su
make && depmod -a
Jeśli lokalizacja zródeł jest inna, to komenda make wymaga
podania ścieżki do odpowiedniego katalogu: make
LINUX_SOURCE=/sciezka/do/katalogu/ze/zrodlami/jadra.
W katalogu /lib/modules/`uname -r` znajdziemy teraz nowy
podkatalog block, a w nim nowy plik loop.o.
Aby dodać moduły loop_serpent.o, loop_blowfish.o
i loop_twofish.o, w analogiczny sposób postępujemy
z archiwum ciphers-latest.tar.bz2. Zyskamy w ten sposób
Rysunek 3. Strona domowa projektu Loop-AES na serwerze
dodatkowe silne algorytmy Serpent, Blowfish i Twofish.
SourceForge
Każdy z nich może być używany z kluczem 128-, 192-
Przede wszystkim powinniśmy sprawdzić, czy używane i 256-bitowym, a ponadto ostatni występuje również
jądro systemu spełnia wspomniany wcześniej warunek, t.j. w postaci Twofish160.
nie posiada statycznie wkompilowanego urządzenia loop. Teraz przystępujemy do przygotowania narzędzi, które
Jeśli konfigurowaliśmy je i kompilowaliśmy wcześniej, pozwolą nam w pełni korzystać z nowego modułu (lub
wystarczy zajrzeć do pliku .config w katalogu ze zródłami. modułów). Będziemy potrzebowali zmodyfikowanych pro-
Standardowe wersje jądra domyślnie nie włączają obsługi gramów mount, umount i losetup, a także  jeśli planujemy
loopback. używać szyfrowanej partycji wymiany  swapon i swapoff.
Jeżeli używamy jądra z dystrybucyjnego pakietu, Odpowiednia łata dołączona jest do archiwum loop-
możemy poszukać jego konfiguracji (np. Debian umieszcza AES-latest.tar.bz2. W naszym przypadku jest to plik util-
stosowny plik z numerem jądra w katalogu /boot) albo po linux2.12pre.diff. Przed instalacją warto zadbać o kopie
prostu spróbować załadować moduł loop i/lub zamontować zapasowe. Możemy również, jeżeli np. zamierzamy ograni-
obraz dowolnej płyty CD z danymi. czyć się jedynie do testów, umieścić zbudowane programy
Gdy wykonamy polecenie grep CONFIG_BLK_DEV_LOOP w innym katalogu. Pamiętajmy jednak, że skrypty startowe
/usr/src/linux/.config, odpowiedz "CONFIG_BLK_DEV_ systemu, o ile ich nie zmodyfikujemy, będą korzystały ze
LOOP is not set " oznacza, że możemy od razu zająć się starych wersji. Typową procedurę kompilacji i instalacji
utworzeniem nowego modułu. potrzebnych narzędzi przedstawia Listing 1.
Gdy w konfiguracji znajdziemy "CONFIG_BLK_DEV_
LOOP=y", to niestety będzie potrzebne nowe jądro syste- Szyfrowanie partycji
mu. Po wydaniu polecenia make menuconfig, w katalogu Wreszcie nadeszła pora, aby wypróbować przygotowa-
zawierającym zródła, w sekcji "Block devices" wyłączamy ne oprogramowanie! Na początek przedstawię przykład
opcję "Loopback device support ". W sekcji "Loadable module najbardziej oczywisty, a przy tym prosty. Wolną partycję
support " zaznaczamy "Enable loadable module support ", chcemy przeznaczyć na szyfrowane dane. Przyjmuję, że
a dla wygody, choć nie jest to konieczne, "Kernel module partycja została już wcześniej założona, np. fdiskiem.
loader " ("CONFIG_KMOD=y"). W pierwszym kroku przyłączamy partycję do urzą-
W przypadku, gdy jądro zostało wyposażone w ładowal- dzenia loop. Za pomocą flagi -e określamy szyfr (zamiast
ny moduł loop ("CONFIG_BLK_DEV_LOOP=m"), a z jakichś AES256 może to być np. AES128 czy AES192, a jeśli zbu-
powodów nie chcemy budować nowego jądra, możemy dowaliśmy moduły z Ciphers, także np. serpent128 czy
spróbować obejść kłopot w mało elegancki, lecz skuteczny twofish256 ). Nie musimy własnoręcznie ładować modułu
sposób. Usuwamy lub kopiujemy w bezpieczne miejsce loop, gdyż zadba o to jądro systemu, o ile podczas kon-
istniejący moduł /lib/modules/`uname -r`/kernel/drivers/ figuracji zaznaczyliśmy "CONFIG_KMOD=y". Natomiast
32 styczeń 2004
loop-aes
Rysunek 4. Zabezpieczenie dostępu do klucza AES szyfrem niesymetrycznym przy pomocy GnuPG
moduły loop_serpent czy loop_twofish powinniśmy odpowiednio dostosować polecenia, wpisując /dev/loop/0,
w razie potrzeby załadować poleceniem modprobe lub /dev/loop/7 itp. Dodajmy, że domyślna liczba urządzeń
insmod. Flaga -T informuje program, że ma dwukrotnie loop w systemie wynosi osiem. W razie potrzeby możemy
pytać o hasło. Polecenie wygląda więc tak: zwiększyć ją za pomocą mknod nawet do 256.
Program losetup nie pozwoli na użycie hasła krótszego
losetup -e AES256 -T /dev/loopX /dev/hdaN niż dwadzieścia znaków. To dużo, ale wybierzmy je sta-
rannie, tak aby maksymalnie utrudnić ewentualny atak
Tu i w dalszej części artykułu X oznacza numer urządzenia słownikowy.
loop, a N  numer partycji. Osoby używające devfs powinny Zakładamy na partycji system plików ext2 (z pewnymi
ograniczeniami może to być również system plików z księ-
gowaniem, np. ext3; w sprawie szczegółów odsyłam do
Listing 1. Kompilacja i instalacja narzędzi z Util-linux
dokumentacji). Zwróćmy uwagę, że w tej operacji pośred-
$ tar jxvf util-linux-2.12pre.tar.bz2 niczy loop, dlatego jako argument polecenia podajemy
$ cd util-linux-2.12pre /dev/loopX. Jeśli wszystko przebiegło poprawnie, odłącza-
$ patch -p1 <../loop-AES-v1.7e/util-linux-2.12pre.diff my urządzenie i zakładamy katalog, który posłuży nam do
$ CFLAGS=-O2 ./configure montowania partycji. Opisane polecenia wyglądają tak:
$ make SUBDIRS="lib mount"
$ cd mount mkfs -t ext2 /dev/loopX
$ strip -s mount umount losetup swapon losetup -d /dev/loopX
$ su mkdir /mnt/crypto
S
# for prog in `which mount umount losetup swapon
swapoff` Możemy teraz zamontować partycję:
> do echo "Tworzę kopię zapasową $prog.sav"
S
> cp -p $prog $prog.sav mount -t ext2 /dev/hdaN /mnt/crypto
> done -o loop=/dev/loopX,encryption=AES256
# install -m 4755 -o root mount umount /bin
# install -m 755 losetup swapon /sbin Zamiast loop =/dev/loopX wystarczy podać po prostu
S
# rm -f /sbin/swapoff && ( cd /sbin && ln -s loop. System sam wybierze wolne urządzenie. Polecenie
swapon swapoff ) mount bez opcji powinno nam teraz pokazać m.in. coś
S
# for item in /usr/share/man/man8/{mount,umount, takiego:
losetup,swapon,swapoff}.8.gz \
S
> /usr/share/man/man5/fstab.5.gz /dev/hda7 on /mnt/crypto type ext2
> do echo "Tworzę kopię zapasową $item" (rw,loop=/dev/loop0,encryption=AES256)
> mv $item $item.sav
# install -m 644 mount.8 umount.8 losetup.8 swapon.8 \ Jeśli wolimy oszczędzić sobie wpisywania za każdym razem
> swapoff.8 /usr/share/man/man8 długiej komendy, powinniśmy dopisać do /etc/fstab:
# install -m 644 fstab.5 /usr/share/man/man5
S
# mandb /dev/hdaN /mnt/crypto ext2 defaults,noauto,
loop=/dev/loopX,encryption=AES256 0 0
www.linux.com.pl 33
bezpieczeństwo
S
Nie potrzeba niczego więcej. To już działa! Choć tego losetup -e AES256 -T -S 8bqMfh75PZnMu+wwjyVq
w ogóle nie dostrzegamy, pliki zapisane w katalogu /mnt/ -C 100 /dev/loopX /dev/hdaN
crypto są szyfrowane i po odmontowaniu partycji będą nie-
dostępne dla niepowołanych oczu. a do fstab wpisalibyśmy w takim przypadku:
Gdyby zależało nam na wzmocnieniu ochrony party-
S
cji przed atakiem słownikowym, moglibyśmy dodatkowo /dev/hdaN /mnt/crypto ext2 defaults,noauto,
S
użyć losowo wygenerowanego zarodka hasła oraz podać loop=/dev/loopX,encryption=AES256,itercountk=100,
liczbę powtórzeń klucza (flagi -S i -C programu losetup). pseed=8bqMfh75PZnMu+wwjyVq 0 0
Zarodek jest dodawany do wpisanego przez administra-
tora hasła, zanim zostanie ono potraktowane nieodwra- Plik jak partycja
calną funkcją haszującą (f. skrótu), natomiast na skutek Zdarza się, że cały dysk jest już podzielony na sforma-
podania po fladze -C liczby N, utworzony skrót hasła szy- towane partycje, z których korzystamy, a wygospodaro-
frowany jest N tysięcy razy przy użyciu algorytmu AES- wanie wolnej części wymagałoby dużo starań. W takim
256. Zabiegi te są dość skutecznym sposobem znacznego przypadku nic nie stoi na przeszkodzie, abyśmy utworzy-
spowolnienia ataku. li zaszyfrowaną strukturę katalogów w zwykłym pliku,
Losowy zarodek hasła możemy wybrać używając przy- który jak wiadomo, w Linuksie może  udawać urządze-
kładowo takiej kombinacji poleceń: nie blokowe, takie jak partycja na dysku twardym. Roz-
wiązanie to ma i tę dobrą stronę, że plik można w razie
S
head -c 15 /dev/urandom | uuencode -m - | potrzeby przenieść w inne miejsce na dysku albo nagrać
awk 'NR == 2 {print} na płytę CD.
Tworzymy zatem plik o wielkości np. 700 MB,
Powinniśmy otrzymać coś w rodzaju: 8bqMfh75PZnMu+wwjy- a następnie poleceniem losetup podłączamy go do urzą-
Vq. Oczywiście za każdym razem ten ciąg będzie inny. Wyj- dzenia loop - dzięki czemu będzie on traktowany jak
ściowe polecenie losetup, od którego zaczęliśmy procedurę partycja  i wybieramy hasło. W dalszej kolejności forma-
szyfrowania partycji, wyglądałoby zatem tak: tujemy go, tworząc strukturę systemu plików ext2. Jako
zródło, z którego czyta program dd, moglibyśmy wykorzy-
stać /dev/zero, ale lepiej użyć /dev/urandom  dd zapisze
Listing 2. Przykładowy plik /etc/fstab z wpisami
wtedy cały plik losowo wybranymi znakami, co spowo-
dotyczącymi montowania szyfrowanych systemów plików
duje, że podglądając plik, nie będzie można zorientować
# /etc/fstab: statyczna informacja o systemach plików. się, w którym miejscu zaczynają się i kończą zaszyfrowane
# dane. Ostatecznie wygląda to tak:

S
/dev/hda2 / ext3 errors=remount-ro 0 1 dd if=/dev/urandom of=/jakis_katalog/crypto_file bs=4k
# szyfrowany swap count=179200
S
/dev/hda5 none swap sw, losetup -e AES256 -T /dev/loopX /jakis_katalog/crypto_file
loop=/dev/loop0,encryption=AES256 0 0 mkfs -t ext2 /dev/loopX
proc /proc proc defaults 0 0
tmpfs /dev/shm tmpfs defaults 0 0 Oczywiście i tu znalazłyby zastosowanie flagi -S i -C pro-
/dev/hda6 /usr ext3 defaults 0 0 gramu losetup (zarodek hasła i liczba iteracji). Pominąłem
/dev/hda7 /home reiserfs defaults 0 0 je, aby nie komplikować przykładów.
/dev/hda8 /scratch reiserfs defaults 0 0 Na koniec zakładamy katalog, którego będziemy
/dev/fd0 /floppy auto user,noauto 0 0 używać podczas montowania i ewentualnie dodajemy do
S
/dev/cdrom /cdrom iso9660 ro,user,exec,noauto, /etc/fstab odpowiedni wpis:
iocharset=iso8859-2 0 0
S S
/dev/scd1/mnt/cdrw iso9660 ro,user,noauto, /jakis_katalog/crypto_file /mnt/crypto ext2 defaults,
iocharset=iso8859-2 0 0 noauto,loop,encryption=AES256 0 0
# szyfrowane urządzenia
S
/dev/hda4 /mnt/crypto1 ext2 defaults,noauto, Jeśli chcemy umożliwić zwykłym użytkownikom (znającym
S
loop=/dev/loop1,encryption=AES256, hasło) montowanie szyfrowanego systemu plików, dopisu-
gpgkey=/floppy/moj_klucz.gpg,gpghome=/floppy 0 0 jemy ponadto do opcji montowania user. To samo dotyczy
S
/dev/hda9 /mnt/crypto2 ext2 defaults,user, poprzedniego przypadku szyfrowanej partycji.
S
noauto,encryption=AES256,loop=/dev/loop2,
gpgkey=/etc/kluczepub-crypto.gpg 0 0 Z kluczem GnuPG na dyskietce
S
/home/self/crypto_fs /mnt/crypto3 ext2 defaults, Dostęp do szyfrowanego systemu plików możemy zabez-
noauto,user,loop,encryption=AES256 0 0 pieczyć dodatkowo kluczem GnuPG. Ideę tę przedstawia
poglądowo Rysunek 4. Nie ma większego znaczenia, czy
34 styczeń 2004
loop-aes
system plików zostanie utworzony według przedstawio- funkcję urządzenia blokowego), do której użytkownicy
nej przed chwilą recepty w dużym pliku, czy na fizycznej wskazani przez administratora otrzymają dostęp na pod-
partycji. stawie pary kluczy GnuPG. Każdy z nich będzie korzystał
Powinniśmy posłużyć się dyskietką z systemem plików z własnych kluczy i, co za tym idzie, własnego hasła.
pozwalającym ustalać prawa dostępu, np. ext2. Jeżeli użyje- Administrator (root) musi mieć wygenerowaną parę
my dyskietki  dosowej , gpg będzie zgłaszał błąd. kluczy GnuPG i dysponować kluczami publicznymi użyt-
Zaczynamy od zamontowania dyskietki i generujemy kowników, którym chce przekazać prawo montowania.
parę kluczy GnuPG, chyba że skorzystamy z już posiada- Sprawdzamy to komendą gpg  list-public-keys. Jeśli na
nych: liście brak jest którejś z tych osób, pomocne będzie pole-
cenie gpg --import plik_z_kluczem. Prawa odczytu two-
mount /dev/fd0 /floppy rzonych plików najlepiej ograniczyć zmieniając domyślne
gpg --gen-key --homedir /floppy ustawienia powłoki poleceniem umask 077. Kolejne polece-
nia wyglądają następująco:
Połączenie komend head, uuencode i awk pozwoli utworzyć
S
odpowiednio długi, losowy ciąg znaków, który posłuży head -c 45 /dev/random | uuencode -m - | awk 'NR == 2
S
do szyfrowania systemu plików. Otrzymane w ten sposób {print}' | gpg -e -a -r "Charlie Root" >
hasło zabezpieczamy szyfrem niesymetrycznym przy /root/masterkey-crypto.gpg
S
pomocy gpg i zapisujemy na dyskietce: losetup -e AES256 -K /root/masterkey-crypto.gpg
/dev/loopX /dev/hdaN
S
head -c 45 /dev/random | uuencode -m - | awk 'NR == 2 mkfs -t ext2 /dev/loopX
{print}' | \ losetup -d /dev/loopX
S
gpg --homedir /floppy -e -a -r "Imię Nazwisko" >
/floppy/moj_klucz.gpg Co zrobiliśmy? Czytelnik zapewne domyśla się, że pierwsza
linia ma na celu otrzymanie losowego ciągu znaków oraz
Do /etc/fstab dopisujemy poniższy wiersz: zaszyfrowanie go przy pomocy klucza GnuPG należącego
do administratora. Wynik zapisywany jest w pliku /root/
S
/dev/hdaN /mnt/crypto1 ext2 defaults,noauto, masterkey-crypto.gpg. Następnie przyłączamy partycję do
S
loop=/dev/loopX,encryption=AES256, urządzenia /dev/loopX. Wybieramy przy tym algorytm szy-
gpgkey=/floppy/moj_klucz.gpg,gpghome=/floppy 0 0 frowania AES256, a flaga -K powoduje, że hasło pobierane
z pliku masterkey-crypto.gpg jest przekazywane do progra-
W przypadku szyfrowania pliku, a nie partycji, pierwszy mu gpg w celu odszyfrowania przed użyciem. Formatujemy
człon należy zastąpić jego nazwą. Kolejne polecenia są partycję i odłączamy ją od urządzenia loopX.
następujące: Przechodzimy do /etc/fstab, dopisując:
S
losetup -F /dev/loopX /dev/hdaN /mnt/crypto2 ext2 defaults,user,noauto,
S
mkfs -t ext2 /dev/loopX encryption=AES256,loop=/dev/loopX,
losetup -d /dev/loopX gpgkey=/etc/userkey-crypto.gpg 0 0
Flaga -F powoduje, że losetup pobiera opcje z /etc/fstab. Na koniec deszyfrujemy hasło i szyfrujemy ponownie, tym
Drugą komendą formatujemy urządzenie i po poprawnym razem używając kluczy publicznych wybranych użytkow-
zakończeniu tej operacji, resetujemy je. ników, a rezultat kierujemy do wymienionego w /etc/fstab
O ile tylko istnieje docelowy katalog, możemy już pliku userkey-crypto.gpg. Każde z nazwisk podajemy
zamontować system plików poleceniem mount /mnt/crypto. w cudzysłowach następujących po fladze -r.
Oczywiście, każda kolejna próba musi być poprzedzona Dane te muszą zgadzać się z opisem kluczy. Wygląda
umieszczeniem dyskietki w napędzie i jej poprawnym to tak:
zamontowaniem. Należy jej strzec, gdyż zgubienie albo
S
zniszczenie kluczy uniemożliwi raz na zawsze dostęp do gpg --decrypt < /root/masterkey-crypto.gpg |
S
zaszyfrowanych plików. Z tego względu rozsądniejsze jest gpg -e -a  always-trust -r "Charlie Root"
S
skopiowanie niezbędnych plików na trwalszy niż dyskietka -r "Jas Kowalski" -r "Joanna Malinowska" >
nośnik i odpowiednia modyfikacja ścieżek dostępu w /etc/ /etc/userkey-crypto.gpg
fstab.
Od tej chwili każdy z użytkowników wskazanych przez
Wielu użytkowników, wiele kluczy administratora może montować partycję hdaN korzystając
GnuPG z własnego klucza prywatnego i hasła GnuPG.
Teraz zajmiemy się bardziej skomplikowanym rozwiąza- Aby zwiększyć bezpieczeństwo, należałoby jeszcze
niem. Przygotujemy szyfrowaną partycję (lub plik pełniący skłonić użytkowników, aby nie przechowywali klucza pry-
www.linux.com.pl 35
bezpieczeństwo
watnego GnuPG na dysku tego komputera. W przeciwnym
przypadku ochrona będzie na tyle skuteczna, na ile hasła
okażą się odporne na atak. Niestety, w znacznym stopniu
zmniejsza to funkcjonalność tego rozwiązania.
Co z partycją wymiany?
Zagrożenie dla poufności danych i prywatności może
także pochodzić ze strony partycji wymiany, na której
system tymczasowo zapisuje dane. Jest bowiem prawdo-
podobne, że podczas pracy uprawnionego użytkownika,
gdy muszą być one dostępne w formie niezaszyfrowanej,
system odłoży je na partycji swap. Cały wysiłek włożony
w instalację i skrupulatne używanie zabezpieczeń krypto-
graficznych może wtedy łatwo pójść na marne, chyba że...
zaszyfrujemy także swap.
Moduł Loop-AES pozwala na to, o ile nasz system jest
wyposażony w jądro z serii 2.4 lub nowsze. Decydując się
na szyfrowanie partycji wymiany powinniśmy pamiętać, że
obarczenie systemu, zwłaszcza mocno obciążonego, opera-
cjami kryptograficznymi może zmniejszyć jego wydajność.
Najpierw wyłączamy aktywne partycje wymiany pole-
ceniem swapoff -a. Następnie modyfikujemy wpisy odno-
Rysunek 5. Szyfrowanie istniejącej partycji, na której
szące się do partycji wymiany w /etc/fstab:
przechowujemy już dane
/dev/hdaN none swap sw,loop=/dev/loopX,encryption=AES128 0 0 z której już korzystamy i którą zdążyliśmy zapełnić
ważnymi danymi. Jak to zrobić nie tracąc danych? Jeżeli
Ten prosty zabieg pozwala nam ponownie uaktywnić swap. reorganizacja dysku nie wchodzi w grę, a z jakichś
Robimy to poleceniem swapon -a, które przywracając jego powodów nie chcemy jej zastępować dużym plikiem,
działanie użyje losowego klucza i wykona komendę mkswap z pomocą przyjdzie nam program Aespipe, stanowiący
na wskazanym urządzeniu loop. niewielki, lecz użyteczny dodatek do Loop-AES (do jego
Jeżeli podczas ponownego uruchomienia systemu poja- kompilacji wystarczy triada poleceń ./configure ; make ;
wią się komunikaty o błędzie podobne do poniższego: make install). Jak podpowiada nazwa, Aespipe potrafi
szyfrować dane pobierane na wejściu. Pomysł jego wyko-
insmod: modprobe: cannot create /var/log/ksymoops/ rzystania w tym przypadku polega na odczytaniu zawar-
20031012.log Read-only file system tości partycji za pomocą dd, zaszyfrowaniu "w locie" (to
insmod: /lib/modules/2.4.22-grsec/block/loop.o: cannot właśnie rola Aespipe) i zapisaniu w tym samym miejscu
create /var/log/ksymoops/20031012.log Read-only file system dysku.
Operacja jest nieco ryzykowna, więc lepiej zawczasu
to dzieje się tak dlatego, że system aktywujący partycję przygotować kopię zapasową całej partycji.
wymiany jednocześnie ładuje moduł loop, a modprobe Zaczynamy od jej odmontowania. W kolejnym kroku
próbuje zapisać informację o tym w logach, choć partycja, wpisujemy poniższe polecenie:
na której się znajdują, nie została jeszcze zamontowana do
S
zapisu. dd if=/dev/hdaN bs=64k | aespipe -e AES256 -T |
Autor dokumentacji modułu Loop-AES proponuje w celu dd of=/dev/hdaN bs=64k conv=notrunc
pozbycia się tego błędu usunąć katalog /var/log/ksymoops.
Bez tego katalogu modprobe nie podejmie próby logowania Jak widać, dd odczytuje partycję i przekazuje wyjście
komunikatu o ładowaniu modułu. Bardziej elegancki, choć do aespipe, którego zadaniem jest zaszyfrowanie tego,
zapewne trudniejszy w realizacji, wydaje się pomysł mody- co otrzyma przy użyciu wybranego algorytmu. Wynik
fikacji skryptów startowych w taki sposób, aby partycja z kolei wędruje do ponownie uruchomionego dd w celu
wymiany była aktywowana nieco pózniej, gdy możliwe już zapisania na urządzeniu, tym razem już w postaci zaszy-
będzie zapisywanie logów. frowanej. Podobnie jak we wcześniejszych przykładach
dotyczących losetup, flaga -e pozwala nam wybrać algo-
Istniejąca partycja z danymi rytm szyfrujący, a -T powoduje, że Aespipe rozpoczynając
Niewykluczone, że w praktyce natkniemy się na dość działanie zapyta dwukrotnie o hasło, którego chcemy
prozaiczny kłopot: planujemy zaszyfrować partycję, użyć.
36 styczeń 2004
loop-aes
Wariant dla ambitnych polega na wzmocnieniu zabez- sposób (oczywiście, to tylko subiektywna ocena). Jak się
pieczeń przez użycie zarodka hasła i iterowanym szyfro- wydaje, najbardziej optymalne z punktu widzenia wydaj-
waniu skrótu hasła. Wymaga on zastosowania znanych już ności jest szyfrowanie fizycznej partycji dysku.
z programu losetup opcji -S (dodanie wygenerowanego W przypadku komputerów starych i powolnych albo
zawczasu zarodka do hasła) oraz -C (liczba wskazująca, ile bardzo przeciążonych pozostaje rozważyć użycie opcji
tysięcy razy szyfrowany jest skrót hasła). Ciąg otrzymany lo_nice i lo_prealloc.
z polecenia (tu: qwSIxpGIi6pZNAvj0e7w): Pierwsza z nich, o domyślnej wartości -20, pozwa-
la modyfikować priorytet zadań. Można ją zmniejszyć
S
head -c 15 /dev/urandom | uuencode -m - | awk 'NR == 2 w /etc/modules.conf (np. options loop lo_nice =-5).
{print}' Druga opcja odpowiada za liczbę 4-kilobajtowych
stron pamięci operacyjnej przeznaczanych dla urządzeń
zostanie użyty w kolejnym kroku jako zarodek hasła: /dev/loopX w chwili montowania. Domyślna wartość
wynosi 125. Możemy ją zwiększyć lub zmniejszyć glo-
S
dd if=/dev/hdaN bs=64k | aespipe -e AES256 -T balnie, dopisując do /etc/modules.conf np. options loop
S
-S qwSIxpGIi6pZNAvj0e7w -C 100 | dd of=/dev/hda2 lo_prealloc=200. Możemy również zróżnicować wielkość
bs=64k conv=notrunc RAM-u prealokowaną przez poszczególne urządzenia:
Po zakończeniu operacji edytujemy opcje montowa- options loop lo_prealloc=100,3,200,4,250.
nia w /etc/fstab, dodając do linii dotyczącej tej partycji:
noauto,loop =/dev/loopX,encryption=AES256 i ewentualnie Pierwsza liczba oznacza zmniejszoną wartość domyśl-
itercountk=100,pseed= qwSIxpGIi6pZNAvj0e7w, o ile użyli- ną, następne pary liczb nadpisują ją, przeznaczając dla
śmy drugiego wariantu. loop3 200 stron pamięci, a dla loop4 250 (składnia dopusz-
Można również wspomnieć o innym ciekawym zastoso- cza co najwyżej cztery takie pary).
waniu Aespipe, mianowicie szyfrowaniu płyt CD, a ściślej,
obrazów przygotowanych za pomocą Mkisofs. Tworzymy je Uwagi końcowe
poleceniem: Starałem się przedstawić zalety omawianych narzędzi
możliwie wszechstronnie. Nie zamykam przy tym oczu na
S
mkisofs -V TAJNE -J -r nazwa_katalogu | aespipe wady loop-AES. Zalicza się do nich zwłaszcza uciążliwość
-e AES256 -T > image.raw dodatkowych zabiegów związanych z kompilacją i instala-
cją niezbędnych binariów, co gorsza, pociągająca za sobą
Po nagraniu można zamontować krążek w taki sposób: ingerencję w integralność systemu pakietowego. Sądzę
jednak, że korzyści warte są podejmowania tego wysiłku.
S
mount -t iso9660 /dev/cdrom /cdrom Jeśli Czytelnik nie czuje się w pełni przekonany o pożyt-
-o loop=/dev/loopX,encryption=AES256 kach płynących ze stosowania zaawansowanej krypto-
grafii, być może samodzielne próby, do których gorąco
Rzecz jasna, dostęp do niego będziemy mieli tylko po zachęcam, staną się czynnikiem przesądzającym.
podaniu hasła i wyłącznie w systemach wyposażonych
w moduł loop-AES.
W Sieci:
Wydajność
" Strona projektu loop-AES:
Na koniec załączę kilka słów na temat wydajności. Nie-
http://loop-aes.sourceforge.net/projects/loop-aes/
wątpliwie, dodatkowe obciążenie komputera operacjami
" Strona domowa projektu Rijndael:
szyfrowania danych  w locie w mniejszym lub większym
http://www.esat.kuleuven.ac.be/~rijmen/rijndael/
stopniu musi wpłynąć na działanie systemu. Trzeba
" Strona NIST poświęcona AES:
jednak przyznać, że zarówno trafnie wybrany przez
http://csrc.nist.gov/CryptoToolkit/aes/rijndael/
autora projektu algorytm szyfrowania, jak i wykorzysta- " Strona entuzjastów algorytmu Rijndael:
http://rijndael.com/
nie urządzenia loop, dość skutecznie minimalizują narzut
" yródła modułu Loop-AES:
czasowy.
http://loop-aes.sourceforge.net/loop-AES-latest.tar.bz2
Ponadto, jeśli zachowamy umiar, wpływ ten może
" yródła dodatkowych modułów:
pozostać niemal niezauważalny. Potwierdzają to doświad-
http://loop-aes.sourceforge.net/ciphers-latest.tar.bz2
czenia autora. Próby przeprowadzane na maszynach
" yródła Aespipe:
z jednym procesorem Pentium 1 GHz lub Athlon 1700
http://loop-aes.sourceforge.net/aespipe-latest.tar.bz2
MHz oraz 512 MB RAM, czyli dość typowych, przy jed-
" yródła Util-linux:
noczesnym wykorzystaniu dwóch szyfrowanych partycji
ftp://ftp.kernel.org/pub/linux/utils/util-linux/util-linux-
i jednego szyfrowanego pliku o wielkości 1 GB, prowadzą
2.12pre.tar.bz2
do wniosku, że komfort pracy nie zmniejsza się w istotny
www.linux.com.pl 37


Wyszukiwarka

Podobne podstrony:
2004 01 Pisanie bezpiecznych programów [Programowanie]
Linux System Plików
iCare Format Recovery naprawa systemu plikow
Linux System Plików II
zamek szyfrowy z systemem alarmowym
Linux konserwacja Systemu Plikow
07 Linux System plików
4 Systemy zarządzania bezpieczeństwem informacji
system plikow
utk1 system plikow ext
Funkcje systemowe systemu plików
Systemy plików
712[06] S1 01 Rozpoznawanie materiałów stosowanych w systemach suchej zabudowy wnętrz
systemy plikow

więcej podobnych podstron