W chwili obecnej większość dystrybucji Linux-a nie instaluje domyślnie pakietu
Shadow Suite. Dotyczy to Slackware 2.3, Slackware 3.0 i innych
popularnych dystrybucji. Jednym z powodów tego jest to, że jeśli zapłacono
jakąś kwotę za Shadow Suite to prawa co do redystrybucji nie były
do końca jasne. Linux używa licencji GNU, która pozwala na umieszczanie go
w dowolnych pakietach (jak np. dystrybucje CD-ROM) i pobieranie za nie opłaty.
Obecny opiekun pakietu Shadow Suite,
Marek Michałkiewicz otrzymał
źródła oryginału na licencji w stylu BSD, która pozwala na dystrybucję.
Teraz, kiedy już sprawy praw kopiowania są rozwiązane, spodziewane jest, że
przyszłe dystrybucje będą zawierać domyślnie przesłanianie haseł. Jednak do
tego czasu, będziesz musiał je samemu instalować.
Jeśli instalowałeś swoją dystrybucję z CD-ROM-u, to pomimo, że dystrybucja
nie zainstalowała Shadow Suite niektóre pliki, których potrzebujesz
mogą się znajdować na CD-ROM-ie.
Wersje pakietu 3.3.1, 3.3.1-2 i shadow-mk mają problemy dotyczące bezpieczeństwa ze swoim programem login i kilkoma innymi programami typu suid root i nie powinny być już używane.
Wszystkie potrzebne pliki są dostępne poprzez anonimowane ftp oraz WWW.
W Linux-ie bez zainstalowanego pakietu Shadow Suite informacje
o użytkowniku wraz z hasłem trzymane są w pliku /etc/passwd.
Hasło znajduje się tam w formie zakodowanej (encrypted). Jednak jeśli
spytasz jakiegoś eksperta od kryptografii, to powie ci on/ona, że
hasło jest w postaci "encoded", a nie "encrypted" ponieważ używając
funkcji crypt(3), tekstowi jest przypisywany łańcuch pusty a hasło
jest kluczem. Dlatego, od tego momentu będę używał określenia "encoded".
Algorytm używany do kodowania hasła jest technicznie określany jako algorytm działający w jedną stronę. Jest to algorytm, który jest łatwy do zastosowania w jedną stronę, ale bardzo trudny do złamania. Więcej na ten temat znajdziesz w sekcji 2.4 albo na stronie podręcznika systemowego dotyczącej funkcji crypt(3).
Kiedy użytkownik wybiera hasło, albo jest mu ono przydzielone, jest ono
kodowane losowo generowaną wartością zwaną salt (sól). Oznacza to,
że każde hasło może zostać zakodowane na 4096 sposobów. Wartość salt
jest potem zapisywana razem z zakodowanym hasłem.
Kiedy użytkownik się wlogowuje i podaje hasło, najpierw pobierana
jest wartość salt z zakodowanego hasła. Następnie pobrane
hasło zostaje zakodowane pobraną wartością, i porównane z zapisanym
zakodowanym hasłem. Jeśli łańcuchy te są identyczne, to użytkownik
zostaje "wpuszczony" do systemu. Jest bardzo trudno (ale nie jest
to niemożliwe) wziąć losowo zakodowane hasło i otrzymać hasło
rozkodowane. Chociaż, w każdym systemie z większą liczbą
użytkowników, przynajmniej kilka haseł będzie zwykłymi słowami albo
jakąś wariacją zwykłych słów.
Włamywacze więdzą o tym wszystkim i po prostu kodują słownik ze
słowami i popularnymi hasłami wszytkimi możliwymi wartościami
salt. Potem porównają wyniki z zawartością twojego pliku
/etc/passwd. Jak znajdą jakiś identyczny łańcuch, to mają
hasło na następne konto. Nazywane jest to atakiem
słownikowym i jest to jeden z najpopularniejszych sposobów na
pozyskiwanie dostępu do systemu przez osoby nieuprawnione.
Jeśli się nad tym zastanowisz, to zobaczysz, że 8-znakowe hasło może zostać zakodowane na 4096 * 13 sposobów. Tak więc słownik składający się powiedzmy z 400.000 popularnych słów, nazw, imion, haseł i ich prostych wariacji zmieściłby się z łatwością na dysku o pojemności 4GB. Włamywacz musi go tylko posortować i sprawdzić czy któryś z łańcuchów nie jest hasłem. Dysk o pojemności 4GB można kupić za ok. 1000 dolarów, tak więc mieści się to w możliwościach większości włamywaczy systemowych.
Jeśli włamywacz zdobędzie twój plik /etc/passwd, to musi
on zakodować swój słownik kluczem, który znajduje się w tym
pliku. Metoda ta może być wykorzystana przez przeciętnego
nastolatka z kilkoma megabajtami na dysku i komputerem klasy 486.
Nawet bez dużej ilości wolnego miejsca na dysku, narzędzia takie jak crack(1) mogą zwykle złamać przynajmniej kilka haseł z systemu z dostatecznie dużą ilością użytkowników (zakładając, że użytkownicy mają możliwość samemu wybierać sobie hasła).
Plik /etc/passwd zawiera także takie informacje jak ID
użytkownika i ID grupy, które są używane przez większość
programów. Dlatego plik /etc/passwd musi
pozostać odczytywalny dla każdego. Jeśli chciałeś właśnie zmienić
prawa dostępu do pliku /etc/passwd tak, żeby nikt nie mógł
go czytać (oprócz "root-a"), to pierwszym symptomem jaki byś
zauważył, to to, że przy wydaniu polecenia ls -l
pojawiłyby się numery zamiast nazw użytkowników.
Pakiet Shadow Suite rozwiązuje ten problem poprzez
umieszczenie haseł w innym pliku (z reguły jest to
/etc/shadow). Plik /etc/shadow ma tak ustawione
prawa dostępu, że nie może go czytać nikt, oprócz
"root-a". Niektóre programy jak np. xlock, nie muszą mieć
możliwości zmiany haseł, ale tylko ich odczytu. Programy te mogą
albo być uruchamiane z prawem "suid root", albo możesz dodać grupę
shadow, która miałaby tylko prawo odczytu pliku
/etc/shadow. Program ten może wtedy należeć do grupy
"shadow" i być uruchamiany z prawem "sgid".
Przenosząc zakodowane hasła do innego pliku, efektywnie zabraniamy włamywaczom dostępu do nich, co uniemożliwia ataki słownikowe.
Dodatkowo pakiet Shadow Suite posiada wiele innych zalet:
/etc/login.defs)Instalacja pakietu Shadow Suite przyczynia się do
zwiększenia bezpieczeństwa sieci opartej na Linux-ie, ale pozostaje
jeszcze wiele innych rzeczy do zrobienia, aby zwiększyć
bezpieczeństwo takiej sieci. Z czasem pojawi się seria HOWTO
poświęcona bezpieczeństwu.
Na stronie poświęconej bezpieczeństwu w Linux-ie zawarte są różne informacje na ten temat jak również ostrzeżenia o znanych dziurach w systemie.
Jest kilka okoliczności i konfiguracji, w których instalacja
pakietu Shadow Suite nie byłaby dobrym pomysłem:
Nieprzesłonięty plik /etc/passwd ma następujący format:
identyfikator:hasło:UID:GID:imie_nazw:katalog:powłoka
Gdzie:
identyfikatorNazwa (login) użytkownika
hasłoZakodowane hasło
UIDNumer użytkownika
GIDNumer domyślnej grupy dla użytkownika
imie_nazwImię i nazwisko użytkownika - Właściwie pole to nazywa się GECOS (General Electric Comprehensive Operating System) i mogą tam być zapisane inne dane niż tylko imię i nazwisko Polecenia Shadow i strony podręcznika systemowego nazywają to pole polem komentarza.
katalogKatalog domowy użytkownika (pełna ścieżka)
powłokaPowłoka dla danego użytkownika (pełna ścieżka)
Na przykład:
login:Nkjg97jh7yff8:503:100:Imię Nazwisko:/home/login:/bin/bash
Gdzie Nk jest wartocią salt a
jg97jh7yff8 jest zakodowanym hasłem. Zakodowane hasło z
kluczem mogłoby równie dobrze wyglądać tak: ghHFgj75fR8iP
a te dwa łańcuchy to dokłanie te same hasła. Jest 4096 możliwości
zakodowania pojedynczego hasła. {Przykładowym hasłem jest tutaj
'hasło' naprawdę zły przykład hasła.}
Jak już pakiet Shadow Suite jest zainstalowany, to plik
/etc/passwd zawiera:
login:x:503:100:Imię Nazwisko:/home/login:/bin/bash
Znaczek "x" w tym przypadku jest po prostu czymś co wypełnia miejsce
hasła. Format pliku /etc/passwd się nie zmienił, zmieniło się
tylko miejsce przechowywania zakodowanego hasła. Oznacza to, że
każdy program, który tylko czyta plik /etc/passwd,a nie
zapisuje w nim hasła, będzie nadal działał poprawnie.
Hasła znajdują się obecnie w pliku /etc/shadow. (jest to
domyślna nazwa)
Plik /etc/shadow zawiera następujące informacje:
login:hasło:ostatnio_1970:może:musi:ostrz:dni:dni_1970:zarez
Gdzie:
loginpatrz /etc/passwd
hasłoZakodowane hasło
ostatnio_1970Ilość dni od 1 Stycznia 1970, kiedy hasło było ostatnio modyfikowane
możeIlość dni w przeciągu, których hasło może być zmienione
musiIlość dni, po której hasło musi zostać zmienione
ostrzIlość dni przed wygaśnięciem hasła od jakiej należy zacząć informować użytkownika o wygaśnięciu hasła.
dniIlość dni, po której hasło wygasa i konto jest blokowane
dni_1970Ilość dni od 1 Stycznia 1970, po której konto jest blokowane
zarezPole zarezerwowane
Poprzedni przykład mógł więc wyglądać tak:
login:Nkjg97jh7yff8:9479:0:10000::::
Ze strony podręcznika systemowego "man":
"crypt jest funkcją kodującą hasło. Oparta jest na
algorytmie DES (Data Encryption Standard) z dozwolonymi wariacjami
(między innymi), aby zniechęcić do sprzętowych rozwiązań
poszukiwania klucza.
Kluczem jest podane przez użytkownika hasło. [Zakodowany łańcuch jest wartościami NULL]
Salt jest łańcuchem 2-znakowym wybranym ze zbioru
[a-zA-Z0-9]. Łańuch ten jest użyty po to, aby zaburzyć algorytm w
jeden z 4096 sposobów.
Biorąc 7 najmniej znaczących bitów każdego znaku z klucza otrzymujemy 56-bitowy klucz. Ten 56-bitowy klucz jest używany, do powtórnego kodowania stałego łańcucha (zwykle są to znaki NULL). Zwrócona wartość wskazuje na zakodowane hasło - serię 13 drukowalnych znaków ASCII (dwa pierwsze znaki reprezentują wartość salt). Wartość zwracana wskazuje na stałe dane, których zawartość jest zmieniana przy każdym wywołaniu.
Uwaga: Liczba możliwych wartości klucza to 2^56 = 7,2E16 (około 72 biliardów). Wyczerpujące poszukiwania tego klucza są możliwe przy wykorzystaniu wielu równolegle współpracujących komputerów. Oprogramowanie, takie jak crack(1), jest dostępne i szuka ono takich kluczy, które z reguły używane są przez ludzi. Dlatego właśnie przy wybieraniu hasła powinno się unikać przynajmniej zwykłych słów. Zaleca się, używanie programu passwd(1), które podczas zmiany hasła sprawdza czy nowe hasło nie jest przesadnie proste.
Algorytm DES ma w sobie pewne kruczki, które czynią użycie
interfejsu crypt(3) bezużytecznym w przypadku innym niż
autentykacja haseł. Jeśli masz zamiar używać interfejsu crypt(3)
do kryptografii nie rób tego: zdobądź dobrą książkę na temat
kodowania (encryption) i jedną z szeroko dostępnych bibliotek DES."
Większość pakietów Shadow Suite zawiera kod zwiększający
ilość znaków w haśle do 16. Eksperci od DES-a są temu przeciwni,
ponieważ w takim przypadku kodowanie najpierw odbywa się dla lewej
strony dłuższego hasła, a potem dla prawej strony. Z powodu tego
jak działa crypt, może to stworzyć mniej bezpiecznie
zakodowane hasło niż wtedy, gdy użyte zostałoby hasło
krótsze. Dodatkowo, jest mało prawdopodobne, żeby użytkownik był w
stanie zapamiętać hasło 16-znakowe.
Trwają w tej chwili prace, które mają na celu zastąpienie
dotychczasowego algorytmu autentykacji czymś bardziej bezpiecznym
oraz z obsługą dłuższych haseł (szczególnie algorytmem MD5) oraz
pozostawienie kompatybilności z metodą wykorzystującą crypt.
Jeśli szukasz dobrej książki na temat kodowania polecam:
"Applied Cryptography: Protocols, Algorithms, and Source Code in C"
by Bruce Schneier <schneier@chinet.com>
ISBN: 0-471-59756-2