.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,., Kryptograficzny System Plikow w systemie Linux 2.2.X Robert Jaroszuk , 2001 ,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,. 0x01. Wstęp ~~~~~~~~~~~ Zapewne każdy z nas posiada jakieś dane, których wydostanie się na zewnątrz, lub modyfikacja przez osoby trzecie, może stanowić zagrożenie, czy to dla bezpieczeństwa systemu, czy też dla działalności firmy. Uzyskanie przez konkurencję listy kontrahentów, czy też opracowanych w naszej firmie technologii, to zapewne jeden z gorszych scenariuszy, jakie mogłyby nas spotkać... Obowiązkiem osoby opiekującej się systemem informatycznym jest zapewnienie takim danym bezpieczeństwa, ale bez zbędnego utrudniania pracownikom dostępu do nich. Technologia do tego zastosowana powinna być wydajna, nie może więc powodować nadmiernego (i szkodliwego na dłuższą metę) zmuszania pracowników do pamiętania haseł, kluczy czy innych podobnych rzeczy. Użytkownicy stają się po jakimś czasie niedbali i przyklejają hasła na monitorach, albo stosują takie same hasła w różnych systemach. Ktoś może się zastanawiać, po co szyfrować pliki w Unixie, skoro system wyposażony jest w mechanizmy ochrony za pomocą haseł, czy też uprawnienia do plików. Odpowiedź brzmi: root. Osoba posiadająca uprawnienia superużytkownika może obejść wszystkie zabezpieczenia wbudowane w system - nie odczyta jednak danych zabezpieczonych skomplikowanym algorytmem kryptograficznym. 0x02. Informacje ogólne ~~~~~~~~~~~~~~~~~~~~~~~ Kryptograficzny system plików (CryptoFS, CFS) jest to bardzo wygodna i łatwa w stosowaniu metoda zabezpieczania kluczowych danych. Umożliwia niezależne od aplikacji szyfrowanie/deszyfrowanie danych na poziomie systemu plików. Bez ingerencji w kod źródłowy programu, ani w obsługę systemu plików. Jedyna modyfikacja jakiej musimy dokonać polega na dodaniu do jądra algorytmów kryptograficznych (Crypto API), ale o tym za chwilę. Generalnie CFS można stosować na kilka sposobów: * utworzyć plik, który będzie służył jako system plików, * utworzyć kryptograficzny system plików na wybranej partycji, * utworzyć kryptograficzny system plików na dyskietce, napędzie taśmowym, itp. Wracając do Crypto API - umożliwia ono szyfrowanie danych z poziomu jądra systemu. Dlaczego jest to lepsze rozwiązanie niż na przykład szyfrowanie plików programem PGP? Przede wszystkim dlatego, że jest znacznie prostsze w użyciu i jest znacznie szybsze (funkcje wywoływane z kernela mają wyższy priorytet niż programy odpalane z powłoki). Opisany w tym artykule kryptograficzny system plików opiera się na algorytmach z kluczem prywatnym. Charakteryzują się one wykorzystywaniem tego samego klucza do szyfrowania i deszyfrowania informacji. Znane są one także jako algorytmy z kluczem symetrycznym. Zalecanymi obecnie do stosowania algorytmami z kluczem symetrycznym są algorytmy AES (Advanced Encryption Standard). Jest to nowy standard algorytmów kryptograficznych, stosowany przez rząd USA. Ma on służyć do ochrony szczególnie ważnych danych. Standard ten powstał w oparciu o algorytm Rijndael opracowany przez dwóch Belgów - Joana Daemona i Vincenta Rijmena - w roku 1997. 2 października 2000 roku został zaakceptowany jako AES. Do algorytmów spełniających kryteria standardu AES zaliczają się: AES/Rijndael, Twofish, MARS, RC6 oraz Serpent. Dla dociekliwych polecam stronę http://www.nist.gov/aes. Można na niej znaleźć specyfikacje wielu algorytmów, ich historię, oraz wiele innych ciekawych rzeczy. 0x03. Przygotowanie jądra systemu ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Pierwszą czynnością jaką powinniśmy zrobić, jest przygotowanie jądra systemu do obsługi algorytmów kryptograficznych. Pamiętaj, aby wykonać kopię zapasową! (najlepiej cały katalog /boot i /lib/modules, oraz plik /etc/lilo.conf). Źródła kernela dostępne są pod adresami podanymi w linkach. Następnie, gdy mamy już źródła kernela, należy rozpakować je (tar -zxvf) do katalogu (/usr/src/linux), w którym odbędzie się proces kompilacji. Gdy mamy już rozpakowany kernel, sciągamy patch "kerneli" - ponieważ serwer http://www.kerneli.org od jakiegoś czasu jest niedostępny, proponuję skorzystać z alternatywnego serwisu - http://www.lids.org (a właściwie: http://root-it.be/community/lids). Są tam dostępne rożne ciekawe kombinacje łat na kernel. Myślę że warto się z nimi zapoznać. Gdy już mamy źródła kernela i potrzebną łatę, przystepujemy do łatania kernela. W tym celu rozpakowujemy plik, i wydajemy polecenie: path -p0 < . # patch -p0 < linux-2.2.19-ow1-lids0.10.1-int1-stealth.patch patching file linux/Documentation/Configure.help patching file linux/Documentation/crypto/00-INDEX patching file linux/Documentation/crypto/ChangeLog . . . patching file linux/net/x25/af_x25.c patching file linux/security/Common.in patching file linux/security/Config.in # Teraz możemy przejść do konfiguracji kernela (make menuconfig). Widzimy, że pojawiło się nowe menu - Crypto options. Wchodzimy w nie i zaznaczamy opcje: <*> Crypto support <*> Crypto ciphers Następnie zaznaczamy algorytmy, z których będziemy korzystać. Teraz przechdzimy do menu 'Block devices' i zaznaczamy '<*> Loopback device support'. To wszystko co nam potrzebne. Zapisujemy konfigurację i przechodzimy do kompilacji. W tym celu wydajemy polecenie: # make dep && make bzImage && make modules Jeżeli nie było po drodze żadnych komunikatów o błędach, możemy przejść do instalacji nowego kernela. # make modules_install && make install Zostaniemy tutaj zapytani, czy mamy zamiar zapisać nowy kernel w boot sektorze (oczywiście potwierdzamy). * Proponuję w tym miejscu dodać odpowiedni wpis w /etc/lilo.conf, aby w razie niepowodzenia ze startem nowego kernela, można było uruchomić stary. Odpowiednie linki powinny zostać w tym celu stworzone w /boot. Teraz restartujemy komputer. Podczas uruchamiania powinniśmy zobaczyć komunikaty informujące o aktywowaniu cryptoapi: . . . cryptoapi: Registered blowfish (4) cryptoapi: Registered blowfish-cbc (65540) cryptoapi: Registered idea (6) cryptoapi: Registered idea-cbc (65542) cryptoapi: Registered des_ede3 (12) cryptoapi: Registered des_ede3-cbc (65548) . . . Jeżeli wszystko przebiegło pomyślnie, przechodzimy do tworzenia nowego systemu plików. 0x04. Kryptograficzny System Plików ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Teraz najważniejszy punkt całej zabawy. Po pierwsze, musimy stworzyć nową partycję (lub plik, który posłuży nam jako osobny system plików). Najprościej - przy użyciu dd. a) W przypadku osobnej partycji: # dd if=/dev/zero of=/dev/hdd1 bs=1k Lub w przypadku regularnego pliku, który posłuży nam jako system plików: # dd if=/dev/zero of=~/cryptofs count=100000 gdzie: of=/dev/hdd1 jest to nasza partycja (lub plik), bs=1k - czytamy i zapisujemy 1kB blokami count - ile blokow o rozmiarze zdefiniowanym w bs (1kB blok x 100000 = 100 MB) Następnie ustawiamy loop device, żeby korzystał z określonego algorytmu kryptograficznego (na przykład serpent). b) Ustawiamy loop device, żeby korzystał z określonego algorytmu kryptograficznego (musi być wkompilowany w kernel, lub jako moduł - patrz punkt 0x02) i wiążemy go z partycją / systemem plików który stworzyliśmy w punkcie a. # losetup -e serpent /dev/loop0 /dev/hdd1 lub # losetup -e serpent /dev/loop0 ~/cryptofs Zostaniemy zapytani o długość klucza i o hasło (wpisujemy je dwukrotnie). c) Definiujemy, jaki to będzie system plików (np. ext2). # mkfs -t ext2 /dev/loop0 d) Teraz możemy podmontować nową partycję: # mkdir /cryptofs # mount -t ext2 /dev/loop0 /cryptofs W tym miejscu proponuję sprawdzić czy kryptograficzny system plików działa. Wystarczy zapisać coś w katalogu /cryptofs, a następnie odmontować go. e) # cp /etc/issue /cryptofs # umount /dev/loop0 # losetup -d /dev/loop0 Teraz powtórz punkty b) i d) i sprawdź, czy zapisane przed chwilą dane nadal się znajdują na partycji :-) Pamiętaj, żeby wpisać _to_samo_hasło_ które wpisałeś w punkcie (b). 0x05. Ewentualne problemy ~~~~~~~~~~~~~~~~~~~~~~~~~ Mogą je mieć użytkownicy dystrybucji Slackware, a to za sprawą zbyt starego program losetup, który nie potrafi obsługiwać nowszych algorytmów kryptograficznych. Należy zainstalować nowszą wersję programu losetup (pakiet linux-utils). 0x06. Uwagi ~~~~~~~~~~~ Warto także zapoznać się z dostępnymi algorytmami kryptograficznymi. (patrz linki). Jeśli nie mamy zbyt wiele czasu, albo nie lubimy przebijać się przez sterty materiałów, zalecam przeczytanie helpów dostępnych podczas konfiguracji kernela. Może nie wszystkie dostępne algorytmy są opisane, ale część tak. 0x07. Zakończenie ~~~~~~~~~~~~~~~~~ Stosowanie kryptograficznych systemów plików na pewno zwiększa poziom bezpieczeństwa naszych danych. W połączeniu z dobrą polityką bezpieczeństwa systemu może stanowić potężną barierę dla potencjalnego intruza. Na nic mu się zdadzą nasze dane, jeśli będą w postaci zaszyfrowanej. Podobnie ma się sytuacja w przypadku kradzieży komputerów z firmy - możemy spać spokojnie i nie martwić się o nic (chyba że nie mieliśmy kopii zapasowej). 0x08. Źródła i pomocne materiały ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Źródła kernela: ftp://ftp.kernel.org/pub/linux/kernel/v2.2 ftp://ftp.icm.edu.pl/pub/linux/kernel/v2.2 ftp://ftp.task.gda.pl/pub/linux/kernel/v2.2 ftp://ftp.man.szczecin.pl/pub2/kernel/v2.2 ftp://ftp.cyf-kr.edu.pl/pub/linux/kernel/v2.2 CryptoAPI: http://www.lids.org ftp://ftp.kernel.org/pub/linux/kernel/crypto Kompilacja kernela: http://www.linuxindex.pl/podstawy/kernel Kryptografia: http://theory.lcs.mit.edu/~rivest/crypto-security.html http://www.rsa.com/rsalabs/faq/ http://www.faqs.org/faqs/cryptography-faq http://the.wiretapped.net/security/cryptography http://munitions.vipul.net/dolphin.cgi?action=render&category=0503 /usr/src/linux/Documentation/crypto AES: http://csrc.nist.gov/encryption/aes/round2/aesfact.html http://www.nist.gov/aes KONIEC. .,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,