# Przesłanianie haseł (Shadow Password)

## Autor: Michael H. Jackson, mhjack@tscnet.com
v1.3, 3 Kwietnia 1996
Wersja polska: Bartosz Maruszewski B.Maruszewski@jtz.org.pl
v1.02, 26 Lipca 1997

Dokument ten opisuje jak zdobyć, zainstalować i skonfigurować pakiet Shadow Password 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 Shadow Suite, 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 katalogu /pub/Linux/sunsite/docs/HOWTO.

## 1. Wprowadzenie.

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 Shadow Suite.

Podczas instalacji pakietu oraz używania jego narzędzi musisz być zalogowany jako "root". 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.

## 1.1 Zmiany w stosunku do poprzedniej wersji.

    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

## 1.2 Nowe wersje tego dokumentu.

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.

## 1.3 Komentarze.

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.

## 2. Po co przesłaniać plik passwd ?

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:

- 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.

## 2.1 Czemu możesz nie chcieć przesłaniać swojego pliku z hasłami ?

Jest kilka okoliczności i konfiguracji, w których instalacja pakietu `Shadow Suite` nie byłaby 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ł.

## 2.2 Format pliku /etc/passwd.

Nieprzesłonięty plik /etc/passwd ma następujący format:

    identyfikator:hasło:UID:GID:imie_nazw:katalog:powłoka

Gdzie:

`identyfikator`

  Nazwa (login) użytkownika

`hasło`

  Zakodowane hasło

`UID`

  Numer użytkownika

`GID`

  Numer domyślnej grupy dla użytkownika

`imie_nazw`

  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.

`katalog`

  Katalog domowy użytkownika (pełna ścieżka)

`powłoka`

  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 '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)

## 2.3 Format pliku przesłaniającego.

Plik `/etc/shadow` zawiera następujące informacje:

    login:hasło:ostatnio_1970:może:musi:ostrz:dni:dni_1970:zarez

Gdzie:

`login`

  patrz /etc/passwd

`hasło`

  Zakodowane hasło

`ostatnio_1970`

  Ilość dni od 1 Stycznia 1970, kiedy hasło było ostatnio modyfikowane

`może`

  Ilość dni w przeciągu, których hasło może być zmienione

`musi`

  Ilość dni, po której hasło musi zostać zmienione

`ostrz`

  Ilość dni przed wygaśnięciem hasła od jakiej należy zacząć informować użytkownika o wygaśnięciu hasła.

`dni`

  Ilość dni, po której hasło wygasa i konto jest blokowane

`dni_1970`

  Ilość dni od 1 Stycznia 1970, po której konto jest blokowane

`zarez`

  Pole zarezerwowane

Poprzedni przykład mógł więc wyglądać tak:

    login:Nkjg97jh7yff8:9479:0:10000::::

## 2.4 Przegląd funkcji crypt(3).

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

## 3. Zdobywanie pakietu Shadow Suite.

## 3.1 Historia pakietu Shadow Suite dla Linux-a.

NIE UŻYWAJ PAKIETÓW WYMIENIONYCH W TEJ SEKCJI, SĄ W NICH PROBLEMY Z BEZPIECZEŃSTWEM.

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 <flla@stud.uni-sb.de>. 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 <magnus@texas.net>, 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 poprzednio rekomendowanym, ale powinien zostać zamieniony z powodu problemów 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 root-a. 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 bez 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)

## 3.2 Gdzie znaleźć pakiet Shadow Suite.

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 <marekm@i17linuxb.ists.pwr.wroc.pl>.

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.

NIE powinieneś używać wersji starszej 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ś,

## 3.3 Co jest zawarte w pakiecie Shadow Suite.

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`.

## 4. Kompilacja programów.

## 4.1 Rozpakowywanie archiwów.

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.

## 4.2 Konfiguracja w pliku config.h

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 zalecanego 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ą musisz stworzyć plik `/etc/gshadow`.

Włączanie opcji pozwalającej na dłuższe hasła nie 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` (i hasło nie jest już przesłonięte).

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. Nie powinna 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.

## 4.3 Kopie zapasowe twoich oryginalnych programów.

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.

## 4.4 Polecenie make

Aby zainstalować pakiet musisz być zalogowany jako "root".

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.

## 5. Instalacja

## 5.1 Zaopatrz się w dyskietkę startową w razie gdybyś coś popsuł.

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ą.

## 5.2 Usuwanie zduplikowanych stron podręcznika systemowego.

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.

## 5.3 Polecenie make install

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 tylko "root" 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ł).

## 5.4 Polecenie pwconv

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`.

## 5.5 Zmiany nazw plików npasswd i nshadow

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ć XWindows, 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ć

Zrób to teraz - naprawdę !

Jeśli nie możesz, to coś jest nie tak ! Aby powrócić do stanu sprzed instalacji Shadow Suite 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.

## 6. Inne programy, które może musisz uaktualnić albo "załatać".

Pomimo, iż pakiet Shadow Suite 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ę Debian (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ł.)

## 6.1 Program adduser z dystrybucji Slackware.

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 Shadow Suite (`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

## 6.2 Serwer wu_ftpd.

Wraz z większością dystrybucji Linux-a przychodzi serwer `wu_ftpd`. Jeśli twoja dystrybucja nie instaluje domyślnie pakietu Shadow Suite, 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 "root-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 "root". (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.

## 6.3 Standardowy ftpd.

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 NIS, to na SUNSite Polska znajdziesz ftpd-shadow-nis.tgz.

## 6.4 pop3d (Post Office Protocol 3)

Jeśli potrzebujesz obsługi Post Office Protocol 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.

## 6.5 xlock

Jeśli zainstalujesz pakiet Shadow Suite i uruchomisz XWindows, 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.

## 6.6 xdm

`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.

## 6.7 sudo

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.`

Uwaga: 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

## 6.9 pppd (Serwer Protokołu Point-to-Point)

Serwer pppd może zostać tak ustawiony, aby używał różnych typów autentykacji:
Password Authentication Protocol (PAP) i Cryptographic Handshake Authentication Protocol (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 login-u (albo z wiersza poleceń, albo z pliku konfiguracyjnego, albo z pliku z opcjami). Jeśli jest podana jakaś opcja login-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ł.

## 7. Wprowadzanie pakietu Shadow Suite do użycia.

Sekcja ta opisuje kilka rzeczy które będziesz chciał wiedzieć jak już zainstalowałeś pakiet Shadow Suite. Dalsze informacje zawarte są na stronach podręcznika systemowego na temat każdego polecenia.

## 7.1 Dodawanie, Modyfikacja i usuwanie użytkowników.

Pakiet Shadow Suite 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`).

### useradd.

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 Shadow Suite 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 <mhjack@tscnet.com> 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.

### usermod.

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.

### userdel.

`userdel` robi dokładnie to czego się spodziewałeś - kasuje konto podanego użytkownika. Użycie jest proste:

    userdel -r <identyfikator>

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`.

## 7.2 Polecenie passwd i "termin ważności" hasła.

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.

## 7.3 Plik login.defs

Plik `/etc/login` jest plikiem konfiguracyjnym dla programu `login` oraz dla całego pakietu Shadow Suite.

`/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ś.

## 7.4 Hasła dla grup.

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 Shadow Suite: `groups`, `groupadd`, `groupmod` i `groupdel`.

Format pliku `/etc/group` jest taki:

    nazwa_grupy:!:GID:członek,członek,...

Gdzie:

`nazwa_grupy`

  - chyba nie wymaga wyjaśniania :)

`!`

  - w tym miejscu normalnie byłoby hasło, ale teraz jest ono w gshadow

`GID`

  - numer grupy

`członek`

  - lista członków grupy.

Format pliku `/etc/gshadow` jest taki:

    nazwa_grupy:hasło:admin,admin,...:członek,członek,...

Gdzie:

`nazwa_grupy`

  - chyba nie wymaga wyjaśniania :)

`hasło`

  - zakodowane hasło grupy

`admin`

  - lista administratorów grupy

`członek`

  - 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.

## 7.5 Programy do sprawdzania poprawności.

### pwck

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 Shadow Suite 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ą.

### grpck

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.

## 7.6 Hasła przez telefon. (Dial-up)

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.

## 8. Obsługa przesłanianych haseł w programach w C.

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 nie może 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.

## 8.1 Pliki nagłówkowe.

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 <shadow/shadow.h>
    #include <shadow/pwauth.h>

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.)

## 8.2 Biblioteka libshadow.a

Biblioteka ta została zainstalowana w `/usr/lib` jak instalowałeś pakiet Shadow Suite.

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.

## 8.3 Struktura Shadow.

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 Shadow Suite twierdzi, że odkąd większość programów tego nie stosuje, może to zostać usunięte lub zmienione w przyszłych wersjach pakietu.

## 8.4 Funkcje pakietu Shadow Suite.

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.

## 8.5 Przykład.

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 Point-to-Point Protocol (pppd-1.2.1d), który ma tryb do autentykacji PAP używając identyfikatora i hasła z pliku `/etc/passwd` zamiast z plików PAP czy CHAP. 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ś Shadow Suite, 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 <shadow.h>
    #include <shadow/pwauth.h>
    #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 nie było 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.

## 9. Często zadawane pytania.

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 Shadow Suite 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 Shadow Suite 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 shadow-list-request@neptune.cin.net o tytule subscribe. 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 Shadow Suite, 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 Shadow Suite, 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.

## 10. Prawa autorskie podziękowania i różne.

## 10.1 Prawa autorskie

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.

## 10.2 Podziękowania i różne.

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 <marekm@i17linuxb.ists.pwr.wroc.pl> za napisanie i opiekę nad pakietem Shadow Suite dla Linux-a oraz za przejrzenie i komentarze do tego dokumentu.

Podziękowania dla Rona Tidda <rtidd@tscnet.com> 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 <mhjack@tscnet.com>

## 10.3 Od tłumacza.

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@jtz.org.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.jtz.org.pl w katalogu `/HOWTO/`.

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 `majordomo@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.

###