Przesłanianie haseł (Shadow Password)
Autor: Michael H. Jackson, mhjack@tscnet.com
v1.3, 3 Kwietnia 1996
WWeerrssjjaa ppoollsskkaa:: BBaarrttoosszz MMaarruusszzeewwsskkii
BB..MMaarruusszzeewwsskkii@@zzssmmeeiiee..ttoorruunn..ppll
v1.02, 26 Lipca 1997
Dokument ten opisuje jak zdobyć, zainstalować i skonfigurować pakiet
_S_h_a_d_o_w _P_a_s_s_w_o_r_d dla Linux-a. Omówione zostało tutaj także zdobywanie i
(ponowna) instalacja oprogramowania oraz demonów sieciowych, które
potrzebują dostępu do haseł użytkownika. Oprogramowanie to nie jest
właściwą częścią pakietu _S_h_a_d_o_w _S_u_i_t_e, ale będą one musiały zostać
przekompilowane, aby móc korzystać z haseł. Jest tutaj także zawarty
przykład dla programistów, jak dodawać obsługę przesłanianych haseł w
swoich programach. Pod koniec dokumentu zawarte zostały odpowiedzi na
często zadawane pytania. Dokument ten został napisany w standardzie
ISO-8859-2. Oryginał można znaleźć pod adresem ftp.icm.edu.pl w kata
logu /pub/Linux/sunsite/docs/HOWTO.
______________________________________________________________________
Table of Contents:
1. Wprowadzenie.
1.1. Zmiany w stosunku do poprzedniej wersji.
1.2. Nowe wersje tego dokumentu.
1.3. Komentarze.
2. Po co przesłaniać plik passwd ?
2.1. Czemu możesz nie chcieć przesłaniać swojego pliku z hasłami ?
2.2. Format pliku /etc/passwd.
2.3. Format pliku przesłaniającego.
2.4. Przegląd funkcji crypt(3).
3. Zdobywanie pakietu Shadow Suite.
3.1. Historia pakietu Shadow Suite dla Linux-a.
3.2. Gdzie znaleźć pakiet Shadow Suite.
3.3. Co jest zawarte w pakiecie Shadow Suite.
4. Kompilacja programów.
4.1. Rozpakowywanie archiwów.
4.2. Konfiguracja w pliku config.h
4.3. Kopie zapasowe twoich oryginalnych programów.
4.4. Polecenie make
5. Instalacja
5.1. Zaopatrz się w dyskietkę startową w razie gdybyś coś popsuł.
5.2. Usuwanie zduplikowanych stron podręcznika systemowego.
5.3. Polecenie make install
5.4. Polecenie pwconv
5.5. Zmiany nazw plików npasswd i nshadow
6. Inne programy, które może musisz uaktualnić albo "załatać".
6.1. Program adduser z dystrybucji Slackware.
6.2. Serwer wu_ftpd.
6.3. Standardowy ftpd.
6.4. pop3d (Post Office Protocol 3)
6.5. xlock
6.6. xdm
6.7. sudo
6.8. imapd (E-Mail
6.9. pppd (Serwer Protokołu Point-to-Point)
7. Wprowadzanie pakietu Shadow Suite do użycia.
7.1. Dodawanie, Modyfikacja i usuwanie użytkowników.
7.1.1. useradd.
7.1.2. usermod.
7.1.3. userdel.
7.2. Polecenie passwd i "termin ważności" hasła.
7.3. Plik login.defs
7.4. Hasła dla grup.
7.5. Programy do sprawdzania poprawności.
7.5.1. pwck
7.5.2. grpck
7.6. Hasła przez telefon. (Dial-up)
8. Obsługa przesłanianych haseł w programach w C.
8.1. Pliki nagłówkowe.
8.2. Biblioteka libshadow.a
8.3. Struktura Shadow.
8.4. Funkcje pakietu Shadow Suite.
8.5. Przykład.
9. Często zadawane pytania.
10. Prawa autorskie podziękowania i różne.
10.1. Prawa autorskie
10.2. Podziękowania i różne.
10.3. Od tłumacza.
______________________________________________________________________
11.. WWpprroowwaaddzzeenniiee..
Jest to dokument z serii HOWTO (czyli Jak To Zrobić). Opisuje on jak i
dlaczego instalować obsługę "shadow password" na swoim Linux-ie.
Zawarte jest także kilka przykładów na używanie pewnych właściwości
pakietu _S_h_a_d_o_w _S_u_i_t_e.
Podczas instalacji pakietu oraz używania jego narzędzi musisz być
zalogowany jako _"_r_o_o_t_". Podczas instalacji będziesz dokonywał pewnych
zmian do oprogramowania systemowego i zalecane jest, abyś zrobił kopię
tego oprogramowania. Zalecam też, abyś przeczytał i zrozumiał
wszystkie instrukcje zawarte tutaj zanim zaczniesz.
11..11.. ZZmmiiaannyy ww ssttoossuunnkkuu ddoo ppoopprrzzeeddnniieejj wweerrssjjii..
Dodane sekcje:
Dodałem sekcję na temat dlaczego mógłbyś niechcieć instalować
pakietu Shadow Suite.
Dodałem sekcję jak uaktualnić xdm-a.
Dodałem sekcję jak zmusić do działania specjalne właściwości pakietu
Shadow Suite.
Dodałem sekcję zawierającą często zadawane pytania.
Poprawki/Uaktualnienia:
Poprawiłem odwołania html do sunsite-a.
Poprawiłem sekcję na temat wu-ftpd, aby odzwierciedlała dodawanie
-lshadow do pliku Makefile.
Poprawiłem kilka literówek.
Zmieniłem sekcję na temat wu-ftpd, aby obsługiwał ELF.
Uaktualniłem cały dokument, aby odzwierciedlał problemy bezpieczeństwa
w różnych programach.
Dodałem rekomendację pakietu Linux Shadow Suite napisanego
przez Marka Michałkiewicza
11..22.. NNoowwee wweerrssjjee tteeggoo ddookkuummeennttuu..
Najnowszą wersję oryginału tego dokumentu można ściągnąć z
ftp.icm.edu.pl z katalogu /pub/Linux/sunsite/docs/HOWTO. Inne formaty
znajdują się w katalogu other-formats. Albo poprzez sieć WWW z
sunsite.icm.edu.pl
. Można też
bezpośrednio od autora . Autor będzie też
wysyłał nowe wersje na grupę dyskusyjną comp.os.linux.answers
Dokument ten jest także rozprowadzany wraz z dystrybucją pakietu
Shadow-YYDDMM.
Na temat nowych wersji tłumaczenia zobacz sekcję ``Od tłumacza''.
11..33.. KKoommeennttaarrzzee..
Proszę wszelkie komentarze, uaktualnienia czy sugestie wysyłać do mnie
. Im szybciej otrzymam pocztę tym szybciej
mogę poprawić ten dokument. Jeśli masz jakieś uwagi na jego temat, to
wyślij je bezpośrednio do mnie, ponieważ bardzo rzadko odwiedzam grupy
dyskusyjne.
22.. PPoo ccoo pprrzzeessłłaanniiaaćć pplliikk ppaasssswwdd ??
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.
_W_e_r_s_j_e _p_a_k_i_e_t_u _3_._3_._1_, _3_._3_._1_-_2 _i _s_h_a_d_o_w_-_m_k _m_a_j_ą _p_r_o_b_l_e_m_y _d_o_t_y_c_z_ą_c_e
_b_e_z_p_i_e_c_z_e_ń_s_t_w_a _z_e _s_w_o_i_m _p_r_o_g_r_a_m_e_m _l_o_g_i_n _i _k_i_l_k_o_m_a _i_n_n_y_m_i _p_r_o_g_r_a_m_a_m_i
_t_y_p_u _s_u_i_d _r_o_o_t _i _n_i_e _p_o_w_i_n_n_y _b_y_ć _j_u_ż _u_ż_y_w_a_n_e_.
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 mmuussii 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:
Plik konfiguracyjny, w którym można ustawic wartości domyślne
podczas logowania (/etc/login.defs)
Narzędzia do dodawania, modyfikacji i usuwania kont i grup.
Ustalanie "daty ważności" konta i jego wygasanie (expiration).
Przesłanianie haseł dla grup. (opcjonalnie)
Hasła o podwójnej długości (16 znaków) [NIE ZALECANE]
Lepsza kontrola nad wybieraniem haseł przez użytkowników.
Hasła przez telefon.
Programy do dodatkowej autentykacji [NIE ZALECANE]
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.
22..11.. CCzzeemmuu mmoożżeesszz nniiee cchhcciieećć pprrzzeessłłaanniiaaćć sswwoojjeeggoo pplliikkuu zz hhaassłłaammii ??
Jest kilka okoliczności i konfiguracji, w których instalacja pakietu
Shadow Suite nniiee bbyyłłaabbyy dobrym pomysłem:
Maszyna nie zawiera kont użytkowników.
Twoja maszyna jest w sieci LAN i używa NIS (Network Information
Services), aby obsługiwać nazwy użytkowników i hasła na innych
maszynach w tej samej sieci. (Właściwie mogłoby to być zrobione,
ale wykracza poza ramy tego dokumentu i nie zwiększyłoby
bezpieczeństwa w znacznym stopniu.)
Twoja maszyna jest używana przez serwery terminali, aby weryfikować
użytkowników poprzez NFS (Network File System), NIS albo jakąś inną
metodę.
Na twojej maszynie znajduje się inne oprogramowanie, które
autentykuje użytkowników, a nie ma wersji tego oprogramowania dla
shadow i nie masz źródeł.
22..22.. FFoorrmmaatt pplliikkuu //eettcc//ppaasssswwdd..
Nieprzesłonięty plik /etc/passwd ma następujący format:
identyfikator:hasło:UID:GID:imie_nazw:katalog:powłoka
Gdzie:
iiddeennttyyffiikkaattoorr
Nazwa (login) użytkownika
hhaassłłoo
Zakodowane hasło
UUIIDD
Numer użytkownika
GGIIDD
Numer domyślnej grupy dla użytkownika
iimmiiee__nnaazzww
Imię 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.
kkaattaalloogg
Katalog domowy użytkownika (pełna ścieżka)
ppoowwłłookkaa
Powł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
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)
22..33.. FFoorrmmaatt pplliikkuu pprrzzeessłłaanniiaajjąącceeggoo..
Plik /etc/shadow zawiera następujące informacje:
login:hasło:ostatnio_1970:może:musi:ostrz:dni:dni_1970:zarez
Gdzie:
llooggiinn
patrz /etc/passwd
hhaassłłoo
Zakodowane hasło
oossttaattnniioo__11997700
Ilość dni od 1 Stycznia 1970, kiedy hasło było ostatnio
modyfikowane
mmoożżee
Ilość dni w przeciągu, których hasło może być zmienione
mmuussii
Ilość dni, po której hasło musi zostać zmienione
oossttrrzz
Ilość dni przed wygaśnięciem hasła od jakiej należy zacząć
informować użytkownika o wygaśnięciu hasła.
ddnnii
Ilość dni, po której hasło wygasa i konto jest blokowane
ddnnii__11997700
Ilość dni od 1 Stycznia 1970, po której konto jest blokowane
zzaarreezz
Pole zarezerwowane
Poprzedni przykład mógł więc wyglądać tak:
login:Nkjg97jh7yff8:9479:0:10000::::
22..44.. PPrrzzeegglląądd ffuunnkkccjjii ccrryypptt((33))..
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.
UUwwaaggaa:: Liczba możliwych wartości klucza to 2^56 = 7,2E16 (około 72
biliardów). Wyczerpujące poszukiwania tego klucza ssąą mmoożżlliiwwee 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
ISBN: 0-471-59756-2
33.. ZZddoobbyywwaanniiee ppaakkiieettuu SShhaaddooww SSuuiittee..
33..11.. HHiissttoorriiaa ppaakkiieettuu SShhaaddooww SSuuiittee ddllaa LLiinnuuxx--aa..
NNIIEE UUŻŻYYWWAAJJ PPAAKKIIEETTÓÓWW WWYYMMIIEENNIIOONNYYCCHH WW TTEEJJ SSEEKKCCJJII,, SSĄĄ WW NNIICCHH PPRROOBBLLEEMMYY ZZ
BBEEZZPPIIEECCZZEEŃŃSSTTWWEEMM..
Oryginał pakietu Shadow Suite został napisany przez John F. Haugh II.
Jest kilka wersji, które były używane na Linux-ie:
Oryginał to shadow-3.3.1
shadow-3.3.1-2 to łata przeznaczona specjalnie na Linux-a zrobiona
przez Florian La Roche . Zawiera ona także
dalsze ulepszenia.
Pakiet shadow-mk został skomponowany specjalnie dla Linux-a.
Pakiet shadow-mk zawiera pakiet shadow-3.3.1 dystrybuowany przez John
F. Haugh II wraz z łatą shadow-3.3.1-2 patch, kilka poprawek
zrobionych przez Mohan Kokal , które uczyniły
instalację o wiele łatwiejszą, łatę zrobioną przez Joseph R.M.
Zbiciak, która eliminuje dziury w programie /bin/login związane z
opcjami -f, -h oraz kilka innych łat.
Pakiet shadow-mk był pakietem ppoopprrzzeeddnniioo rekomendowanym, ale powinien
zostać zamieniony z powodu pprroobblleemmóóww z bezpieczeństwem związanych z
programem login.
W pakietach 3.3.1, 3.3.1-2 oraz shadow-mk są problemy związane z
programem login. Błąd ten to niesprawdzanie długości podawanego
identyfikatora. Powoduje to przepełnienie bufora, co z kolei powoduje
załamania (crashes) programu albo gorzej. Podobno to przepełnienie
bufora może być wykorzystane przez kogoś, kto posiada konto w systemie
w połączeniu z bibliotekami dzielonymi, aby uzyskać przywileje rroooott--aa.
Nie będę opisywał jak dokładnie działa ten błąd ponieważ jest dużo
systemów Linux-owych, które są zarażone, ale systemy z zainstalowanymi
tymi pakietami Shadow Suite oraz większość systemów w wersji przed-ELF
bbeezz pakietu Shadow Suite są podatne na atak!
Więcej informacji na ten temat znajdziesz na stronie poświęconej
bezpieczeństwu w Linux-ie . (Shared Libraries and login Program Vulnerability)
33..22.. GGddzziiee zznnaalleeźźćć ppaakkiieett SShhaaddooww SSuuiittee..
Jedyny polecany pakiet Shadow Suite jest wciąż w wersji BETA, chociaż
najnowsze wersje są bezpieczne w środowisku produkcji i nie zawierają
podatnego na ataki programu login.
W pakiecie używane jest następujące nazewnictwo:
shadow-RRMMDD.tar.gz
gdzie RRMMDD oznacza datę wprowadzenia pakietu w obieg.
Wersja ta ostatecznie będzie wersją 3.3.3, kiedy zakończone zostaną
testy w wersji BETA, a obsługiwana jest przez Marka Michałkiewicza
.
Dostępna jest jako shadow-current.tar.gz
.
Dostępna jest także pod adresem ftp.icm.edu.pl
.
Powinieneś użyć najnowszej dostępnej wersji.
NNIIEE powinieneś używać wersji ssttaarrsszzeejj niż shadow-960129 ponieważ
występuje tam opisany powyżej problem z programem login.
Jeśli piszę o pakiecie Shadow Suite, to mam na myśli ten właśnie plik.
Zakłada się też, że tej właśnie wersji używasz.
Aby napisać ten dokument użyłem tej właśnie wersji pakietu.
Jeśli wcześniej używałeś pakietu shadow-mk, powinieneś zaktualizować
go do tej wersji i ponownie skompilować wszystko to, co pierwotnie
przekompilowałeś,
33..33.. CCoo jjeesstt zzaawwaarrttee ww ppaakkiieecciiee SShhaaddooww SSuuiittee..
Pakiet ten zawiera zastępcze wersje dla programów:
su, login, passwd, newgrp, chfn, chsh, id
Pakiet ten zawiera także nowe programy: chage, newusers, dpasswd,
gpasswd, useradd, userdel, usermod, groupadd, groupdel, groupmod,
groups, pwck, grpck, lastlog, pwconv, pwunconv.
Dodatkowo znajduje się tam także biblioteka libshadow.a przeznaczona
do pisania i kompilowania programów, które potrzebują dostępu do haseł
użytkowników.
Zawarte są także strony podręcznika systemowego do wszystkich
programów.
Znajduje się tam także plik konfiguracyjny dla programu login, który
zostanie zainstalowany jako /etc/login.defs.
44.. KKoommppiillaaccjjaa pprrooggrraammóóww..
44..11.. RRoozzppaakkoowwyywwaanniiee aarrcchhiiwwóóww..
Pierwszym krokiem po ściągnięciu programu jest rozpakowanie go. Pakiet
jest w formie starowanej i skompresowany programem gzip, tak więc
najpierw przenieś go do /usr/src, a potem napisz:
tar -xzvf shadow-current.tar.gz
Powstanie katalog /usr/src/shadow-RRMMDD, w którym znajdą się źródła
pakietu.
44..22.. KKoonnffiigguurraaccjjaa ww pplliikkuu ccoonnffiigg..hh
Pierwszą rzeczą jaką musisz zrobić, to skopiować odpowiednie pliki
Makefile i config.h:
cd /usr/src/shadow-RRMMDD
cp Makefile.linux Makefile
cp config.h.linux config.h
Potem powinieneś przejrzeć plik config.h. Zawiera on definicje dla
niektórych opcji konfiguracyjnych. Jeśli używasz _z_a_l_e_c_a_n_e_g_o pakietu,
to polecam wyłączenie na początek przesłanianie haseł grup.
Domyślnie opcja ta jest włączona. Aby to wyłączyć, wyedytuj plik
config.h i zmień #define SHADOWGRP na #undef SHADOWGRP. Na początek
proponuje to wyłaczyć, a później jak będziesz chciał haseł dla grup i
administratorów grup, to możesz przekompilować pakiet. Jeśli zostawisz
tę opcję włączoną mmuussiisszz stworzyć plik /etc/gshadow.
Włączanie opcji pozwalającej na dłuższe hasła nniiee jest zalecane -
patrz wyżej.
Opcja AUTOSHADOW została zaprojektowana, aby umożliwić działanie
programom, które ignorują przesłanianie haseł. Teoretycznie brzmi to
dobrze, ale niestety nie działa poprawnie. Jeśli właczysz tę opcję i
program zostanie uruchomiony z przywilejami "root-a", może on wywołać
funkcję getpwnam() jako "root", a później zapisać zmienioną pozycję
spowrotem do pliku /etc/passwd (ii hhaassłłoo nniiee jjeesstt jjuużż pprrzzeessłłoonniięęttee).
Do takich programów zaliczają się chfn i chsh. (Nie możesz obejść tego
przez zamianę rzeczywistego uid z efektywnym uid przed wywołaniem
funkcji getpwnam() ponieważ root także może używać chfn i chsh.)
To samo ostrzeżenie jest słuszne jeśli kompilujesz bibliotekę libc,
która posiada opcję SHADOW_COMPAT, która robi to samo. NNiiee ppoowwiinnnnaa ona
być używana! Jeśli zakodowane hasła zaczną się pojawiać spowrotem w
pliku /etc/passwd, to to właśnie jest przyczyną.
Jeśli używasz wcześniejszej wersji biblioteki niż 4.6.27, będziesz
musiał zrobić trochę więcej zmian w pliku config.h i Makefile.
W pliku config.h zmień:
#define HAVE_BASENAME
na:
#undef HAVE_BASENAME
A następnie w pliku Makefile zmień:
SOBJS = smain.o env.o entry.o susetup.o shell.o \
sub.o mail.o motd.o sulog.o age.o tz.o hushed.o
SSRCS = smain.c env.c entry.c setup.c shell.c \
pwent.c sub.c mail.c motd.c sulog.c shadow.c age.c pwpack.c rad64.c \
tz.c hushed.c
na:
SOBJS = smain.o env.o entry.o susetup.o shell.o \
sub.o mail.o motd.o sulog.o age.o tz.o hushed.o basename.o
SSRCS = smain.c env.c entry.c setup.c shell.c \
pwent.c sub.c mail.c motd.c sulog.c shadow.c age.c pwpack.c rad64.c \
tz.c hushed.c basename.c
Zmiany te powodują zawarcie kodu z basename.c, który zawiera się w
libc 4.6.27 i późniejszych.
44..33.. KKooppiiee zzaappaassoowwee ttwwooiicchh oorryyggiinnaallnnyycchh pprrooggrraammóóww..
Dobrym pomysłem będzie zrobienie kopii zapasowych programów, które
zostaną zamienione przez Shadow Suite. W dystrybucji Slackware 3.0 są
to:
/bin/su
/bin/login
/usr/bin/passwd
/usr/bin/newgrp
/usr/bin/chfn
/usr/bin/chsh
/usr/bin/id
Pakiet w wersji BETA ma możliwość wykonania tego poprzez program make,
ale jest to w komentarzu w pliku Makefile, ponieważ różne dystrybucje
umieszczają te programy w różnych miejscach. Można to zrobić pisząc:
make save, ale najpierw trzeba skasować znaki # z pliku Makefile od
linii: save:
Powinieneś także zrobić kopię zapasową pliku /etc/passwd, ale bądź
ostrożny, żebyś nie zmazał programu passwd w katalogu /etc.
44..44.. PPoolleecceenniiee mmaakkee
_A_b_y _z_a_i_n_s_t_a_l_o_w_a_ć _p_a_k_i_e_t _m_u_s_i_s_z _b_y_ć _z_a_l_o_g_o_w_a_n_y _j_a_k_o _"_r_o_o_t_".
Uruchom make, aby skompilować programy wykonywalne:
make all
Możesz zobaczyć ostrzeżenie: rcsid defined but not used. Wszystko jest
w porządku, ponieważ autor używa wersji kontrolnej pakietu.
55.. IInnssttaallaaccjjaa
55..11.. ZZaaooppaattrrzz ssiięę ww ddyysskkiieettkkęę ssttaarrttoowwąą ww rraazziiee ggddyybbyyśś ccoośś ppooppssuułł..
Jeśli coś poważnie pójdzie nie tak, byłoby dobrze, gdybyś miał
dyskietkę startową. Jeśli masz dyskietki boot/root z czasów
instalacji, to w porządku, w innym przypadku przeczytaj Bootdisk-HOWTO
, które opisuje jak zrobić dyskietkę startową.
55..22.. UUssuuwwaanniiee zzdduupplliikkoowwaannyycchh ssttrroonn ppooddrręęcczznniikkaa ssyysstteemmoowweeggoo..
Powinieneś także przenieść strony podręcznika systemowego, które
zostaną zastąpione. Nawet jeśli jesteś na tyle odważny, że instalujesz
Shadow Suite bez kopii zapasowej, to i tak będziesz chciał przenieść
stare strony podręcznika systemowego. Nowe strony normalnie nie
usunęłyby starych, ponieważ te drugie są przypuszczalnie
skompresowane.
Możesz użyć takiej kombinacji poleceń: man -aW polecenie i locate
polecenie, aby zlokalizować strony, które mają być usunięte czy
przeniesione. Raczej łatwiej zrobić to przed poleceniem make install.
Jeśli używasz dystrybucji Slackware 3.0, to oto strony, które
powinieneś usunąć/przesunąć:
/usr/man/man1/chfn.1.gz
/usr/man/man1/chsh.1.gz
/usr/man/man1/id.1.gz
/usr/man/man1/login.1.gz
/usr/man/man1/passwd.1.gz
/usr/man/man1/su.1.gz
/usr/man/man5/passwd.5.gz
W katalogu /var/man/cat[1-9] mogą znajdować się strony o tych samych
nazwach, które także powinny zostać usunięte/przeniesione.
55..33.. PPoolleecceenniiee mmaakkee iinnssttaallll
Jesteś gotów, aby napisać (zrób to jako "root"):
make install
Zainstaluje to nowe programy i programy zastępcze oraz ustawi
odpowiednie prawa dostępu do plików. Zostaną także zainstalowane
strony podręcznika systemowego.
Są tu także instalowane pliki nagłówkowe w odpowiednich miejscach w
/usr/include/shadow.
Jeśli używasz wersji BETA tego pakietu, to musisz ręcznie skopiować
plik login.defs do katalogu /etc i upewnić się, że ttyyllkkoo ""rroooott"" może
go modyfikować.
cp login.defs /etc
chmod 600 /etc/login.defs
Plik ten jest plikiem konfiguracyjnym dla programu login. Powinieneś
go przejrzeć i odpowiednio zmodyfikować jego zawartość zgodnie z
twoimi wymaganiami. To tutaj decydujesz, z których terminalli (tty)
może zalogować się "root" oraz ustawiasz inne opcje bezpieczeństwa
(np. domyślne wygasanie haseł).
55..44.. PPoolleecceenniiee ppwwccoonnvv
Następnym krokiem jest polecenie pwconv. Musi ono także być wykonane
jako "root" i najlepiej w katalogu /etc:
cd /etc
/usr/sbin/pwconv
Program pwconv tworzy z pliku /etc/passwd dwa pliki: /etc/npasswd i
/etc/nshadow.
Dostępny jest także program pwunconv jeśli musisz zrobić normalny plik
/etc/passwd z plików /etc/passwd i /etc/shadow.
55..55.. ZZmmiiaannyy nnaazzww pplliikkóóww nnppaasssswwdd ii nnsshhaaddooww
Teraz, kiedy już wykonałeś polecenie pwconv, stworzyłeś dwa pliki -
/etc/npasswd i /etc/nshadow. Ich nazwy muszą zostać zmienione
odpowiednio na /etc/passwd i /etc/shadow. Chcemy także zrobić kopię
oryginalnego pliku /etc/passwd i upewnić się, że tylko "root" może go
czytać. Kopię zapasową umieścimy w katalogu domowym "root-a":
cd /etc
cp passwd ~/passwd
chmod 600 ~/passwd
mv npasswd passwd
mv nshadow shadow
Powinieneś się także upewnić, czy właściciel plików i prawa dostępu są
poprawne. Jeśli masz zamiar używać _X_W_i_n_d_o_w_s, to programy xlock i xdm
muszą mieć możliwość odczytu pliku shadow, ale nie zapisu.
Są dwa sposoby na zrobienie tego. Możesz ustawić bit "SUID" dla
programu xlock (chmod u+s xlock); xdm ma z reguły ten bit ustawiony.
Albo możesz przydzielić plik /etc/shadow do grupy shadow, ale zanim to
zrobisz, sprawdź czy masz grupę shadow w pliku /etc/group. Właściwie
żaden z użytkowników systemu nie powinien być w tej grupie.
cd /etc
chown root.root passwd
chown root.shadow shadow
chmod 0644 passwd
chmod 0640 shadow
Twój system ma teraz przesłonięte hasła. Powinieneś teraz przejść na
inny wirtualny terminal i sprawdzić czy możesz się zalogować
ZZrróóbb ttoo tteerraazz -- nnaapprraawwddęę !!
Jeśli nie możesz, to coś jest nie tak ! Aby powrócić do stanu sprzed
instalacji _S_h_a_d_o_w _S_u_i_t_e zrób to:
cd /etc
cp ~/passwd passwd
chmod 644 passwd
Przywracasz w ten sposób stare pliki, które wcześniej zachowałeś, na
ich właściwe miejsce.
66.. IInnnnee pprrooggrraammyy,, kkttóórree mmoożżee mmuussiisszz uuaakkttuuaallnniićć aallbboo ""zzaałłaattaaćć""..
Pomimo, iż pakiet _S_h_a_d_o_w _S_u_i_t_e posiada zastępcze programy dla
większości programów, które potrzebują dostepu do haseł, to prawie w
każdym systemie są jeszcze dodatkowe programy, które potrzebują
dostępu do haseł.
Jeśli masz dystrybucję _D_e_b_i_a_n (a nawet jeśli nie masz), możesz znaleźć
źródła programów, które muszą być przerobione pod tym adresem
.
Reszta tej sekcji opisuje jak uaktualnić programy: adduser, wu_ftpd,
ftpd, pop3d, xlock, xdm i sudo tak, aby obsługiwały przesłonięte
hasła.
Aby dowiedzieć się jak zrobić obsługę przesłoniętych haseł w
jakimkolwiek innym programie zobacz sekcję ``Obsługa przesłanianych
haseł w programach w C''. (Programy te i tak muszą być uruchomione z
bitem "SUID" dla "root-a" albo grupy shadow, aby rzeczywiście mieć
dostęp do haseł.)
66..11.. PPrrooggrraamm aadddduusseerr zz ddyyssttrryybbuuccjjii SSllaacckkwwaarree..
Dystrybucja Slackware (i pewnie inne) zawiera interaktywny program
służący do dodawania nowych użytkowników - /sbin/adduser. Wersję tego
programu obsługującą przesłonięte hasła można pobrać np. z
ftp.icm.edu.pl z katalogu /pub/Linux/sunsite/system/admin/accounts/.
Ja zalecam używanie programów, które są dostarczane wraz z pakietem
_S_h_a_d_o_w _S_u_i_t_e (useradd, usermod, i userdel) zamiast adduser z
dystrybucji Slackware. Co prawda nauczenie się jak się nimi posługiwać
zabiera trochę czasu, ale opłaca się to ponieważ masz o wiele większą
kontrolę i mają one poprawne blokowanie plików (file locking)
/etc/passwd i /etc/shadow - adduser tego nie robi.
Więcej informacji w następnej sekcji - ``Wprowadzanie pakietu Shadow
Suite do użycia.''.
Ale jeśli już musisz go mieć, oto co musisz zrobić:
tar -xzvf adduser.shadow-1.4.tar.gz
cd adduser
make clean
make adduser
chmod 700 adduser
cp adduser /sbin
66..22.. SSeerrwweerr wwuu__ffttppdd..
Wraz z większością dystrybucji Linux-a przychodzi serwer wu_ftpd.
Jeśli twoja dystrybucja nie instaluje domyślnie pakietu _S_h_a_d_o_w _S_u_i_t_e,
to twój serwer wu_ftpd nie będzie skompilowany z obsługą
przesłoniętych haseł. wu_ftpd jest odpalany z inetd/tcpd jako proces
_"_r_o_o_t_-_a_". Jeśli twój demon wu_ftpd jest starą wersją, to będziesz
chciał ją uaktualnić tak czy inaczej ponieważ stare wersje mają pewien
błąd, który kompromituje konto _"_r_o_o_t_". (Więcej informacji znajdziesz
na Stronie Domowej Bezpieczeństwa na Linuxie
).
Na szczęście musisz tylko zdobyć żródła tego programu i skompilować go
z włączoną obsługą "Shadow password".
Jeśli nie masz systemu ELF, to serwer wu_ftpd możesz znaleźć na
SUNSite Polska
- nazywa się wu_ftpd-2.4-fixed.tar.gz
Jak już ściągniesz te źródła, to wtedy napisz:
cd /usr/src
tar -xzvf wu-ftpd-2.4-fixed.tar.gz
cd wu-ftpd-2.4-fixed
cp ./src/config/config.lnx.shadow ./src/config/config.lnx
Potem zmień w pliku ./src/makefiles/Makefile.lnx linię:
LIBES = -lbsd -support
na:
LIBES = -lbsd -support -lshadow
Teraz możesz uruchomić skrypt kompilujący i zainstalować pakiet:
cd /usr/src/wu-ftpd-2.4-fixed
/usr/src/wu-ftp-2.4.fixed/build lnx
cp /usr/sbin/wu.ftpd /usr/sbin/wu.ftpd.old
cp ./bin/ftpd /usr/sbin/wu.ftpd
Polecenia te powodują użycie pliku konfiguracyjnego z obsługą haseł
przesłanianych dla Linux-a, skompilowanie i instalację serwera.
U siebie na Slackware 2.3 musiałem dodatkowo przed kompilacją zrobić
coś takiego:
cd /usr/include/netinet
ln -s in_systm.h in_system.h
cd -
Zgłaszane były problemy z kompilacją na systemie binarnym ELF, ale
wersja BETA następnej wersji działa dobrze. Można ją znaleźć pod
adresem ftp.icm.edu.pl
pod nazwą wu-ftp-2.4.2-beta-10.tar.gz.
Jak już ściągniesz serwer umieść go w /usr/src i napisz:
cd /usr/src
tar -xzvf wu-ftpd-2.4.2-beta-9.tar.gz
cd wu-ftpd-beta-9
cd ./src/config
Potem zmień w pliku config.lnx:
#undef SHADOW.PASSWORD
na:
#define SHADOW.PASSWORD
Potem:
cd ../Makefiles
i zmień w pliku Makefile.lnx
LIBES = -lsupport -lbsd # -lshadow
na:
LIBES = -lsupport -lbsd -lshadow
Następnie skompiluj i zainstaluj:
cd ..
build lnx
cp /usr/sbin/wu.ftpd /usr/sbin/wu.ftpd.old
cp ./bin/ftpd /usr/sbin/wu.ftpd
Zauważ, że powinieneś sprawdzić w /etc/inetd.conf katalog, w którym
twój serwer rzeczywiście się znajduje. Powiadomiono mnie, że niektóre
dystrybucje umieszczają demony serwerów w innych miejscach, a wtedy
wu_ftpd może się znajdować gdzie indziej.
66..33.. SSttaannddaarrddoowwyy ffttppdd..
Jeśli masz u siebie standardowy serwer ftpd, zalecałbym zmianę na
wu_ftpd. Poza znaną dziurą omówioną wcześniej, wu_ftpd jest uznany za
bardziej bezpieczny.
Jeśli nalegasz na standardowy, albo potrzebujesz obsługi _N_I_S, to na
SUNSite Polska
znajdziesz ftpd-shadow-nis.tgz.
66..44.. ppoopp33dd ((PPoosstt OOffffiiccee PPrroottooccooll 33))
Jeśli potrzebujesz obsługi _P_o_s_t _O_f_f_i_c_e _P_r_o_t_o_c_o_l _3, będziesz musiał
skompilować ponownie program pop3d. Normalnie jest on uruchamiany
przez inetd/tcpd jako "root".
Na SUNSite Polska
dostępne są
dwie wersje:
pop3d-1.00.4.linux.shadow.tar.gz
pop3d+shadow+elf.tar.gz
Obie są raczej proste do zainstalowania.
66..55.. xxlloocckk
Jeśli zainstalujesz pakiet Shadow Suite i uruchomisz _X_W_i_n_d_o_w_s, a
następnie zablokujesz (lock) ekran nie uaktualniając programu xlock,
będziesz musiał użyć CTRL+ALT+Fx, aby przełączyć się na wirtualną
konsolę tekstową (jeśli masz jakąś), zalogować się i zlikwidować
proces xlock (albo użyć CTRL+ALT+BACKSPACE żeby zamknąć XWindows). Na
szczęście uaktualnienie programu xlock jest dość proste.
Jeśli masz XFree86 wersja 3.x.x, przypuszczalnie używasz xlockmore
(który jest wspaniałym "screensaver-em" w połaczeniu z "lock").
Następujący pakiet obsługuje przesłonięte hasła - xlockmore-3.5.tgz a
dostępny jest z SUNSite Polska
.
Jeśli masz starszą wersję zalecam uaktualnienie do tej.
Oto "z grubsza" to, co musisz zrobić:
Ściągnij xlockmore i umieść w /usr/src
rozpakuj: tar -xzvf xlockmore-3.7.tgz
zmień w pliku /usr/X11R6/lib/X11/config/linux.cf linię
#define HasShadowPasswd NO
na:
#define HasShadowPasswd YES
skompiluj pliki wykonywalne:
cd /usr/src/xlockmore
xmkmf
make depend
make
potem przenieś wszystko w odpowiednie miejsce i uaktulanij prawa
dostępu i właścicieli plików
cp xlock /usr/X11R6/bin/
cp XLock /var/X11R6/lib/app-defaults/
chown root.shadow /usr/X11R6/bin/xlock
chmod 2755 /usr/X11R6/bin/xlock
chown root.shadow /etc/shadow
chmod 640 /etc/shadow
Twój xlock będzie teraz działał poprawnie.
66..66.. xxddmm
xdm jest programem, który prezentuje ekran "logujący" dla XWindows.
Niektóre systemy startują ten program kiedy system ma się uruchomić w
odpowiednim "runlevel-u" (zobacz /etc/inittab).
Jeśli zainstalowałeś przesłaniane hasła, musisz uaktulanić ten
program. Na szczęście jest to dość proste:
xdm.tar.gz można ściągnąć z SUNSite Polska
.
Ściągnij ten plik i umieść go w /usr/src, potem go rozpakuj: tar -xzvf
xdm.tar.gz.
Zmień w pliku /usr/X11R6/lib/X11/config/linux.cf linię
#define HasShadowPasswd NO
na:
#define HasShadowPasswd YES
Skompiluj pliki wykonywalne:
cd /usr/src/xdm
xmkmf
make depend
make
Potem umieść wszystko na swoim miejscu cp xdm /usr/X11R6/bin/.
xdm jest uruchamiany jako "root" tak więc nie musisz zmieniać jego
praw dostępu.
66..77.. ssuuddoo
Program sudo pozwala administratorowi na udostępnianie zwykłym
użytkownikom programów, które wymagają uprawnień "root-a". Jest to
pożyteczne ponieważ można ograniczać dostęp do konta "root" i
jednocześnie pozwalać użytkownikom np. montować urządzenia.
sudo musi przeczytać hasło ponieważ weryfikuje użytkownika kiedy jest
uruchamiane. sudo jest uruchamiane z bitem SUID "root" tak więc nie ma
problemu z dostępem do pliku /etc/shadow.
Program ten z obsługą haseł przesłanianych dostępny jest na SUNSite
Polska pod
nazwą sudo-1.2-shadow.tgz.
UUwwaaggaa:: Podczas instalacji tego programu usunięty zostanie plik
/etc/sudoerrs i zastąpiony domyślnym przychodzącym razem z pakietem.
Tak więc zrób sobie kopię zapasową jeśli robiłeś tam jakieś zmiany.
Albo możesz usunąć linijkę kasującą ten plik z pliku Makefile.
Obsługa przesłanianych haseł jest już ustawiona w pakiecie, tak więc
wszystko co trzeba zrobić, to przekompilować go. Po umieszczeniu go w
/usr/src napisz:
cd /usr/src
tar -xzvf sudo-1.2-shadow.tgz
cd sudo-1.2-shadow
make all
make install
66..88.. iimmaappdd ((EE--MMaaiill ppaakkiieett ppiinnee))..
imapd jest serwerem poczty elektronicznej podobnym do pop3d. imapd
przychodzi wraz z pakietem _P_i_n_e _E_-_M_a_i_l. Dokumentacja dostarczana wraz
z tym pkaietem twierdzi, że domyślnym dla systemów Linux jest
włączenie obsługi przesłanianych haseł. Ja jednak przekonałem się, że
nie jest to prawda. Idąc dalej, kombinacja skrypt tworzący - Makefile
bardzo utrudnia dodanie biblioteki libshadow.a podczas kompilacji,
więc nie byłem w stanie dodać obsługi haseł przesłanianych do imapd.
Jeśli komuś się to udało, to proszę o opis a ja umieszczę go w tym
punkcie.
66..99.. ppppppdd ((SSeerrwweerr PPrroottookkoołłuu PPooiinntt--ttoo--PPooiinntt))
Serwer pppd może zostać tak ustawiony, aby używał różnych typów
autentykacji:
_P_a_s_s_w_o_r_d _A_u_t_h_e_n_t_i_c_a_t_i_o_n _P_r_o_t_o_c_o_l (PAP) i _C_r_y_p_t_o_g_r_a_p_h_i_c _H_a_n_d_s_h_a_k_e
_A_u_t_h_e_n_t_i_c_a_t_i_o_n _P_r_o_t_o_c_o_l (CHAP). Serwer pppd zwykle czyta łańuchy haseł
z /etc/ppp/chap-secrets i/albo z /etc/ppp/pap-secrets. Jeśli używasz
tego domyślnego zachowania serwera pppd, to przeinstalowywanie go nie
jest konieczne.
pppd pozwala także na użycie parametrów _l_o_g_i_n_-_u (albo z wiersza
poleceń, albo z pliku konfiguracyjnego, albo z pliku z opcjami). Jeśli
jest podana jakaś opcja _l_o_g_i_n_-_u, to pppd użyje pliku /etc/passwd, żeby
zweryfikować identyfikator i hasło dla PAP. To oczywiście nie zadziała
odkąd nasz plik z hasłami jest przesłaniany. Jeśli używasz
pppd-1.2.1d, to będziesz musiał dodać kod do obsługi haseł
przesłanianych.
Podany w dalszej części przykład dodaje obsługę dla tej właśnie
wersji.
Wersja pppd-2.2.0 ma już w sobie obsługę przesłanianych haseł.
77.. WWpprroowwaaddzzaanniiee ppaakkiieettuu SShhaaddooww SSuuiittee ddoo uużżyycciiaa..
Sekcja ta opisuje kilka rzeczy które będziesz chciał wiedzieć jak już
zainstalowałeś pakiet _S_h_a_d_o_w _S_u_i_t_e. Dalsze informacje zawarte są na
stronach podręcznika systemowego na temat każdego polecenia.
77..11.. DDooddaawwaanniiee,, MMooddyyffiikkaaccjjaa ii uussuuwwaanniiee uużżyyttkkoowwnniikkóóww..
Pakiet _S_h_a_d_o_w _S_u_i_t_e dodał następujące polecenia do dodawania,
modyfikacji i usuwania użytkowników. Są one obsługiwane z wiersza
poleceń przez parametry (mogłeś także zainstalować program adduser).
77..11..11.. uusseerraadddd..
Polecenie useradd może zostać użyte, aby dodać użytkownika do systemu.
Wykonujesz je także, żeby zmienić domyślne ustawienia.
Pierwszą rzeczą jaką powinieneś zrobić, to sprawdzić ustawienia
domyślne na twoim systemie i odpowiednio je zmienić:
useradd -D
______________________________________________________________________
GROUP=1
HOME=/home
INACTIVE=0
EXPIRE=0
SHELL=
SKEL=/etc/skel
______________________________________________________________________
Wartości domyślne to pewnie nie są te, które chcesz używać, tak więc
jeśli zacząłbyś dodawać użytkowników teraz, to musiałbyś podawać
informacje dla każdego użytkownika. Jednak możemy i powinniśmy zmienić
wartości domyślne:
Niech domyślną grupą będzie 100
Niech hasła wygasają po 60 dniach
Niech konta nie będą blokowane po wygaśnięciu hasła
Niech domyślną powłoką będzie /bin/bash
Aby zrobić takie zmiany napisałbym:
useradd -D -g100 -e60 -f0 -s/bin/bash
Teraz uruchomienie useradd -D pokaże:
______________________________________________________________________
GROUP=100
HOME=/home
INACTIVE=0
EXPIRE=60
SHELL=/bin/bash
SKEL=/etc/skel
______________________________________________________________________
W razie gdybyś chciał wiedzieć, to wartości te są zapisywane w
/etc/default/useradd.
Teraz możesz użyć polecenia useradd, aby dodać użytkowników do
systemu. Na przykład, aby dodać użytkownika fred używając wartości
domyślnych napisałbyś:
useradd -m -c "Fred Flintstone" fred
Stworzy to następującą pozycję w /etc/passwd:
fred:*:505:100:Fred Flinstone:/home/fred:/bin/bash
oraz następującą pozycję w /etc/shadow:
fred:!:0:0:60:0:0:0:0
Utworzony zostanie katalog domowy freda oraz skopiowana zostanie tam
zawartość katalogu /etc/skel z powodu opcji -m.
Ponieważ nie podaliśmy UID-u użyty zostanie następny wolny.
Konto freda będzie utworzone, ale nie będzie on się mógł zalogować
dopóki go nie odblokujemy. Zrobimy to przez zmianę hasła:
passwd fred
______________________________________________________________________
Changing password for fred
Enter the new password (minimum of 5 characters)
Please use a combination of upper and lower case letters and numbers.
New Password: *******
Re-enter new password: *******
______________________________________________________________________
Teraz w /etc/shadow będzie:
fred:J0C.WDR1amIt6:9559:0:60:0:0:0:0
A fred będzie mógł się teraz zalogować i korzystać z systemu.
Najlepsze w użyciu programów, które przychodzą razem z pakietem _S_h_a_d_o_w
_S_u_i_t_e jest to, że wszelkie zmiany plików /etc/passwd i /etc/shadow są
wykonywane z tzw. blokowaniem. Ta więc jeśli dodajesz użytkownika do
systemu a inny użytkownik właśnie sobie zmienia hasło, to obie
operacje zostaną wykonane poprawnie.
Powinieneś używać raczej dostarczonych programów niż edytować ręcznie
pliki /etc/passwd i /etc/shadow. Jeśli edytowałeś plik /etc/shadow i
jakiś użytkownik zmieniał sobie w tym samym czasie hasło, to po
zapisaniu zmian dokonanych przez ciebie nowe hasło użytkownika zginie.
Oto mały interaktywny skrypt, który dodaje nowego użytkownika używając
useradd i passwd:
______________________________________________________________________
#!/bin/bash
#
# /sbin/newuser - Skrypt dodający użytkowników do systemu używającego
# programów useradd z pakietu Shadow Suite i passwd.
#
# Napisany przez Mike'a Jacksona jako przykład do
# Shadow-Password-HOWTO. Pozwolenie na używanie i modyfikacje wyraźnie dane.
#
# Możnaby ten skrypt zmodyfikować tak, żeby pokazywał wartości domyślne
# oraz pozwalał na modyfikację podobnie jak program adduser ze Slackware.
# Możnaby też sprawdzać błędy, czy głupie wartości.
#
#
##
# Wartości domyślne dla polecenia useradd
##
GROUP=100 # Domyślna grupa
HOME=/home # Katalog domowy (/home/identyfikator)
SKEL=/etc/skel # Katalog szkieletowy
INACTIVE=0 # Ilość dni, po których wygasa hasło.
EXPIRE=60 # Ilość dni, przez którą ma istnieć hasło
SHELL=/bin/bash # Domyślna powłoka (pełna ścieżka)
##
# Wartości domyślne dla polecenia passwd
##
PASSMIN=0 # Ilość dni między którą zmienia się hasło
PASSWARN=14 # Ilość dni przed wygaśnięciem hasła kiedy jest
# wysyłana wiadomość ostrzegająca.
##
# Upewnij się, że "root" uruchomił ten skrypt
##
WHOAMI=`/usr/bin/whoami`
if [ $WHOAMI != "root" ]; then
echo "You must be root to add news users!"
exit 1
fi
##
# Zapytaj o identyfikator i imię i nazwisko
##
echo ""
echo -n "Username: "
read USERNAME
echo -n "Full name: "
read FULLNAME
#
echo "Adding user: $USERNAME."
#
# Zauważ, że wymagane są "" przy $FULLNAME ponieważ pole to będzie
# prawie zawsze zawierało przynajmniej jedną spację, a bez " polecenie
# useradd "pomyślałoby", że jest to następny parametr kiedy doszłoby
# do spacji.
#
/usr/sbin/useradd -c"$FULLNAME" -d$HOME/$USERNAME -e$EXPIRE \
-f$INACTIVE -g$GROUP -m -k$SKEL -s$SHELL $USERNAME
##
# Ustaw domyślne wartości dla hasła
##
/bin/passwd -n $PASSMIN -w $PASSWARN $USERNAME >/dev/null 2>&1
##
# Niech polecenie passwd zapyta poprawnie (dwa razy) o hasło
##
/bin/passwd $USERNAME
##
# Pokaż, co zostało zrobione
##
echo ""
echo "Entry from /etc/passwd:"
echo -n " "
grep "$USERNAME:" /etc/passwd
echo "Entry from /etc/shadow:"
echo -n " "
grep "$USERNAME:" /etc/shadow
echo "Summary output of the passwd command:"
echo -n " "
passwd -S $USERNAME
echo ""
______________________________________________________________________
Użycie skryptu do dodawania użytkowników do systemu jest na prawdę
bardziej preferowane niż ręczna edycja plików /etc/passwd czy
/etc/shadow czy też używanie programu adduser ze Slackware. Możesz
śmiało modyfikować ten skrypt dla swoich potrzeb.
Więcej informacji na temat useradd znajdziesz w podręczniku
systemowym.
77..11..22.. uusseerrmmoodd..
Program usermod używany jest do modyfikowania informacji na temat
danego użytkownika. Opcje tego programu są podobne do opcji programu
useradd.
Powiedzmy, że chcesz zmienić powłokę dla freda; zrobiłbyś to tak:
usermod -s /bin/tcsh fred
Teraz pozycja dotycząca freda w /etc/passwd zmieniłaby się na:
fred:*:505:100:Fred Flinstone:/home/fred:/bin/tcsh
Załóżmy, że chcemy, żeby konto freda wygasło 15.09.1997:
usermod -e 09/15/97 fred <-- data w stylu angielskim-amerykańskim (mmddrr)
Teraz pozycja dotycząca freda w /etc/shadow zmieniłaby się na:
fred:J0C.WDR1amIt6:9559:0:60:0:0:10119:0
Więcej informacji na temat usermod znajdziesz w podręczniku
systemowym.
77..11..33.. uusseerrddeell..
userdel robi dokładnie to czego się spodziewałeś - kasuje konto
podanego użytkownika. Użycie jest proste:
userdel -r
Opcja -r powoduje skasowanie wszystkich plików z katalogu domowego
użytkownika. Plików zlokalizowanych w innym systemie plików trzeba
poszukać i skasować je ręcznie.
Jeśli chcesz tylko zablokować dane konto, a nie skasować to użyj
polecenia passwd.
77..22.. PPoolleecceenniiee ppaasssswwdd ii ""tteerrmmiinn wwaażżnnoośśccii"" hhaassłłaa..
Polecenie passwd używane jest do zmiany hasła. Oprócz tego używane
jest przez "root-a" do:
Blokowania i odblokowywania kont (-l i -u)
Ustawiania maksymalnej ilości dni przez jaką hasło jest ważne (-x)
Ustawiania minimalnej ilości dni między zmianami hasła (-n)
Ustawiania ilości dni, po których wysyłane jest ostrzeżenie o
wygaśnięciu hasła (-w)
Ustawiania ilości dni, po której hasło wygasa przed zablokowaniem
konta (-i)
Pozwalania na przeglądanie informacji o koncie w czytelniejszym
formacie (-S)
Na przykład, spójrzmy jeszcze raz na freda:
passwd -S fred
fred P 03/04/96 0 60 0 0
Oznacza to, że hasło freda jest ważne, ostatnio było zmieniane
04.03.1996, może być zmienione w każdej chwili, wygasa po 60 dniach,
fred nie zostanie ostrzeżony oraz konto nie zostanie zablokowane po
wygaśnięciu hasła.
Oznacza to po prostu tyle, że kiedy fred zaloguje się po wygaśnięciu
hasła zostanie zaraz na początku poproszony o podanie nowego hasła.
Jeśli zdecydujemy się, że chcemy ostrzec freda na 14 dni przed
wygaśnięciem jego hasła i zablokować jego konto 14 dni po wygaśnięciu
hasła trzebaby napisać tak:
passwd -w14 -i14 fred
Teraz dane o fredzie zmianiły się na:
fred P 03/04/96 0 60 14 14
Więcej informacji na temat passwd znajdziesz w podręczniku systemowym.
77..33.. PPlliikk llooggiinn..ddeeffss
Plik /etc/login jest plikiem konfiguracyjnym dla programu login oraz
dla całego pakietu _S_h_a_d_o_w _S_u_i_t_e.
/etc/login zawiera ustawienia od tego jak będą wyglądać znaki zachęty
do tego jakie domyślne wartości będą dla wygasania hasła kiedy
użytkownik je sobie zmieni.
Plik /etc/login.defs jest dość dobrze udokumentowany już przez same
komentarze w nim zawarte. Chociaż jest kilka rzeczy do odnotowania:
Zawiera opcje, które mogą być włączane i wyłączane do określania
ilości zalogowań.
Zawiera wskazania na inne pliki konfiguracyjne.
Zawiera domyślne wartości dla takich ustawień jak "termin ważności"
hasła.
Z powyższej listy wynika, że jest to raczej ważny plik i powinieneś
się upewnić, że istnieje i że ustawienia są takie jak chciałeś.
77..44.. HHaassłłaa ddllaa ggrruupp..
Plik /etc/groups może zawierać hasła, które pozwalają użytkownikom
dołączyć się do jakiejś grupy. Funkcja ta jest włączona jeśli
zdefiniujesz stałą SHADOWGRP w pliku /usr/src/shadow-YYMMDD/config.h .
Jeśli ją zdefiniujesz i skompilujesz pakiet, musisz utworzyć plik
/etc/gshadow, żeby trzymać tam hasła grup i informacje
administracyjne.
Do utworzenia pliku /etc/shadow użyłeś programu pwconv; nie ma
odpowiednika do utworzenia pliku /etc/gshadow, ale to nie ma znaczenia
bo plik ten sam się sobą zajmuje.
Aby stworzyć początkowy plik /etc/gshadow zrób tak:
touch /etc/gshadow
chown root.root /etc/gshadow
chmod 700 /etc/gshadow
Jak będziesz tworzył nowe grupy, zostaną one dodane do /etc/group i
/etc/gshadow.
Do modyfikacji grup służą programy dostarczane wraz z pakietem _S_h_a_d_o_w
_S_u_i_t_e: groups, groupadd, groupmod i groupdel.
Format pliku /etc/group jest taki:
nazwa_grupy:!:GID:członek,członek,...
Gdzie:
nnaazzwwaa__ggrruuppyy
- chyba nie wymaga wyjaśniania :)
!! - w tym miejscu normalnie byłoby hasło, ale teraz jest ono w
gshadow
GGIIDD
- numer grupy
cczzłłoonneekk
- lista członków grupy.
Format pliku /etc/gshadow jest taki:
nazwa_grupy:hasło:admin,admin,...:członek,członek,...
Gdzie:
nnaazzwwaa__ggrruuppyy
- chyba nie wymaga wyjaśniania :)
hhaassłłoo
- zakodowane hasło grupy
aaddmmiinn
- lista administratorów grupy
cczzłłoonneekk
- lista członków grupy
Polecenie gpasswd jest używane tylko do dodawania i usuwania członków
do/z grupy. "root" i każdy z administratorów grupy może usuwać i
dodawać członków.
Hasło dla grupy może być zmienione za pomocą polecenia passwd przez
"root-a" i każdego z administratorów grupy.
Chociaż nie ma strony do podręcznika systemowego dla gpasswd, to
zrozumienie opcji tego polecenia nie jest takie trudne jak już
rozumiesz jego format i koncept. gpasswd bez żadnych parametrów poda
opcje jakie przyjmuje.
77..55.. PPrrooggrraammyy ddoo sspprraawwddzzaanniiaa ppoopprraawwnnoośśccii..
77..55..11.. ppwwcckk
Program pwck sprawdza poprawność plików /etc/passwd i /etc/shadow.
Sprawdzi każdego użytkownika czy ma:
poprawną ilość pól,
unikalny identyfikator,
dobry UID i GID
dobrą grupę domyślną
poprawny katalog domowy
poprawną powłokę
Ostrzeże nas także jeśli znajdzie konta bez haseł.
Uruchomienie tego programu po zainstalowaniu pakietu _S_h_a_d_o_w _S_u_i_t_e jest
dobrym pomysłem. Powinno sie go także uruchamiać okresowo - co
tydzień, co miesiąc. Jeśli użyjesz opcji -r, to możesz użyć programu
cron, aby uruchamiać pwck okresowo i dostawać raport pocztą.
77..55..22.. ggrrppcckk
Program ten sprawdza poprawność plików /etc/group i /etc/gshadow.
Sprawdza:
ilość pól,
unikalną nazwę grupy
poprawność listy administratorów i członków.
Ma także opcję -r do automatycznych raportów.
77..66.. HHaassłłaa pprrzzeezz tteelleeffoonn.. ((DDiiaall--uupp))
Hasła przez telefon są inną opcjonalną linią obrony dla systemów,
które umożliwiają dostęp przez telefon. Jeśli masz system z dużą
ilośćią użytkowników łączących się lokalnie albo poprzez sieć, ale
chcesz ograniczyć kto może sie połączyć, to "hasła przez telefon" są
dla ciebie. Aby właczyć "hasła przez telefon" musisz wyedytować plik
/etc/login.defs i upewnić się, że DIALUPS_CHECK_ENAB jest ustawione na
yes.
Są dwa pliki, które zawierają informacje o połączeniach przez telefon:
/etc/dialups, który zawiera "tty" (jeden na linię bez "/dev/"). Jeśli
dany tty jest tam zawarty to połączenie jest sprawdzane; oraz
/etc/d_passwd z pełną ścieżką dostępu do powłoki oraz opcjonalnym
hasłem.
Jeśli użytkownik zaloguje się na linię, która jest podana w
/etc/diulups i jego powłoka jest podana w /etc/d_passwd, to będzie
mógł się zalogować tylko po podaniu poprawnego hasła.
Innym użytecznym celem "haseł przez telefon" może być ustawienie
linii, która pozwala tylko na połączenia konkretnego rodzaju (np. PPP
lub/i UUCP). Jeśli użytkownik próbuje się połączyć inaczej (np. listą
powłok), to musi znać hasło na tę linię.
Zanim będziesz mógł używać tych właściwości musisz stworzyć te pliki.
Polecenie dpasswd przypisuje hasła do konkretnych powłok zawartych w
pliku /etc/d_passwd. Więcej informacji znajdziesz na stronie
podręcznika systemowego.
88.. OObbssłłuuggaa pprrzzeessłłaanniiaannyycchh hhaasseełł ww pprrooggrraammaacchh ww CC..
Dodawanie obsługi haseł przesłanianych do programów jest całkiem
proste. Jedynym problemem jest to, że program musi zostać uruchomiony
z prawami "root-a", aby mieć dostęp do pliku /etc/shadow.
Tutaj pojawia się jeden wielki problem: podczas pisania takich
programów należy się trzymać jak najściślej zasad bezpieczeństwa. Na
przykład jeśli program posiada wyjście do powłoki, to nniiee mmoożżee się to
zdarzyć na prawach "root-a".
Jeśli program musi mieć dostęp do /etc/shadow i nie potrzebuje więcej
praw "root-a", to lepiej uruchomić go z prawami grupy "shadow".
Program xlock jest przykładem takiego programu.
W przykładzie podanym niżej, pppd-1.2.1d jest już uruchomiony z
prawami "root-a", tak więc dodanie obsługi haseł przesłanianych nie
powinno zagrozić bezpieczeństwu.
88..11.. PPlliikkii nnaaggłłóówwkkoowwee..
Pliki te powinny znajdować się w /usr/include/shadow. Powinien tam
być także plik /usr/include/shadow.h, ale będzie to symboliczne
dołaczenie do /usr/include/shadow/shadow.h.
Aby dodać obsługę haseł przesłanianych do programu, musisz dołączyć
pliki nagłówkowe:
#include
#include
Dobrym pomysłem byłoby użycie dyrektyw kompilatora, aby skompilować
warunkowo kod z obsługą haseł przesłanianych. (tak jak w przykładzie
poniżej.)
88..22.. BBiibblliiootteekkaa lliibbsshhaaddooww..aa
Biblioteka ta została zainstalowana w /usr/lib jak instalowałeś pakiet
_S_h_a_d_o_w _S_u_i_t_e.
Kiedy kompilujesz obsługę przesłaniancyh haseł w programie trzeba
poinformować "linker-a", aby dołączył bibliotekę libshadow.a.
Robi się to tak:
gcc program.c -o program -lshadow
Chociaż jak zobaczymy w poniższym przykładzie, większość dużych
programów używa plików Makefile i ma zwykle zmienną LIBS=..., którą
się modyfikuje.
88..33.. SSttrruukkttuurraa SShhaaddooww..
Biblioteka libshadow.a używa struktury spwd dla informacji, które
otrzyma z pliku /etc/shadow. Oto definicja tej struktury wzięta z
/usr/include/shadow/shadow.h:
______________________________________________________________________
struct spwd
{
char *sp_namp; /* identyfikator */
char *sp_pwdp; /* zakodowane hasło */
sptime sp_lstchg; /* data ostatniej zmiany */
sptime sp_min; /* minimalna ilość dni między zmianami */
sptime sp_max; /* maksymalna ilość dni między zmianami */
sptime sp_warn; /* ilość dni przed wygaśnięciem hasła
kiedy będzie wysyłane ostrzeżenie */
sptime sp_inact; /* ilość dni, po jakiej wygasa hasło
dopóki konto nie będzie zablokowane */
sptime sp_expire; /* ilość dni od 01.01.1970 dopóki
konto nie wygaśnie */
unsigned long sp_flag; /* zarezerwowane na przyszłość */
};
______________________________________________________________________
Do pola sp_pwdp można dodatkowo wstawić nawzę programu:
identyfikator:Npge08pfz4wuk;@/sbin/extra:9479:0:10000::::
Oznacza to, że oprócz podania hasła będzie wykonany program
/sbin/extra, który wykona dalszą autentykację. Wywołany program
otrzyma identyfikator i przełącznik, który określi dlaczego został
wywołany. Więcej informacji znajdziesz w /usr/include/shadow/pwauth.h
i pwauth.c.
Oznacza to, że powinniśmy użyć funkcji pwauth do przeprowadzenia
poprawnej autentykacji, ponieważ zajmie się ona także drugą
autentykacją. Jest to użyte w przykładzie poniżej.
Autor pakietu _S_h_a_d_o_w _S_u_i_t_e twierdzi, że odkąd większość programów tego
nie stosuje, może to zostać usunięte lub zmienione w przyszłych
wersjach pakietu.
88..44.. FFuunnkkccjjee ppaakkiieettuu SShhaaddooww SSuuiittee..
Plik shadow.h zawiera deklaracje funkcji zawartych w bibliotece
libshadow.a:
______________________________________________________________________
extern void setspent __P ((void));
extern void endspent __P ((void));
extern struct spwd *sgetspent __P ((__const char *__string));
extern struct spwd *fgetspent __P ((FILE *__fp));
extern struct spwd *getspent __P ((void));
extern struct spwd *getspnam __P ((__const char *__name));
extern int putspent __P ((__const struct spwd *__sp, FILE *__fp));
______________________________________________________________________
Funkcja, którą użyjemy w przykładzie to getspnam, która odczyta
strukturę spwd dla podanego identyfikatora.
88..55.. PPrrzzyykkłłaadd..
Jest to przykład na dodanie obsługi haseł przesłanianych do programu,
który tego potrzebuje, ale nie ma domyślnie włączonego.
Przykład ten używa serwera _P_o_i_n_t_-_t_o_-_P_o_i_n_t _P_r_o_t_o_c_o_l (pppd-1.2.1d),
który ma tryb do autentykacji _P_A_P używając identyfikatora i hasła z
pliku /etc/passwd zamiast z plików _P_A_P czy _C_H_A_P. Nie musisz dodawać
tego kodu do pppd-2.2.0, ponieważ on już tam jest.
Ta właściwość pppd przypuszczalnie nie jest często używana, ale jeśli
zainstalowałeś _S_h_a_d_o_w _S_u_i_t_e, to serwer ten nie będzie działał ponieważ
hasła nie są już zapisywane w /etc/passwd.
Kod do autentykacji użytkowników przez pppd-1.2.1d umieszczony jest w
pliku /usr/src/pppd-1.2.1d/pppd/auth.c.
Poniższy kod musi zostać dodany na początku pliku gdzie znajdują się
wszystkie inne dyrektywy #include. Otoczyliśmy je dyrektywami
warunkowymi (czyli skompilują się tylko jeśli kompilujemy z właczoną
obsługą haseł przesłanianych).
______________________________________________________________________
#ifdef HAS_SHADOW
#include
#include
#endif
______________________________________________________________________
Następnym krokiem jest modyfikacja właściwiego kodu. Ciągle
modyfikujemy plik auth.c.
Funkcja auth.c przed modyfikacją:
______________________________________________________________________
/*
* login - Check the user name and password against the system
* password database, and login the user if OK.
*
* returns:
* UPAP_AUTHNAK: Login failed.
* UPAP_AUTHACK: Login succeeded.
* In either case, msg points to an appropriate message.
*/
static int
login(user, passwd, msg, msglen)
char *user;
char *passwd;
char **msg;
int *msglen;
{
struct passwd *pw;
char *epasswd;
char *tty;
if ((pw = getpwnam(user)) == NULL) {
return (UPAP_AUTHNAK);
}
/*
* XXX If no passwd, let them login without one.
*/
if (pw->pw_passwd == '\0') {
return (UPAP_AUTHACK);
}
epasswd = crypt(passwd, pw->pw_passwd);
if (strcmp(epasswd, pw->pw_passwd)) {
return (UPAP_AUTHNAK);
}
syslog(LOG_INFO, "user %s logged in", user);
/*
* Write a wtmp entry for this user.
*/
tty = strrchr(devname, '/');
if (tty == NULL)
tty = devname;
else
tty++;
logwtmp(tty, user, ""); /* Add wtmp login entry */
logged_in = TRUE;
return (UPAP_AUTHACK);
}
______________________________________________________________________
Hasło użytkownika jest umieszczane w pw->pw_passwd, tak że wszystko co
musimy zrobić, to dodać funkcję getspnam. Umieści to hasło w
spwd->sp_pwdp.
Dodamy funkcję pwauth, aby przeprowadzić właściwą autentykację.
Przeprowadzi to także drugą autentykację jeśli plik shadow jest
odpowiednio ustawiony.
Funkcja auth.c po modyfikacji do obsługi haseł przesłanianych:
______________________________________________________________________
/*
* login - Check the user name and password against the system
* password database, and login the user if OK.
*
* This function has been modified to support the Linux Shadow Password
* Suite if USE_SHADOW is defined.
*
* returns:
* UPAP_AUTHNAK: Login failed.
* UPAP_AUTHACK: Login succeeded.
* In either case, msg points to an appropriate message.
*/
static int
login(user, passwd, msg, msglen)
char *user;
char *passwd;
char **msg;
int *msglen;
{
struct passwd *pw;
char *epasswd;
char *tty;
#ifdef USE_SHADOW
struct spwd *spwd;
struct spwd *getspnam();
#endif
if ((pw = getpwnam(user)) == NULL) {
return (UPAP_AUTHNAK);
}
#ifdef USE_SHADOW
spwd = getspnam(user);
if (spwd)
pw->pw_passwd = spwd->sp-pwdp;
#endif
/*
* XXX If no passwd, let NOT them login without one.
*/
if (pw->pw_passwd == '\0') {
return (UPAP_AUTHNAK);
}
#ifdef HAS_SHADOW
if ((pw->pw_passwd && pw->pw_passwd[0] == '@'
&& pw_auth (pw->pw_passwd+1, pw->pw_name, PW_LOGIN, NULL))
|| !valid (passwd, pw)) {
return (UPAP_AUTHNAK);
}
#else
epasswd = crypt(passwd, pw->pw_passwd);
if (strcmp(epasswd, pw->pw_passwd)) {
return (UPAP_AUTHNAK);
}
#endif
syslog(LOG_INFO, "user %s logged in", user);
/*
* Write a wtmp entry for this user.
*/
tty = strrchr(devname, '/');
if (tty == NULL)
tty = devname;
else
tty++;
logwtmp(tty, user, ""); /* Add wtmp login entry */
logged_in = TRUE;
return (UPAP_AUTHACK);
}
______________________________________________________________________
Po dokładnym prześledzaniu tego kodu okaże się, że zrobiliśmy jeszcze
jedną zmianę. Oryginalna wersja pozwalała na dostęp (zwracała
UPAP_AUTHACK) jeśli nniiee bbyyłłoo hasła w pliku /etc/passwd. Nie jest to
dobrze, ponieważ popularnym użyciem tej właściwości programu login
jest używanie jednego konta, na dostęp do programu PPP, a potem
sprawdzenie identyfikatora i hasła dostarczonych przez PAP z tymi w
plikach /etc/passwd i /etc/shadow.
Tak więc jeśli ustwilibyśmy oryginalną wersję, aby uruchamiała powłokę
dla użytkownika np. ppp, to każdy mógłby uzyskać połączenie ppp przez
podanie identyfikatora ppp i pustego hasła.
Poprawiliśmy to przez zwrócenie UPAP_AUTHNAK zamiast UPAP_AUTHACK
jeśli pole z hasłem jest puste.
Interesujące jest to, że pppd-2.2.0 ma ten sam problem.
Następnie musimy zmodyfikować plik Makefile tak, żeby pojawiły się
dwie rzeczy:
USE_SHADOW musi być zdefiniowane i libshadow.a musi być dodana w
procesie "linkowania".
Wyedytuj plik Makefile i dodaj:
LIBS = -lshadow
Potem znajdź linię:
COMPILE_FLAGS = -I.. -D_linux_=1 -DGIDSET_TYPE=gid_t
i zmień ją na:
COMPILE_FLAGS = -I.. -D_linux_=1 -DGIDSET_TYPE=gid_t -DUSE_SHADOW
Teraz kompilacja i instalacja.
99.. CCzzęęssttoo zzaaddaawwaannee ppyyttaanniiaa..
_P_: Kiedyś kontrolowałem terminale z jakich mógł się logować "root"
przez plik /etc/securettys, teraz nie wygląda na to żeby działało. Co
jest grane ?
_O_: Teraz kiedy pakiet _S_h_a_d_o_w _S_u_i_t_e jest zainstalowany plik
/etc/securettys nie ma żadnego znaczenia. Terminale, z których może
się zalogować "root" są teraz podawane w pliku konfiguracyjnym
/etc/login.defs. Pozycja w tym pliku może wskazywać na jakiś inny
plik.
_P_: Zainstalowałem pakiet _S_h_a_d_o_w _S_u_i_t_e i nie mogę się zalogować, co
przegapiłem ?
_O_; Przypuszczalnie zainstalowałeś pakiet i zapomniałeś uruchomić
program pwconv albo zapomniałeś skopiować /etc/npasswd na /etc/passwd
oraz /etc/nshadow na /etc/shadow. Możesz musisz także skopiować
login.defs do /etc.
_P_: W sekcji o "xlock-u" było napisane, żeby zmienić grupę pliku
/etc/shadow na shadow, ale ja nie mam takiej grupy - co mam zrobić ?
_O_: Możesz ją dodać. Po prostu wyedytuj plik /etc/group i dodaj linię
definiującą grupę shadow. Musisz się upewnić, że numer grupy nie jest
używany przez żadną inną i musisz ją dodać przed pozycją nogroup. Albo
po prostu ustaw bit SUID dla programu xlock.
_P_: Jest jakaś lista dyskusyjna dla Linux Shadow Password Suite ?
_O_: Tak, ale jest ona dla rozwijających ten pakiet i dla testujących
wersje BETA. Możesz się zapisać na tę listę wysyłając list na adres
_s_h_a_d_o_w_-_l_i_s_t_-_r_e_q_u_e_s_t_@_n_e_p_t_u_n_e_._c_i_n_._n_e_t o tytule _s_u_b_s_c_r_i_b_e. Na liście tej
dyskutuje się właściwie o konkretnej serii shadow-YYMMSS. Powinieneś
się na nią zapisać jeśli chcesz być włączony do dalszego rozwoju albo
jeśli zainstalowałeś sobie ten pakiet i chcesz wiedzieć o nowszych
wersjach.
_P_: Zainstalowałem _S_h_a_d_o_w _S_u_i_t_e, ale kiedy używam polecenia userdel
dostaję: "userdel: cannot open shadow group file" - co zrobiłem źle ?
_O_: Skompilowałeś pakiet z włączoną opcją SHADOWGRP, ale nie masz pliku
/etc/gshadow. Musisz albo wyedytować plik config.h i skompilować
ponownie pakiet albo stworzyć plik /etc/gshadow. Zobacz sekcję
dotyczącą przesłanianych grup.
_P_: Zainstalowałem _S_h_a_d_o_w _S_u_i_t_e, ale zakodowane hasła pojawiają się w
pliku /etc/passwd, co jest ?
_O_: Albo właczyłeś opcję AUTOSHADOW w pliku config.h, albo twoja
biblioteka libc była skompilowana z opcją SAHDOW_COMPAT. Musisz
dowiedzieć się, które z tych dwóch jest prawdziwe i skompilować
ponownie.
1100.. PPrraawwaa aauuttoorrsskkiiee ppooddzziięękkoowwaanniiaa ii rróóżżnnee..
1100..11.. PPrraawwaa aauuttoorrsskkiiee
Linux Shadow Password HOWTO jest chronione prawami autorskimi Michaela
H. Jacksona.
Dozwolone jest dystrybuowanie kopii tego dokumentu zakładając, że
wzmianka o prawach autorskich i to pozwolenie jest zawarte we
wszystkich kopiach.
Dozwolone jest dytrybuowanie i kopiowanie modyfikowanych wersji tego
dokumentu pod warunkami kopiowania z powyższego akapitu, zakładając,
że zawarta jest jasna informacja, że jest to wersja modyfikowana tego
dokumentu.
Dozwolone jest kopiowanie i dystrybucja tłumaczeń tego dokumentu na
inne języki pod warunkami dla wersji modyfikowanych wymienionymi
wyżej.
Dozwolone jest konwertowanie tego dokumentu na inne media pod
warunkami podanymi powyżej dla wersji modyfikowanych zakładając, że
informacja o źródle nowego dokumentu jest zawarta przez oczywisty
odnośnik do dokumentu źródłowego w nowej wersji tego dokumentu. Jeśli
występują jakieś wątpliowści co do słowa "oczywiste", właściciel praw
autorskich rezerwuje sobie prawo decyzji.
1100..22.. PPooddzziięękkoowwaanniiaa ii rróóżżnnee..
Przykłady kodów dla auth.c zostały wzięte z pppd-1.2.1d i ppp-2.1.0e,
Copyright (c) 1993 and The Australian National University oraz
Copyright (c) 1989 Carnegie Mellon University.
Podziękowania dla Marka Michałkiewicza
za napisanie i opiekę nad pakietem
_S_h_a_d_o_w _S_u_i_t_e dla Linux-a oraz za przejrzenie i komentarze do tego
dokumentu.
Podziękowania dla Rona Tidda za jego pomocne
przejrzenie i testowanie.
Podziękowania dla wszystkich, którzy przysłali do mnie komentarze, aby
pomóc w ulepszeniu tego dokumentu.
Jeśli masz jakieś uwagi lub sugestie to napisz do mnie proszę,
z poważaniem
Michael H. Jackson
1100..33.. OOdd ttłłuummaacczzaa..
Tłumaczenie to jest chronione prawami autorskimi Bartosza
Maruszewskiego. Dozwolone jest rozprowadzanie i dystrybucja na
prawach takich samych jak dokument oryginalny.
Jeśli znalazłeś jakieś rażące błędy ortograficzne, gramatyczne,
składniowe, techniczne to pisz do mnie:
B.Maruszewski@zsmeie.torun.pl
Oficjalną stroną tłumaczeń HOWTO jest http://www.jtz.org.pl/
Aktualne wersje przetłumaczonych dokumentów znajdują się na tejże
stronie. Dostępne są także poprzez anonimowe ftp pod adresem
ftp.ippt.gov.pl w katalogu /pub/Linux/JTZ/.
Przetłumaczone przeze mnie dokumenty znajdują się także na mojej
stronie WWW. Są
tam też odwołania do Polskiej Strony Tłumaczeniowej.
Kontakt z naszą grupą, grupą tłumaczy możesz uzyskać poprzez listę
dyskusyjną jtz@ippt.gov.pl. Jeśli chcesz sie na nią zapisać, to wyślij
list o treści subscribe jtz Imię Nazwisko na adres
listproc@ippt.gov.pl
Zmiany w tym dokumencie wprowadzone przez tłumacza to:
- "chmod 700 /etc/login/defs" na "chmod 600 /etc/login.defs" plik
ten nie musi być wykonywalny,
- "cp passwd ~passwd" na "cp passwd ~/passwd" - ewidentna literówka
autora
- "chmod 600 ~passwd" na "chmod 600 ~/passwd" - to samo
- przy zmianie grupy pliku /etc/shadow dodane "cd /etc"
- oraz polskie serwery WWW i ftp.
Wyszukiwarka
Podobne podstrony:
Shadow Password HOWTO pl 10 (2)
Shadow Password HOWTO pl 8 (2)
Shadow Password HOWTO pl (3)
Shadow Password HOWTO pl 5 (2)
Shadow Password HOWTO pl (2)
Shadow Password HOWTO pl 6 (2)
Shadow Password HOWTO pl 9 (2)
Shadow Password HOWTO pl 2 (2)
Shadow Password HOWTO pl 7 (2)
Shadow Password HOWTO pl 1 (2)
Shadow Password HOWTO pl 4 (2)
Shadow Password HOWTO pl 3 (2)
shadow password howto 4 wrjj4xl2rttpywxk645hll3i63bvo7zfmqmiewy wrjj4xl2rttpywxk645hll3i63bvo7zfmqmi
shadow password howto 5 xwj2yqx7sdr7adin3jsjtftaoqyivxcflwawaqa xwj2yqx7sdr7adin3jsjtftaoqyivxcflwaw
shadow password howto 2 foxyypsfur2dgvcm757tzpjjjqzxkvhcxqxuazi foxyypsfur2dgvcm757tzpjjjqzxkvhcxqxu
shadow password howto xaxuxvyqvflgb5m452rbxlszzlk756szuoenxpa xaxuxvyqvflgb5m452rbxlszzlk756szuoenxp
shadow password howto 6 wekeaom5hhmqmfgscm4mih3yeed3zer56aqewwa wekeaom5hhmqmfgscm4mih3yeed3zer56aqe
shadow password howto 9 rrzkcxlxnah6g6g76dgcjvmvfeeihhseu43rxfi rrzkcxlxnah6g6g76dgcjvmvfeeihhseu43r
shadow password howto 1 jvl6nxop7fpn62s67zmft74rytj65xu7oqy4xdi jvl6nxop7fpn62s67zmft74rytj65xu7oqy4
więcej podobnych podstron