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

background image

styczeń 2004

30

bezpieczeństwo

Loop-AES – szyfrowane

systemy plików

Skarbimir Kwiatkowski

K

ażdy, kto uzyska nieautoryzowany dostęp do
komputera, zwłaszcza fizyczny, jest w stanie
poznać wszystkie tajemnice powierzone jego
dyskom 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ść źró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
i logicznych) lub systemów plików utworzonych w zwy-
kłych plikach o niemal dowolnej wielkości. Dostęp do nich
uzyskujemy po wymagającym autoryzacji montowaniu za
pośrednictwem urządzenia loop. Do innych użytecznych
zastosowań modułu Loop-AES należą szyfrowanie partycji
wymiany (swap) oraz korzystanie z zabezpieczonych kryp-
tograficznie płyt CD.

Niewątpliwym atutem tego modułu jest stosunkowo

duża elastyczność i przenośność. Możemy go użyć w sys-
temach z jądrem z serii 2.0, 2.2, 2.4 oraz – choć czasami
nie bez kłopotów – 2.6. Nie ma przy tym znaczenia, czy
korzystamy z jądra dystybucyjnego czy samodzielnie zbu-
dowanego. Loop-AES nie wymaga także nakładania łat na
źródła jądra. Gdy obsługa urządzenia blokowego loopback
nie została wkompilowana w jądro lub sterownik tego urzą-

dzenia został umieszczony w module, obejdzie się nawet
bez jego rekonfiguracji i rekompilacji.

Praca z szyfrowanym systemem

plików

Z punktu widzenia użytkownika, praca z zaszyfrowanym
systemem plików – jeśli pominąć czynności związane z jego
przygotowaniem i montowaniem – nie różni się niczym od
pracy na zwykłej, niezabezpieczonej partycji. Proces szyfro-
wania danych jest "przezroczysty", odbywa się na poziomie
jądra i nie wymaga wykonywania dodatkowych czynno-
ści czy stosowania specjalnych narzędzi. Możemy więc
tworzyć lub usuwać katalogi i pliki przy użyciu zwykłych
poleceń systemowych (touch, mkdir, rm itp.), zapisywać
w nich dowolne dane, przenosić je z innych, niezaszyfrowa-
nych partycji za pomocą standarowego polecenia cp albo
między panelami ulubionego menedżera plików. Dopiero
próba "podejrzenia" zawartości zabezpieczonej partycji po
odmontowaniu uświadomi nam, że wszystko to, co na niej
zapisaliśmy, prezentuje się jako zupełnie nieczytelny gąszcz
przypadkowych znaków.

O autorze:

Autor pracuje w Zakładzie Logiki i Semiotyki Uniwersytetu

Mikołaja Kopernika w Toruniu. Od kilku lat wykorzystuje

Linuksa, FreeBSD i Solaris w działalności zawodowej i poza-

zawodowej. Kontakt z autorem: autorzy@linux.com.pl.

Rysunek 1.

Strona NIST poświęcona AES

background image

31

www.linux.com.pl

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-
wanej partycji wymiany?

Ochrona prywatności lub tajemnic firmy jest ważna,

ale starajmy się nie popadać w paranoję. Uczestnicy grup
dyskusyjnych czasem pytają: “czy mogę zaszyfrować całe
drzewo katalogów?”. Oczywiście można to zrobić, pyta-

nie tylko, czy rzeczywiście warto. Poufne dane zajmują na
ogół tylko pewną część dysku, reszta to m.in. powszech-
nie używane programy, których źródła są publicznie
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
z rekompilacją jądra, modyfikacją trybu uruchamiania
systemu itp. Z tego powodu odradzam ten pomysł. Uparci
eksperymentatorzy znajdą precyzyjną instrukcję w doku-
mentacji modułu Loop-AES.

Przygotowanie narzędzi

Przed rozpoczęciem pracy z szyfrowanymi systemami
plików, musimy zaopatrzyć się w pliki źródłowe, które
posłużą do zbudowania niezbędnych binariów:

• źródła modułu Loop-AES (loop-AES-latest.tar.bz2);

Warto również zaopatrzyć się w Ciphers (ciphers-
latest.tar.bz2
), zawierające źródła dodatkowych modu-
łów kryptograficznych, współpracujących z Loop-AES
(loop_serpent.o, loop_twofish.o i loop_blowfish.o),
oraz źródła pomocniczego narzędzia Aespipe (aespi-
pe-latest.tar.bz2
), służącego do szyfrowania danych
w potoku (pipe). Ten ostatni program przyda się
nam, gdy będziemy chcieli zaszyfrować już istniejącą
i wykorzystywaną partycję, na której przechowujemy
pliki wymagające ochrony. Aespipe i Ciphers stanowią
część tego samego projektu Loop-AES.

• źródła zestawu narzędzi Util-linux (util-linux-2.12pre.

tar.bz2);

Programy mount, umount, losetup, swapon, swapoff

muszą mieć zaimplementowaną obsługę kryptograficz-
ną, więc użyjemy odpowiednio połatanej wersji.

• źródła jądra lub co najmniej jego pliki nagłówkowe (w

wielu dystrybucjach dostępne w osobnych pakietach),
pliki nagłówkowe biblioteki glibc oraz kompilator
języka C (gcc).

AES

Moduł Loop-AES, autorstwa Fina Jariego Ruusu, implementuje
symetryczny szyfr blokowy Rijndael, który w 2000 r. został
wyłoniony w konkursie ogłoszonym przez National Institute of
Standards and Technology
(NIST) jako nowy standard zaawan-
sowanej kryptografii. Z tego powodu Rijndael zwany jest najczę-
ściej po prostu AES (Advanced Encryption Standard).

Zwycięzca konkursu zastąpił wysłużony, zbyt powolny

i nie dość bezpieczny algorytm DES. Oprócz kryteriów tech-
nicznych, AES musiał spełnić warunki publicznej dostępności
specyfikacji, braku ograniczeń natury patentowo-licencyjnej
oraz zapewnić wysoką wydajność. W finałowej piątce, prócz
opracowanego przez Belgów Joana Daemena i Vincenta Rijme-
na
algorytmu Rijndael, znalazły się również algorytmy Serpent
i Twofish, stosowane w dodatkowych modułach z projektu
Loop-AES.

Algorytm AES użyty w module loop przetwarza niezaszyfro-

wany tekst na tekst zaszyfrowany o tej samej długości. Dane
szyfrowane są 128-, 192- lub 256-bitowym kluczem w 128-
bitowych blokach, co zapewnia bardzo silne rozproszenie,
a tym samym skuteczną ochronę przed rozszyfrowaniem (Ry-
sunek 2). Szyfrowanie bloków odbywa się w trybie CBC (Cipher
Block Chaining
), a jako klucz służy skrót hasła podanego przez
użytkownika, obliczany funkcją skrótu SHA-256, SHA-384 lub
SHA-512.

Jak dotąd, nie są znane przypadki złamania AES. Atak

„siłowy”, polegający na sprawdzaniu wszystkich kluczy, jest
przy obecnych mocach obliczeniowych komputerów nieefek-
tywny, a możliwość ataku algebraicznego – dającego szansę
otrzymania rezultatów w rozsądnym czasie – stanowi w tej
chwili zaledwie przedmiot kontrowersji wśród specjalistów.

Zainteresowanym szczegółami polecam stronę domową

projektu Rijndael, a także stronę NIST, poświęconą tematyce
AES.

Rysunek 2.

Schemat działania algorytmu AES

background image

styczeń 2004

32

bezpieczeństwo

Przede wszystkim powinniśmy sprawdzić, czy używane
jądro systemu spełnia wspomniany wcześniej warunek, t.j.
nie posiada statycznie wkompilowanego urządzenia loop.
Jeśli konfigurowaliśmy je i kompilowaliśmy wcześniej,
wystarczy zajrzeć do pliku .config w katalogu ze źródłami.
Standardowe wersje jądra domyślnie nie włączają obsługi
loopback.

Jeżeli używamy jądra z dystrybucyjnego pakietu,

możemy poszukać jego konfiguracji (np. Debian umieszcza
stosowny plik z numerem jądra w katalogu /boot) albo po
prostu spróbować załadować moduł loop i/lub zamontować
obraz dowolnej płyty CD z danymi.

Gdy wykonamy polecenie

grep CONFIG_BLK_DEV_LOOP

/usr/src/linux/.config

, odpowiedź "CONFIG_BLK_DEV_

LOOP is not set " oznacza, że możemy od razu zająć się
utworzeniem nowego modułu.

Gdy w konfiguracji znajdziemy "CONFIG_BLK_DEV_

LOOP=y", to niestety będzie potrzebne nowe jądro syste-
mu. Po wydaniu polecenia

make menuconfig

, w katalogu

zawierającym źródła, w sekcji "Block devices" wyłączamy
opcję "Loopback device support ". W sekcji "Loadable module
support
" zaznaczamy "Enable loadable module support ",
a dla wygody, choć nie jest to konieczne, "Kernel module
loader
" ("CONFIG_KMOD=y").

W przypadku, gdy jądro zostało wyposażone w ładowal-

ny moduł loop ("CONFIG_BLK_DEV_LOOP=m"), a z jakichś
powodów nie chcemy budować nowego jądra, możemy
spróbować obejść kłopot w mało elegancki, lecz skuteczny
sposób. Usuwamy lub kopiujemy w bezpieczne miejsce
istniejący moduł /lib/modules/`uname -r`/kernel/drivers/

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 źró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
dodatkowe silne algorytmy Serpent, Blowfish i Twofish.
Każdy z nich może być używany z kluczem 128-, 192-
i 256-bitowym, a ponadto ostatni występuje również
w postaci Twofish160.

Teraz przystępujemy do przygotowania narzędzi, które

pozwolą nam w pełni korzystać z nowego modułu (lub
modułów). Będziemy potrzebowali zmodyfikowanych pro-
gramów mount, umount i losetup, a także – jeśli planujemy
używać szyfrowanej partycji wymiany – swapon i swapoff.
Odpowiednia łata dołączona jest do archiwum loop-
AES-latest.tar.bz2
. W naszym przypadku jest to plik util-
linux2.12pre.diff
. Przed instalacją warto zadbać o kopie
zapasowe. Możemy również, jeżeli np. zamierzamy ograni-
czyć się jedynie do testów, umieścić zbudowane programy
w innym katalogu. Pamiętajmy jednak, że skrypty startowe
systemu, o ile ich nie zmodyfikujemy, będą korzystały ze
starych wersji. Typową procedurę kompilacji i instalacji
potrzebnych narzędzi przedstawia Listing 1.

Szyfrowanie partycji

Wreszcie nadeszła pora, aby wypróbować przygotowa-
ne oprogramowanie! Na początek przedstawię przykład
najbardziej oczywisty, a przy tym prosty. Wolną partycję
chcemy przeznaczyć na szyfrowane dane. Przyjmuję, że
partycja została już wcześniej założona, np. fdiskiem.

W pierwszym kroku przyłączamy partycję do urzą-

dzenia loop. Za pomocą flagi

-e

określamy szyfr (zamiast

AES256 może to być np. AES128 czy AES192, a jeśli zbu-
dowaliśmy moduły z Ciphers, także np. serpent128 czy
twofish256 ). Nie musimy własnoręcznie ładować modułu
loop, gdyż zadba o to jądro systemu, o ile podczas kon-
figuracji zaznaczyliśmy "CONFIG_KMOD=y ". Natomiast

Rysunek 3.

Strona domowa projektu Loop-AES na serwerze

SourceForge

background image

33

www.linux.com.pl

loop-aes

moduły loop_serpent czy loop_twofish powinniśmy
w razie potrzeby załadować poleceniem

modprobe

lub

insmod

. Flaga

-T

informuje program, że ma dwukrotnie

pytać o hasło. Polecenie wygląda więc tak:

losetup -e AES256 -T /dev/loopX /dev/hdaN

Tu i w dalszej części artykułu X oznacza numer urządzenia
loop, a N – numer partycji. Osoby używające devfs powinny

odpowiednio dostosować polecenia, wpisując

/dev/loop/0

,

/dev/loop/7

itp. Dodajmy, że domyślna liczba urządzeń

loop w systemie wynosi osiem. W razie potrzeby możemy
zwiększyć ją za pomocą mknod nawet do 256.

Program losetup nie pozwoli na użycie hasła krótszego

niż dwadzieścia znaków. To dużo, ale wybierzmy je sta-
rannie, tak aby maksymalnie utrudnić ewentualny atak
słownikowy.

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
dokumentacji). Zwróćmy uwagę, że w tej operacji pośred-
niczy loop, dlatego jako argument polecenia podajemy
/dev/loopX. Jeśli wszystko przebiegło poprawnie, odłącza-
my urządzenie i zakładamy katalog, który posłuży nam do
montowania partycji. Opisane polecenia wyglądają tak:

mkfs -t ext2 /dev/loopX
losetup -d /dev/loopX
mkdir /mnt/crypto

Możemy teraz zamontować partycję:

mount -t ext2 /dev/hdaN /mnt/crypto

S

-o loop=/dev/loopX,encryption=AES256

Zamiast

loop =/dev/loopX

wystarczy podać po prostu

loop

. System sam wybierze wolne urządzenie. Polecenie

mount

bez opcji powinno nam teraz pokazać m.in. coś

takiego:

/dev/hda7 on /mnt/crypto type ext2

S

(rw,loop=/dev/loop0,encryption=AES256)

Jeśli wolimy oszczędzić sobie wpisywania za każdym razem
długiej komendy, powinniśmy dopisać do /etc/fstab:

/dev/hdaN /mnt/crypto ext2 defaults,noauto,

S

loop=/dev/loopX,encryption=AES256 0 0

Listing 1.

Kompilacja i instalacja narzędzi z Util-linux

$ tar jxvf util-linux-2.12pre.tar.bz2
$ cd util-linux-2.12pre
$ patch -p1 <../loop-AES-v1.7e/util-linux-2.12pre.diff
$ CFLAGS=-O2 ./configure
$ make SUBDIRS="lib mount"
$ cd mount
$ strip -s mount umount losetup swapon
$ su
# for prog in `which mount umount losetup swapon

S

swapoff`

> do echo "Tworzę kopię zapasową $prog.sav"
> cp -p $prog $prog.sav
> done
# install -m 4755 -o root mount umount /bin
# install -m 755 losetup swapon /sbin
# rm -f /sbin/swapoff && ( cd /sbin && ln -s

S

swapon swapoff )
# for item in /usr/share/man/man8/{mount,umount,

S

losetup,swapon,swapoff}.8.gz \
> /usr/share/man/man5/fstab.5.gz
> do echo "Tworzę kopię zapasową $item"
> mv $item $item.sav
# install -m 644 mount.8 umount.8 losetup.8 swapon.8 \
> swapoff.8 /usr/share/man/man8
# install -m 644 fstab.5 /usr/share/man/man5
# mandb

Rysunek 4.

Zabezpieczenie dostępu do klucza AES szyfrem niesymetrycznym przy pomocy GnuPG

background image

styczeń 2004

34

bezpieczeństwo

Nie potrzeba niczego więcej. To już działa! Choć tego
w ogóle nie dostrzegamy, pliki zapisane w katalogu /mnt/
crypto
są szyfrowane i po odmontowaniu partycji będą nie-
dostępne dla niepowołanych oczu.

Gdyby zależało nam na wzmocnieniu ochrony party-

cji przed atakiem słownikowym, moglibyśmy dodatkowo
użyć losowo wygenerowanego zarodka hasła oraz podać
liczbę powtórzeń klucza (flagi

-S

i

-C

programu

losetup

).

Zarodek jest dodawany do wpisanego przez administra-
tora hasła, zanim zostanie ono potraktowane nieodwra-
calną funkcją haszującą (f. skrótu), natomiast na skutek
podania po fladze

-C

liczby N, utworzony skrót hasła szy-

frowany jest N tysięcy razy przy użyciu algorytmu AES-
256. Zabiegi te są dość skutecznym sposobem znacznego
spowolnienia ataku.

Losowy zarodek hasła możemy wybrać używając przy-

kładowo takiej kombinacji poleceń:

head -c 15 /dev/urandom | uuencode -m - |

S

awk 'NR == 2 {print}

Powinniśmy otrzymać coś w rodzaju:

8bqMfh75PZnMu+wwjy-

Vq

. Oczywiście za każdym razem ten ciąg będzie inny. Wyj-

ściowe polecenie

losetup

, od którego zaczęliśmy procedurę

szyfrowania partycji, wyglądałoby zatem tak:

losetup -e AES256 -T -S 8bqMfh75PZnMu+wwjyVq

S

-C 100 /dev/loopX /dev/hdaN

a do fstab wpisalibyśmy w takim przypadku:

/dev/hdaN /mnt/crypto ext2 defaults,noauto,

S

loop=/dev/loopX,encryption=AES256,itercountk=100,

S

pseed=8bqMfh75PZnMu+wwjyVq 0 0

Plik jak partycja

Zdarza się, że cały dysk jest już podzielony na sforma-
towane partycje, z których korzystamy, a wygospodaro-
wanie wolnej części wymagałoby dużo starań. W takim
przypadku nic nie stoi na przeszkodzie, abyśmy utworzy-
li zaszyfrowaną strukturę katalogów w zwykłym pliku,
który jak wiadomo, w Linuksie może „udawać” urządze-
nie blokowe, takie jak partycja na dysku twardym. Roz-
wiązanie to ma i tę dobrą stronę, że plik można w razie
potrzeby przenieść w inne miejsce na dysku albo nagrać
na płytę CD.

Tworzymy zatem plik o wielkości np. 700 MB,

a następnie poleceniem

losetup

podłączamy go do urzą-

dzenia loop - dzięki czemu będzie on traktowany jak
partycja – i wybieramy hasło. W dalszej kolejności forma-
tujemy go, tworząc strukturę systemu plików ext2. Jako
źródło, z którego czyta program

dd

, moglibyśmy wykorzy-

stać /dev/zero, ale lepiej użyć /dev/urandom

dd

zapisze

wtedy cały plik losowo wybranymi znakami, co spowo-
duje, że podglądając plik, nie będzie można zorientować
się, w którym miejscu zaczynają się i kończą zaszyfrowane
dane. Ostatecznie wygląda to tak:

dd if=/dev/urandom of=/jakis_katalog/crypto_file bs=4k

S

count=179200
losetup -e AES256 -T /dev/loopX /jakis_katalog/crypto_file
mkfs -t ext2 /dev/loopX

Oczywiście i tu znalazłyby zastosowanie flagi

-S

i

-C

pro-

gramu

losetup

(zarodek hasła i liczba iteracji). Pominąłem

je, aby nie komplikować przykładów.

Na koniec zakładamy katalog, którego będziemy

używać podczas montowania i ewentualnie dodajemy do
/etc/fstab odpowiedni wpis:

/jakis_katalog/crypto_file /mnt/crypto ext2 defaults,

S

noauto,loop,encryption=AES256 0 0

Jeśli chcemy umożliwić zwykłym użytkownikom (znającym
hasło) montowanie szyfrowanego systemu plików, dopisu-
jemy ponadto do opcji montowania

user

. To samo dotyczy

poprzedniego przypadku szyfrowanej partycji.

Z kluczem GnuPG na dyskietce

Dostęp do szyfrowanego systemu plików możemy zabez-
pieczyć dodatkowo kluczem GnuPG. Ideę tę przedstawia
poglądowo Rysunek 4. Nie ma większego znaczenia, czy

Listing 2.

Przykładowy plik /etc/fstab z wpisami

dotyczącymi montowania szyfrowanych systemów plików

# /etc/fstab: statyczna informacja o systemach plików.
# <system plikow><punkt montowania><typ><opcje> <dump>

<pass>

/dev/hda2 / ext3 errors=remount-ro 0 1
# szyfrowany swap
/dev/hda5 none swap sw,

S

loop=/dev/loop0,encryption=AES256 0 0
proc /proc proc defaults 0 0
tmpfs /dev/shm tmpfs defaults 0 0
/dev/hda6 /usr ext3 defaults 0 0
/dev/hda7 /home reiserfs defaults 0 0
/dev/hda8 /scratch reiserfs defaults 0 0
/dev/fd0 /floppy auto user,noauto 0 0
/dev/cdrom /cdrom iso9660 ro,user,exec,noauto,

S

iocharset=iso8859-2 0 0
/dev/scd1/mnt/cdrw iso9660 ro,user,noauto,

S

iocharset=iso8859-2 0 0
# szyfrowane urządzenia
/dev/hda4 /mnt/crypto1 ext2 defaults,noauto,

S

loop=/dev/loop1,encryption=AES256,

S

gpgkey=/floppy/moj_klucz.gpg,gpghome=/floppy 0 0
/dev/hda9 /mnt/crypto2 ext2 defaults,user,

S

noauto,encryption=AES256,loop=/dev/loop2,

S

gpgkey=/etc/kluczepub-crypto.gpg 0 0
/home/self/crypto_fs /mnt/crypto3 ext2 defaults,

S

noauto,user,loop,encryption=AES256 0 0

background image

35

www.linux.com.pl

loop-aes

system plików zostanie utworzony według przedstawio-
nej przed chwilą recepty w dużym pliku, czy na fizycznej
partycji.

Powinniśmy posłużyć się dyskietką z systemem plików

pozwalającym ustalać prawa dostępu, np. ext2. Jeżeli użyje-
my dyskietki „dosowej”,

gpg

będzie zgłaszał błąd.

Zaczynamy od zamontowania dyskietki i generujemy

parę kluczy GnuPG, chyba że skorzystamy z już posiada-
nych:

mount /dev/fd0 /floppy
gpg --gen-key --homedir /floppy

Połączenie komend

head

,

uuencode

i

awk

pozwoli utworzyć

odpowiednio długi, losowy ciąg znaków, który posłuży
do szyfrowania systemu plików. Otrzymane w ten sposób
hasło zabezpieczamy szyfrem niesymetrycznym przy
pomocy

gpg

i zapisujemy na dyskietce:

head -c 45 /dev/random | uuencode -m - | awk 'NR == 2

S

{print}' | \
gpg --homedir /floppy -e -a -r "Imię Nazwisko" >

S

/floppy/moj_klucz.gpg

Do /etc/fstab dopisujemy poniższy wiersz:

/

dev/hdaN /mnt/crypto1 ext2 defaults,noauto,

S

loop=/dev/loopX,encryption=AES256,

S

gpgkey=/floppy/moj_klucz.gpg,gpghome=/floppy 0 0

W przypadku szyfrowania pliku, a nie partycji, pierwszy
człon należy zastąpić jego nazwą. Kolejne polecenia są
następujące:

losetup -F /dev/loopX
mkfs -t ext2 /dev/loopX
losetup -d /dev/loopX

Flaga

-F

powoduje, że losetup pobiera opcje z /etc/fstab.

Drugą komendą formatujemy urządzenie i po poprawnym
zakończeniu tej operacji, resetujemy je.

O ile tylko istnieje docelowy katalog, możemy już

zamontować system plików poleceniem

mount /mnt/crypto

.

Oczywiście, każda kolejna próba musi być poprzedzona
umieszczeniem dyskietki w napędzie i jej poprawnym
zamontowaniem. Należy jej strzec, gdyż zgubienie albo
zniszczenie kluczy uniemożliwi raz na zawsze dostęp do
zaszyfrowanych plików. Z tego względu rozsądniejsze jest
skopiowanie niezbędnych plików na trwalszy niż dyskietka
nośnik i odpowiednia modyfikacja ścieżek dostępu w /etc/
fstab
.

Wielu użytkowników, wiele kluczy

GnuPG

Teraz zajmiemy się bardziej skomplikowanym rozwiąza-
niem. Przygotujemy szyfrowaną partycję (lub plik pełniący

funkcję urządzenia blokowego), do której użytkownicy
wskazani przez administratora otrzymają dostęp na pod-
stawie pary kluczy GnuPG. Każdy z nich będzie korzystał
z własnych kluczy i, co za tym idzie, własnego hasła.

Administrator (root) musi mieć wygenerowaną parę

kluczy GnuPG i dysponować kluczami publicznymi użyt-
kowników, którym chce przekazać prawo montowania.
Sprawdzamy to komendą

gpg –list-public-keys

. Jeśli na

liście brak jest którejś z tych osób, pomocne będzie pole-
cenie

gpg --import plik_z_kluczem

. Prawa odczytu two-

rzonych plików najlepiej ograniczyć zmieniając domyślne
ustawienia powłoki poleceniem

umask 077

. Kolejne polece-

nia wyglądają następująco:

head -c 45 /dev/random | uuencode -m - | awk 'NR == 2

S

{print}' | gpg -e -a -r "Charlie Root" >

S

/root/masterkey-crypto.gpg
losetup -e AES256 -K /root/masterkey-crypto.gpg

S

/dev/loopX /dev/hdaN
mkfs -t ext2 /dev/loopX
losetup -d /dev/loopX

Co zrobiliśmy? Czytelnik zapewne domyśla się, że pierwsza
linia ma na celu otrzymanie losowego ciągu znaków oraz
zaszyfrowanie go przy pomocy klucza GnuPG należącego
do administratora. Wynik zapisywany jest w pliku /root/
masterkey-crypto.gpg
. Następnie przyłączamy partycję do
urządzenia /dev/loopX. Wybieramy przy tym algorytm szy-
frowania AES256, a flaga

-K

powoduje, że hasło pobierane

z pliku masterkey-crypto.gpg jest przekazywane do progra-
mu gpg w celu odszyfrowania przed użyciem. Formatujemy
partycję i odłączamy ją od urządzenia loopX.

Przechodzimy do /etc/fstab, dopisując:

/dev/hdaN /mnt/crypto2 ext2 defaults,user,noauto,

S

encryption=AES256,loop=/dev/loopX,

S

gpgkey=/etc/userkey-crypto.gpg 0 0

Na koniec deszyfrujemy hasło i szyfrujemy ponownie, tym
razem używając kluczy publicznych wybranych użytkow-
ników, a rezultat kierujemy do wymienionego w /etc/fstab
pliku userkey-crypto.gpg. Każde z nazwisk podajemy
w cudzysłowach następujących po fladze

-r

.

Dane te muszą zgadzać się z opisem kluczy. Wygląda

to tak:

gpg --decrypt < /root/masterkey-crypto.gpg |

S

gpg -e -a –always-trust -r "Charlie Root"

S

-r "Jas Kowalski" -r "Joanna Malinowska" >

S

/etc/userkey-crypto.gpg

Od tej chwili każdy z użytkowników wskazanych przez
administratora może montować partycję hdaN korzystając
z własnego klucza prywatnego i hasła GnuPG.

Aby zwiększyć bezpieczeństwo, należałoby jeszcze

skłonić użytkowników, aby nie przechowywali klucza pry-

background image

styczeń 2004

36

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-

szące się do partycji wymiany w /etc/fstab:

/dev/hdaN none swap sw,loop=/dev/loopX,encryption=AES128 0 0

Ten prosty zabieg pozwala nam ponownie uaktywnić swap.
Robimy to poleceniem

swapon -a

, które przywracając jego

działanie użyje losowego klucza i wykona komendę

mkswap

na wskazanym urządzeniu loop.

Jeżeli podczas ponownego uruchomienia systemu poja-

wią się komunikaty o błędzie podobne do poniższego:

insmod: modprobe: cannot create /var/log/ksymoops/
20031012.log Read-only file system
insmod: /lib/modules/2.4.22-grsec/block/loop.o: cannot
create /var/log/ksymoops/20031012.log Read-only file system

to dzieje się tak dlatego, że system aktywujący partycję
wymiany jednocześnie ładuje moduł loop, a modprobe
próbuje zapisać informację o tym w logach, choć partycja,
na której się znajdują, nie została jeszcze zamontowana do
zapisu.

Autor dokumentacji modułu Loop-AES proponuje w celu

pozbycia się tego błędu usunąć katalog /var/log/ksymoops.
Bez tego katalogu modprobe nie podejmie próby logowania
komunikatu o ładowaniu modułu. Bardziej elegancki, choć
zapewne trudniejszy w realizacji, wydaje się pomysł mody-
fikacji skryptów startowych w taki sposób, aby partycja
wymiany była aktywowana nieco później, gdy możliwe już
będzie zapisywanie logów.

Istniejąca partycja z danymi

Niewykluczone, że w praktyce natkniemy się na dość
prozaiczny kłopot: planujemy zaszyfrować partycję,

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
reorganizacja dysku nie wchodzi w grę, a z jakichś
powodów nie chcemy jej zastępować dużym plikiem,
z pomocą przyjdzie nam program Aespipe, stanowiący
niewielki, lecz użyteczny dodatek do Loop-AES (do jego
kompilacji wystarczy triada poleceń

./configure ; make ;

make install

). Jak podpowiada nazwa, Aespipe potrafi

szyfrować dane pobierane na wejściu. Pomysł jego wyko-
rzystania w tym przypadku polega na odczytaniu zawar-
tości partycji za pomocą dd, zaszyfrowaniu "w locie" (to
właśnie rola Aespipe) i zapisaniu w tym samym miejscu
dysku.

Operacja jest nieco ryzykowna, więc lepiej zawczasu

przygotować kopię zapasową całej partycji.

Zaczynamy od jej odmontowania. W kolejnym kroku

wpisujemy poniższe polecenie:

dd if=/dev/hdaN bs=64k | aespipe -e AES256 -T |

S

dd of=/dev/hdaN bs=64k conv=notrunc

Jak widać, dd odczytuje partycję i przekazuje wyjście
do aespipe, którego zadaniem jest zaszyfrowanie tego,
co otrzyma przy użyciu wybranego algorytmu. Wynik
z kolei wędruje do ponownie uruchomionego dd w celu
zapisania na urządzeniu, tym razem już w postaci zaszy-
frowanej. Podobnie jak we wcześniejszych przykładach
dotyczących losetup, flaga

-e

pozwala nam wybrać algo-

rytm szyfrujący, a

-T

powoduje, że Aespipe rozpoczynając

działanie zapyta dwukrotnie o hasło, którego chcemy
użyć.

Rysunek 5.

Szyfrowanie istniejącej partycji, na której

przechowujemy już dane

background image

37

www.linux.com.pl

loop-aes

Wariant dla ambitnych polega na wzmocnieniu zabez-

pieczeń przez użycie zarodka hasła i iterowanym szyfro-
waniu skrótu hasła. Wymaga on zastosowania znanych już
z programu losetup opcji

-S

(dodanie wygenerowanego

zawczasu zarodka do hasła) oraz

-C

(liczba wskazująca, ile

tysięcy razy szyfrowany jest skrót hasła). Ciąg otrzymany
z polecenia (tu:

qwSIxpGIi6pZNAvj0e7w

):

head -c 15 /dev/urandom | uuencode -m - | awk 'NR == 2

S

{print}'

zostanie użyty w kolejnym kroku jako zarodek hasła:

dd if=/dev/hdaN bs=64k | aespipe -e AES256 -T

S

-S qwSIxpGIi6pZNAvj0e7w -C 100 | dd of=/dev/hda2

S

bs=64k conv=notrunc

Po zakończeniu operacji edytujemy opcje montowa-
nia w /etc/fstab, dodając do linii dotyczącej tej partycji:

noauto,loop=/dev/loopX,encryption=AES256

i ewentualnie

itercountk=100,pseed=qwSIxpGIi6pZNAvj0e7w

, o ile użyli-

śmy drugiego wariantu.

Można również wspomnieć o innym ciekawym zastoso-

waniu Aespipe, mianowicie szyfrowaniu płyt CD, a ściślej,
obrazów przygotowanych za pomocą Mkisofs. Tworzymy je
poleceniem:

mkisofs -V TAJNE -J -r nazwa_katalogu | aespipe

S

-e AES256 -T > image.raw

Po nagraniu można zamontować krążek w taki sposób:

mount -t iso9660 /dev/cdrom /cdrom

S

-o loop=/dev/loopX,encryption=AES256

Rzecz jasna, dostęp do niego będziemy mieli tylko po
podaniu hasła i wyłącznie w systemach wyposażonych
w moduł loop-AES.

Wydajność

Na koniec załączę kilka słów na temat wydajności. Nie-
wątpliwie, dodatkowe obciążenie komputera operacjami
szyfrowania danych „w locie” w mniejszym lub większym
stopniu musi wpłynąć na działanie systemu. Trzeba
jednak przyznać, że zarówno trafnie wybrany przez
autora projektu algorytm szyfrowania, jak i wykorzysta-
nie urządzenia loop, dość skutecznie minimalizują narzut
czasowy.

Ponadto, jeśli zachowamy umiar, wpływ ten może

pozostać niemal niezauważalny. Potwierdzają to doświad-
czenia autora. Próby przeprowadzane na maszynach
z jednym procesorem Pentium 1 GHz lub Athlon 1700
MHz oraz 512 MB RAM, czyli dość typowych, przy jed-
noczesnym wykorzystaniu dwóch szyfrowanych partycji
i jednego szyfrowanego pliku o wielkości 1 GB, prowadzą
do wniosku, że komfort pracy nie zmniejsza się w istotny

sposób (oczywiście, to tylko subiektywna ocena). Jak się
wydaje, najbardziej optymalne z punktu widzenia wydaj-
ności jest szyfrowanie fizycznej partycji dysku.

W przypadku komputerów starych i powolnych albo

bardzo przeciążonych pozostaje rozważyć użycie opcji

lo_nice

i

lo_prealloc

.

Pierwsza z nich, o domyślnej wartości -20, pozwa-

la modyfikować priorytet zadań. Można ją zmniejszyć
w /etc/modules.conf (np.

options loop lo_nice =-5

).

Druga opcja odpowiada za liczbę 4-kilobajtowych

stron pamięci operacyjnej przeznaczanych dla urządzeń
/dev/loopX w chwili montowania. Domyślna wartość
wynosi 125. Możemy ją zwiększyć lub zmniejszyć glo-
balnie, dopisując do /etc/modules.conf np.

options loop

lo_prealloc=200

. Możemy również zróżnicować wielkość

RAM-u prealokowaną przez poszczególne urządzenia:

options loop lo_prealloc=100,3,200,4,250.

Pierwsza liczba oznacza zmniejszoną wartość domyśl-
ną, następne pary liczb nadpisują ją, przeznaczając dla
loop3 200 stron pamięci, a dla loop4 250 (składnia dopusz-
cza co najwyżej cztery takie pary).

Uwagi końcowe

Starałem się przedstawić zalety omawianych narzędzi
możliwie wszechstronnie. Nie zamykam przy tym oczu na
wady loop-AES. Zalicza się do nich zwłaszcza uciążliwość
dodatkowych zabiegów związanych z kompilacją i instala-
cją niezbędnych binariów, co gorsza, pociągająca za sobą
ingerencję w integralność systemu pakietowego. Sądzę
jednak, że korzyści warte są podejmowania tego wysiłku.
Jeśli Czytelnik nie czuje się w pełni przekonany o pożyt-
kach płynących ze stosowania zaawansowanej krypto-
grafii, być może samodzielne próby, do których gorąco
zachęcam, staną się czynnikiem przesądzającym.

W Sieci:

• Strona projektu loop-AES:

http://loop-aes.sourceforge.net/projects/loop-aes/

• Strona domowa projektu Rijndael:

http://www.esat.kuleuven.ac.be/~rijmen/rijndael/

• Strona NIST poświęcona AES:

http://csrc.nist.gov/CryptoToolkit/aes/rijndael/

• Strona entuzjastów algorytmu Rijndael:

http://rijndael.com/

• Źródła modułu Loop-AES:

http://loop-aes.sourceforge.net/loop-AES-latest.tar.bz2

• Źródła dodatkowych modułów:

http://loop-aes.sourceforge.net/ciphers-latest.tar.bz2

• Źródła Aespipe:

http://loop-aes.sourceforge.net/aespipe-latest.tar.bz2

• Źródła Util-linux:

ftp://ftp.kernel.org/pub/linux/utils/util-linux/util-linux-

2.12pre.tar.bz2


Wyszukiwarka

Podobne podstrony:
01 system plikow
SO8 Systemy plików
System plików to sposób organizacji danych na dyskach, Notatki z systemów
System plików, zOthers, Systemy operacyjne i sieci komputerowe
Systemy plików
2004 01 Praca z OpenSSH [Administracja]
2004 01 Trzykanalowy mikser ze wzmacniaczem
07 Linux System plików
m System plików FAT
Matematyka dyskretna 2004 01 Podstawowe pojęcia, oznaczenia
Ustawa o zmianie o systemie zgodności, BEZPIECZEŃSTWO I HIGIENA PRACY, BHP podstawy prawne
tabicowanie funkcji, 2004-01-05
Systemy Plików Na Dyskach Twardych i Nośnikach Wymiennych, Systemy plików
Sytemy zapewnienia jakości`, Systemy Zapewnienia Jakości, Systemy Zapewnienia Bezpieczeństwa Zdrowot
lokalne systemy plikow linuksa QDYSJ7S6JPJKZ7LSEYXKC5472KXDIE2DSESRAPA

więcej podobnych podstron