Moduły PAM (Pluggable Authentication Modules) – Wprowadzone w

Transkrypt

Moduły PAM (Pluggable Authentication Modules) – Wprowadzone w
Moduły PAM (Pluggable Authentication Modules)
– Wprowadzone w celu uproszczenia konfiguracji procesu autoryzacji
– Można ustawić je dla wielu aplikacji o ile korzystają one z PAM.
– Centralizują ustawienia autoryzacji w jednym miejscu (dawnej każda aplikacja mogła mieć
własny system autoryzacji co prowadziło do bałaganu).
Lokalizacje plików
/lib/security/ – tutaj znajdują się pliki *.so z modułami. Większość ma intuicyjna nazwę okreslającą
ich funkcje.
/etc/pam.d/ - tutaj są pliki konfigurujące moduły PAM (notacja katalogowa)
/etc/pam.conf – plik konfiguracyjny modułów PAM (notacja plikowa)
/etc/security/ - tutaj znajdziemy pliki konfiguracyjne dla niektórych modułów. Dzięki tym plikom
można dokładniej skonfigurować dany moduł.
Instalowanie modułów PAM w Debianie.
Debian posiada w repozytorium dodatkowe moduły które można wykorzystać. Niektóre usługi np.
LDAP, Kerberos będą wymagały ustawienia ich modułu PAM. Paczki w repozytorium zaczynają
się słowem „libpam”. Na zajęciach instalowany był tylko moduł libpam_cracklib.
Konfiguracja w notacji katalogowej.
Ponieważ notacja katalogowa jest częstsza zostanie omówiona teraz. Następnie zostaną
przedstawione różnice pomiędzy notacją plikową i katalogową.
auth
auth
required
required
pam_env.so
pam_unix.so try_first_pass likeauth nullok
account
required
pam_unix.so
password
password
required
required
pam_cracklib.so difok=2 minlen=8 dcredit=2 ocredit=2 retry=3
pam_unix.so try_first_pass use_authtok nullok sha512 shadow
session
session
session
required
required
required
pam_limits.so
pam_env.so
pam_unix.so
session
optional
pam_permit.so
Zanim omówimy wszystkie dyrektywy należy wspomnieć, że proces autoryzacji odbywa się w tzn.
stosie. Oznacza to, że pewne dane uzyskane przez moduły początkowe (np. użytkownik podaje
hasło) mogą być wykorzystane przez dalsze moduły bez potrzeby uzyskiwania ich ponownie. W
przykładzie z hasłem oznacza to, że możemy nie pytać przy każdej usłudze użytkownika o hasło a
wykorzystać to co już podał.
Pierwsza kolumna zawiera dyrektywę określającą etap autoryzacji (w dokumentacji można spotkać
nazwę moduł lecz wprowadzam nazwę etap aby nie mieszać). Oto znaczenie tych 4 dyrektyw:
– auth oznacza sprawdzenie tożsamości użytkownika np. sprawdzenie loginu i hasła
– account nie wykonuje żadnej czynności uwierzytelniającej ale sprawdza czy użytkownik
może się zalogować do systemu. Chodzi tutaj o ograniczenia takie jak np. maksymalna
liczba zalogowanych użytkowników lub obecności pliku /etc/nologin.
– Password jest odpowiedzialny za stworzenie „tokena” dla użytkownika który jest właśnie
logowany. Token tez zwiera informacje o użytkowniku np. UID i GID.
– session odpowiada za czynności i ustawienia które trzeba wykonać zanim użytkownik
otrzyma dostęp do powłoki.
Druga kolumna określa „priorytet” modułu. Można znaleźć tutaj 4 podstawowe dyrektywy:
– required określa, że jeżeli ten moduł zwróci błąd to cały proces autoryzacji zwróci błąd
niepowodzenia.
– requisite określa podobnie jak required, że nie powodzenie tego modułu sprawia, że cały
proces zwraca błąd ale w odróżnieniu od required jego nie powodzenie przerywa od razu
dalszą autoryację. Zatem w przypadku required błąd zostanie zwrócony dopiero po
zakończeniu przetwarzania wszystkich modułów.
– sufficient mówi, że powodzenie tego modułu wystarcza aby przerwać proces i zwrócić kod
sukcesu. Natomiast jeżeli moduł required który jest przed nim zwróci błąd to sukces tego
modułu jest ignorowany.
– optional określa, że powodzenie lub niepowodzenie tego modułu są beż znaczenia.
Zostały jezcze 2 dyrektywy do omówienia:
– include powoduje dołączenie zawartości wskazanego pliku do stosu modułów.
– Substack podobnie jak include dołącza plik ale jego zawartość jest traktowana jako pod stos.
Istnieje możliwość definiowania własnego priorytetu. W tym celu w drugiej kolumnie wpisujemy w
nawiasu kwadratowe wartości kluczy i przypisywane im wartości według formatu:
[kluczN=akcja1,kluczM=akcja2,...]
Oto lista kluczy: success, open_err, symbol_err, service_err, system_err, buf_err, perm_denied,
auth_err, cred_insufficient, authinfo_unavail, user_unknown, maxtries, new_authtok_reqd,
acct_expired, session_err, cred_unavail, cred_expired, cred_err, no_module_data, conv_err,
authtok_err, authtok_recover_err, authtok_lock_busy, authtok_disable_aging, try_again, ignore,
abort, authtok_expired, module_unknown, bad_item, conv_again, incomplete, default.
Akcja określa jedno z następujących słów kluczowych:
ignore, bad, die, ok, done, reset
Nazwy są intuicyjne ale wyjaśnienia wymaga tylko dyrektywa reset. Powoduje ona skasowane
danych które zostały odłożone na aktualnym stosie PAM (np. wcześniej pobrane hasła). Jednak
jeżeli jesteśmy w pod stosie to ta akcja skasuje tylko dane z tego pod stosu.
Trzecia kolumna określa właściwy moduł wraz z parametrami:
pam_unix.so try_first_pass likeauth nullok
pam_unix.so jest nazwą modułu a reszta linijki to jego parametry. Jeżeli ilość parametrów jest zbyt
długa można zastosować załamanie wiersza więc linijka:
password
required
pam_cracklib.so difok=2 minlen=8 dcredit=2 ocredit=2 retry=3
będzie zinterpretowana tak samo jak:
password
required
pam_cracklib.so difok=2 minlen=8 \
dcredit=2 ocredit=2 retry=3
Jeżeli pominięto by znak „\” wówczas w pliku z tą konfiguracją byłby błąd. Należy uważać na
błędy ponieważ mogą one zablokować nam dostęp do systemu!
Notacja plikowa
Różnica pomiędzy notacją plikową a katalogową polega na tym, że w notacji plikowej wszystkie
wpisy umieszczone są w pliku /etc/pam.conf. Dodatkowo w celu określenia do której aplikacji
dotyczy wpis należy umieścić nazwę aplikacji przed nazwą etapu.
Przykład:
login
auth
requisite
pam_nologin
Wpis ten dotyczy aplikacji login.
Tworzenie przykładowych wpisów.
Wybrałem 4 moduły do omówienia, ze względu na czas spotkania ograniczałem się tylko do
ciekawszych parametrów.
a) pam_nologin.
Moduł ten odpowiada na reakcję systemu na obecność pliku /etc/nologin który jeżeli istnieje
blokuje logowanie zdalne (ssh) do systemu przez użytkowników którzy nie są administratorem
(root). Zachowanie to można zmienić dodając odpowiednie wpisy w innych plikach z ustawieniami
modułów PAM usług. Jego parametry to file oraz debug. Parametr file pozwala określić ścieżkę do
pliku na który ma reagować ten moduł (domyślnie /etc/nologin).
Obsługiwane etapy to auth oraz account.
b) pam_cracklib
Ten moduł służy do sprawdzania haseł ustawianych przez użytkowników systemu. Jeżeli hasła będą
zbyt proste nie pozwoli on ustawić takiego hasła. Jego parametry pozwalają na wprowadzanie
wymagań dla hasła. Możemy wskazać słownik który będzie uwzględniany przy testowaniu haseł.
Cracklib dostarcza 5 testów które przeprowadzi na podanym haśle:
– test palindromów
– test wielkości znaków (czy nowe hasło jest tym samym ale ze zmienioną wielkością liter)
– test podobieństwa (głownie difok)
– test prostego hasła (parametry dcredits,ucredit,lcredits,ocredits oraz minlen)
– test rotacji hasła
Oto lista ciekawszych parametrów:
– retry=N
ustawia ile prob podania hasła ma użytkownik zanim moduł zwróci fail.
– difok=N
określa ile znaków ze starego hasła nie może pojawić się w nowym
– difignore=N
od ilu znaków hasła należy ignorować parametr difok
– minlen=N
minimalna dlugosc hasla (mniej jak 6 zostanie zingorowane i zostaje przyjete 6 znakow
natomiast domyslna wielkosc to 9)
– dcredit=N
jeżeli N jest większe lub równe 0 to parametr ten określa największą liczbę znaków cyfr.
Znaki te są liczone do długości hasła aby spełnić wymogi parametru minlen, jeżeli podamy
więcej cyfr niż N wówczas moduł nie policzy dodatkowych cyfr i nie będą one
uwzględnione w minlen. Jeżeli N jest ujemne wówczas wartość bezwzględna N oznacza
minimalna liczbę cyfr jaka musi zawierać hasło.
– ucredit=N
podobnie jak dcredit ale zamiast cyfr liczymy duże litery
– lcredit=N
podobnie jak dcredit ale zamiast cyfr liczymy małe litery
– ocredit=N
podobnie jak dcredit ale zamiast cyfr liczymy znaki specjalne.
Cracklib obsługuje tylko etap password.
Przykład:
password
required
pam_cracklib.so minlen=7 dcredits=4 ocredits=-2 retry=4
c) pam_unix
Obsługuje ustawienia uwierzytelniania w lokalnym systemie. Można określić w nim algorytm
szyfrowania haseł. A także ile razy hasło ma być szyfrowane. Zawiera parametry które można
spotkać i w innych modułach. Chodzi tu o parametry do obsługi podanych już wcześniej haseł
znajdujących się na stosie. Może pamiętać N ostatnio podanych haseł.
Oto najciekawsze parametry:
– md5, bigcrypt, sha256, sha512, blowfish
to są algorytmy szyfrowania dla haseł.
– rounds=N
gdzie N oznacza liczbę przebiegów algorytmu, np. rounds=15 sprawi, ze 15 razy będzie
szyfrowane hasło (następny przebieg szyfruje wynik poprzedniego).
– nodelay
jeżeli podamy złe hasło to system czeka ok. 2-3 sekund zanim zwróci błąd, ten parametr
wyłącza takie zachowanie.
– try_first_pass (dostepy np. w pam_cracklib)
mówi modułowi, że należy spróbować hasło położone na stosie i w przypadku
niepowodzenia należy zapytać się o hasło
– use_first_pass (dostępny np. w pam_cracklib)
nakazuje modułowi próbować tylko hasła odłożonego na stos. Jeżeli to hasło jest błędne
spowoduje to zwrócenie fail.
– nullok
ponieważ moduł nie pozwala ustawiać pustych haseł więc uzytkownik który takie hasło ma
nie mógłby go użyć np. do zmiany swojego hasła albo do dostepu. Ten parametr wyłącza to
zachowanie.
Obsługiwane etapy to auth,account,password oraz session.
Przykład:
//ta cześć znalazła by się w common-auth
auth
auth
requisite
requited
pam_nologin
pam_unix.so
//a ta w common-account
account
required
pam_unix.so
// ta natomiast w common-password
password
required
password
required
pam_cracklib.so minlen=7 dcredits=4 \
ocredits=-2 retry=4
pam_unix.so use_first_pass md5
//i ostatnia w common-session
session
session
required
required
pam_unix.so
pam_limits.so // ten moduł pojawia się w ustawieniach niektórych
// usług więc raczej nie trafiłby do tego pliku
session
required
pam_env.so //moduł odpowiedzialny za ustawianie zmiennych
// środowiskowy
session
optional
pam_mkhomedir.so umask=033
//ten moduł tworzy katalog domowy
//użytkownika jeżeli on nie istnieje, parametr
//umask jest odpowiedzialny za maskę uprawnień
Potrafisz powiedzieć co ta konfiguracja robi? Moduł pam_limits pojawi się już za chwilkę
d) pam_limits
Czasem nadchodzi potrzeba ograniczenia zasobów które dostają użytkownicy. Najbardziej znanym
przykładem będzie słynna bomba forkowa. Czyli proces który tylko się mnoży i zapycha system
operacyjny. Jadro nie pozwoli zając takiemu procesowi wszystkich identyfikatorów procesów (PID)
zostawi ich około 5 aby użytkownik root mógł się zalogować i w miarę swobodnie podjąć akcje
likwidacyjne bez potrzeby resetowania systemu. Pam_limits pozwala ograniczyć liczbę procesów
którą jądro pozwoli użytkownikom utrzymywać w danej chwili.
Innym przykładem może być użytkownik który utrzymuje 15 sesji i według obserwacji każda sesja
jest aktywna co może świadczyć o dzieleniu konta albo o botach. W tym przypadku możemy
ograniczyć liczbę równoczesnych sesji w systemie. Co na pewno utrudni takie praktyki.
Jadro posiada odpowiednie struktury do ograniczania użytkowników ale to dzięki temu modułowi
są one ustawiane.
Opcje ograniczeń nie są podawane przy deklaracji modułu ale znajdują się w oddzielnym pliku
(standardowo /etc/security/limits.conf). Ale lokalizację pliku można zmienić parametrem
conf=/sciezka/do/nowej/konfiguracji
Sam plik limits.conf zawiera wyjaśniony każdy parametr ale wyjaśnień może wymagać parametr
cpu. Określa on maksymalny czas jaki może zużyć określony użytkownik/grupa podawany w
minutach podczas swojej sesji. Po przekroczeniu tego czasu sesja się zakończy. Przykłady wpisów
pliku limits.conf znajdziecie w pliku limits.conf.
Przyklady innych modułów
pam_acces – zwraca zawsze sukces
pam_debug – debuguje prace PAM
pam_deny – zwraca zawsze fail
pam_echo – wyświetl jakiś tekst
pam_exec – wykonaj jakiś program
pam_lastlog – włącz wyświetlanie informacji o ostatnim logowaniu
pam_mail – zawiadom użytkownika o poczcie
pam_securetty – ogranicz powłoki roota do określonych
pam_selinux – moduł PAM dla projektu SELinux (Security-Enhanced Linux)
pam_tally/pam_tally2 – zapamiętuje liczbę logowań (można go użyć do reakcji na ataki
słownikowe i bruteforce)
pam_warn – logowanie pracy PAM
pam_wheel – przyznaje prawa do używania su (domyślnie nadaje je grupie wheel)
Dokumentacja online modułów PAM
http://www.kernel.org/pub/linux/libs/pam/Linux-PAM-html/Linux-PAM_SAG.html
Na stronie tej znajdują się opisy parametrów i poszczególnych modułów.

Podobne dokumenty