SYSTEMY OPERACYJNE:

PAM – Opis modułów i konfiguracji

 

 

 

Piotr Zub

pz197829@students.mimuw.edu.pl

 

5.01.2003

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

SPIS TREŚCI:

 

1.KONFIGURACJA PRZY POMOCY PLIKU /etc/pam.conf

1.1 Notacja skrócona

1.2 Notacja szczegółowa

 

2. KONFIGURACJA W OPARCIU O KATALOG /etc/pam.d

 

3. PRZYKŁADY UŻYCIA

 

4. WYBRANE MODUŁY

4.1 pam_access

4.2 pam_deny

4.3 pam_unix

4.4 pam_ftp

4.5 pam_listfile

 

5. Bibliografia

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1.KONFIGURACJA PRZY POMOCY PLIKU /etc/pam.conf

 

Plik konfiguracyjny PAM -a /etc/pam.conf sklada się z linii o następującej formie:

 

            NAZWA_USŁUGI     TYP_MODUŁU         FLAGA           SCIEŻKA_MODUŁU ARGUMENTY

           

NAZWA_USŁUGI

Najczęściej jest to nazwa zplikacji np. 'ftpd', 'login' czy 'su'.

Specjalną nazwa jest 'OTHER' odnosząca sie do usług nie wyszczególnionych osobno.

 

TYP_MODUŁU

Istnieją obecnie 4 możliwe wartości tego pola:

'auth'

     Ten typ modułu dostarcza 2 rodzajów autentykacji.

            1. Ustala czy użytkownik jest tym za kogo się podaje, żądając wpisania hasła lub posługując się innymi, mniej lub bardziej wyrafinowanymi metodami (np. badanie siatkówki oka)

2. Moduł może przyznawać przynależność "grupową" - niezależnie od mechanizmu linuxowego opartego o /etc/groups

 

'account'

Tego typu moduły odpowiedzialne są na zarządzaniu kontami nie związanymi z autentykacją. Typowym przykładem jest uzależnianie dostępu do usługi w zależności od pory dnia, danego stanu zasobów (np. liczby zalogowanych użytkowników) lub też sposobu logowania się (np. logowanie na roota tylko z konsoli)

 

'session'

Dotyczy to modułów związanych z zadaniami wykonywanymi przed i po uzyskaniu dostępu do usługi. Mogą to być zapisy do logów, montowania itp.

 

'password'

Tego rodzaju moduły są potrzebne do aktualizacji 'tokenów autentykacyjnych' przez użytkownika (najczęściej są to po prostu hasła).

 

FLAGA

 

Ten parametr określa w jaki sposób biblioteka PAMowska bęDzie reagowała na sukces lub porażkę pojedynczego modułu. Ponieważ moduły mogą być ustawiane na stosie, potrzebne jest ustalenie ich względnej ważności(np. jedno wywołanie funkcji pam_authenticate() przez aplikację może pociągać za sobą wywołanie kilku modułów typu 'auth', przy czym wartość zwracana przez tą funkcje jest wypadkową działania wszystkich tych modułów razem). Kolejność wywołań modułów jest odpowiada kolejności ich występowania w pliku /etc/pam.conf (wcześniejsze wpisy najpierw).

 

 

 

1.1 Notacja skrócona

 

Są dwie możliwości definiowania flag. Pierwsza z nich opiera się na czterech słowach kluczowych: 'required', 'requisite', 'sufficient' i 'optional', ktore są przez bibliotekę PAM interpretowane w następujący sposób:

 

Moduły obsługiwane są po kolei. Jeżeli wszystkie 'reqiusite' i 'required' zwrócą sukces wtedy do aplikacji zwracany jest sukces, ignorując kody zakończenia modułów 'sufficient' i 'optional' .

 

Jeżeli żaden z modułów nie jest oznaczony jako 'required' bądź ' requisite' wtedy do zwrócenia sukcesu konieczny jest przynajmniej jeden sukces modułu 'sufficient' bądź 'optional'. Jeżeli wszystkie odniosą porażkę zwracany jest kod błędu pierwszego z nich.

 

Flagi 'requisite' i 'sufficient' mają jednak dwa odstępstwa od tej semantyki.

Jeżeli moduł 'requisite' kończy się porażką wtedy błąd natychmiast zwracany jest do aplikacji z pominięciem następnych modułów, jednak kod błędu pochodzi od pierwszego zakończonego błędem modułu typu 'requisite' bądź 'required'.

 

Jeżeli moduł 'sufficient' zwraca sukces, wszystkie następujące moduły są ignorowane i do aplikacji zwracany jest sukces jeśli żaden z wcześniejszych modułów 'required' nie zakończył się porażką, bądź kod błędu pierwszego takiego modułu w przypadku przeciwnym.

 

Aplikacja będzie również powiadomiona o błędzie w przypadku gdy moduł nie istnieje bądź nie może zostać otwarty. Odpowiedni błąd będzie w takim przypadku przekazany przez syslog. Poniżej przedstawiona jest przykładowa konfiguracja:

           

 

                    su      auth  requisite   /usr/lib/security/pam_inhouse.so.1

        su      auth  required    /usr/lib/security/pam_unix.so.1         debug

        login   auth  required    /usr/lib/security/pam_unix.so.1         debug

        login   auth  optional    /usr/lib/security/pam_inhouse.so.1

        rlogin  auth  sufficient  /usr/lib/security/pam_rhosts_auth.so.1

        rlogin  auth  required    /usr/lib/security/pam_unix.so.1

           

1.2 Notacja szczegółowa

 

Drugim sposobem zapisu flag jest użycie notacji [wartość1=akcja1 wartość2=akcja2 ...] gdzie wartość jest jedną z możliwych wartości zwracanych przez moduł np. success, open_err, module_unknown, a akcja - żadaną akcją podjętą przez bibliotekę PAM np. ok, ignore, die.

 

A o to równoważne zapisy przy użyciu obu składni:

 

·        required <=> [success=ok new_authtok_reqd=ok ignore=ignore default=bad]

·        requisite <=> [success=ok new_authtok_reqd=ok ignore=ignore default=die]

·        sufficient <=> [success=done new_authtok_reqd=done default=ignore]

·        optional <=> [success=ok new_authtok_reqd=ok default=ignore]

 

SCIEŻKA_MODUŁU

           

absolutna, lub względna (domyślnie zaczynająca sie w /lib/security ) ścieżka.

 

ARGUMENTY

 

Argumenty dzielą się na specyficzne dla danego modułu oraz generyczne. W przypadku otrzymania niezrozumiałego dla siebie argumentu moduł musi wypisać do sysloga odpowiedni komunikat o błędzie.

Do typowych generycznych argumentów należą:

 

'debug'

Prześlij informację debuggerską do sysloga

 

'no_warn'

Nie przesyłaj aplikacji ostrzerzeń

 

'use_first_pass'

Nie pytaj użytkownika o hasło. Zamiast tego użyj hasła otrzymanego przez poprzedni moduł - jeżeli to nie zadziała użytkownik nie zostanie zautentykowany (dotyczy to tylko modułów typu 'auth' i 'password')

 

'try_first_pass'

Spróbuj autentykować na podstawie poprzedniego hasła. Jeśli to nie zadziała spytaj użytkownika o hasło.

 

'expose_account''

Udostępniaj informacje o koncie użytkownika.

 

2. KONFIGURACJA W OPARCIU O KATALOG /etc/pam.d

 

W tym katalogu umieszczane są pliki o nazwach odpowiadających polom NAZWA_USŁUGI, natomiast ich zawartość jest postaci reszty linii czyli:

 

            TYP_MODUŁU         FLAGA           SCIEŻKA_MODUŁU ARGUMENTY

 

Biblioteka PAM może być skompilowana w jednym z dwóch trybów:

 

a) Obecność katalogu /etc/pam.d powoduje ignorowanie przez bibliotekę pliku /etc/pam.conf (zalecany)

b) Wpisy z /etc/pam.d przesłaniają te z /etc/pam.conf

 

Konfiguracja przy pomocy katalogu /etc//pam.d jest lepsza niż stosowanie pojedynczego pliku z następujących powodów:

 

- mniejsze prawdopodobieństwo popełnienia błędu

- łatwiejsza w utrzymaniu - rekonfiguracja jednej aplikacji bez ryzyka przypadkowego naruszenia drugiej

- możliwość podlinkowania plików konfiguracyjnych różnych aplikacji w celu utrzymania spójności polityki bezpieczeństwa

- możliwość limitowania dostępu do konfiguracji poszczególnych aplikacji

- łatwiejsze zarządzanie pakietami - przy instalacji nowej aplikacji wystarczy dodać plik /etc/pam.d/<nazwa_aplikacji>

 

3. PRZYKŁADY UŻYCIA

 

-Polityka Restrykcyjna

 

#

# default; deny access

#

OTHER   auth     required       pam_deny.so

OTHER   account  required       pam_deny.so

OTHER   password required       pam_deny.so

OTHER   session  required       pam_deny.so

 

-Mniej restrykcyjna

 

#

# default; standard UN*X access

#

OTHER   auth     required       pam_unix.so

OTHER   account  required       pam_unix.so

OTHER   password required       pam_unix.so

OTHER   session  required       pam_unix.so

 

To ustawienie pozwala na udostępnianie usług większości aplikacji w oparciu o plik haseł, jednak niektóre usługi potrzebują specjalnych wpisów - tak jest w przypadku aplikacji ftpd umożliwiającej logowanie 'anonymous-ftp':

 

#

# ftpd; add ftp-specifics. These lines enable anonymous ftp over

#       standard UN*X access (the listfile entry blocks access to

#       users listed in /etc/ftpusers)

#

ftpd    auth    sufficient  pam_ftp.so

ftpd    auth    required    pam_unix_auth.so use_first_pass

ftpd    auth    required    pam_listfile.so \

        onerr=succeed item=user sense=deny file=/etc/ftpusers

 

 

4. WYBRANE MODUŁY

 

4.1 pam_access

    Zawsze zwraca sukces.

 

4.2 pam_deny

    Zawsze zwraca porażkę.

 

4.3 pam_unix

 

Należy do wszystkich czterech typów: account; authentication; password session

 

To jest standardowy unixowy moduł autentykacyjny. Używa standardowych wywołań systemowych do uzyskania informacji o kontach użytkowników oraz do autentykacji. Zwykle wykorzystuje pliki /etc/passwd i /etc/shadow

 

Składowa 'account'

Bazując na elementach pliku /etc/shadow: expire; last_change; max_change; min_change; warn_change, ustala status konta i hasła użytkownika. Może zaoferować użytkownikowi radę zmiany hasła lub zwracając wartość PAM_AUTHTOKEN_REQD, opóźnić dostęp do usługi do momentu zmiany hasła.

 

#

# Ensure users account and password are still active

#

login account required pam_unix.so

 

Składowa 'authentication'

Standardowa autentykacja unixowa. Przyjmowane argumenty to: debug; audit; use_first_pass; try_first_pass;

 

#

# Authenticate the user

#

login   auth  required       pam_unix.so

 

 

Składowa 'password'

Użycie modułu w tym trybie wykonuje zadanie zmiany hasła użytkownika.

Standardowe użycie w połączeniu z modułem pam_cracklib

 

#

# Change the users password

#

passwd   password   required   pam_cracklib.so retry=3 minlen=6 difok=3

passwd   password   required   pam_unix.so use_authtok nullok md5

 

Moduł pam_cracklib obsługuje tylko tryb 'password' i służy do testowania bezpieczeństwa haseł w oparciu o bibliotekę libcrack, oraz słownik systemowy /usr/lib/cracklib_dict. Przeprowadzany jest test podobieństwa hasła z użytym wcześniej zapisanym w /etc/security/opasswd. Argument diffok oznacza minimalną liczbę znaków które nie mogą występować w starym haśle.

 

Opcja 'use_authok' zmusza moduł do ustawienia hasła dostarczonego przez poprzedni moduł typu 'password' ze stosu.,'nullok' ustawia akceptację haseł pustych, a 'md5' kodowanie funkcją md5 zamiast standardową - crypt

 

 

 

Składowa 'session'

Po prostu zapisuje nazwę użytkownika i usługę do sysloga na początku i na końcu sesji.

 

#

# session opening and closing

#

login   session  required       pam_unix.so

 

4.4 pam_ftp

 

Ten moduł posiada wyłącznie komponent 'authentication' i służy do przechwytywania nazwy i hasła użytkownika. Jeżeli nazwa użytkownika (PAM_USER) jest 'ftp' lub 'anonymous', hasło jest dzielone na podstawie delimitera @ na część PAM_RUSER i PAM_RHOST i moduł zwraca sukces. W przeciwnym wypadku ustawia element PAM_AUTHTOK na podane hasło w celu umożliwienia autoryzacji następnym modułom i zwraca porażkę.

 

PAM_AUTHOK, PAM_USER - to sa elementy struktury typu  pam _handle_t ktora jest przekazywana przy każdym wywołaniu funkcji biblioteki PAM przez aplikację i konsekwentnie przy wywolaniu funkcji z odpowiedniego modułu, na przykład:

 

aplikacja wywołuje funkcję:

       

        int pam_authenticate(pam_handle_t *pamh, int flags);

 

biblioteka sięga do pliku konfiguracyjnego i wywołuje dla kolejnych modułów typu 'auth'  funkcję:

 

                         int pam_sm_authenticate(pam_handle_t *pamh, int flags, int argc, const char **argv);

 

argv to lista argumentów przekazana do modułu w pliku konfiguracyjnym.

 

ciekawostka: argv[0] to NIE jest nazwa modułu!

 

 inne elementy pam_handle_t:

     

     PAM_SERVICE         The service name.

 

     PAM_USER            The user name.

 

     PAM_AUTHTOK         The user authentication token.

 

     PAM_OLDAUTHTOK      The old user authentication token.

 

     PAM_TTY             The tty name.

 

     PAM_RHOST           The remote host name.

 

     PAM_RUSER           The remote user name.

 

     PAM_CONV            The pam_conv structure.

 

     PAM_USER_PROMPT     The    default    prompt     used     by

                         pam_get_user().

 

4.5 pam_listfile

 

Ten moduł służy wyłącznie do autentykacji i umożliwia przyznawanie lub odmowę dostępu do usługi w zależności od zawartosci pewnego pliku.

 

Argumenty:

onerr=succeed|fail; sense=allow|deny; file=filename; item=user|tty|rhost|ruser|group|shell apply=user|@group

 

Moduł ten na szuka odopwiedniego elementu ('item') w pliku 'filename' i jeśli go znajdzie podejmuje akcje zdefiniowaną przez 'sense'. W przypadku błędu (np. plik 'filename' nie istnieje) podejmowana jest akcja zdefiniowana w 'onerr'. Jeżeli 'item' nie jest ustawiony na 'group' ani 'user' dostęp może być dodatkowo limitowany przez parametr 'apply'.

 

Przykład: patrz sekcja: 3. PRZYKŁADY UŻYCIA

 

 

 

 

 

5. BIBLIOGRAFIA

 

5.1http://www.kernel.org/pub/linux/libs/pam

 

5.2http://www.sun.com/software/solaris/pam

 

5.3Andrew G. Moragan "The Linux-PAM Systems Administrators' Guide vo.77"

 

 

 

 

 

 

DOTATEK A:  SCHEMAT KOMUNIKACJI: APLIKACJA - BIBLIOTEKA PAM - MODUŁY PAM