Pluggable authentication modules (PAM) - polityki haseł z wykorzystaniem pam_cracklib

Red Hat 6.x / CentOS 6.x
Teorię konfiguracji modułów PAM poznaliśmy przy okazji tekstu Pluggable authentication modules (PAM) - składnia i konfiguracja, więc czas wykorzystać te informacje w praktyce.

Najpopularnijszym bodaj modułem PAM, a zarazem pierwszym z jakim miałem styczność jest moduł pam_cracklib.so, dzięki któremu możemy w naszym systemie definiować polityki dotyczące wymogów, jakie muszą spełniać hasła użytkowników.

Moduł ten jest domyślnie załadowany do systemu poprzez moduły /etc/pam.d/password-auth oraz /etc/pam.d/system-auth, ale konfiguracja jego jest bardzo uboga:

password    requisite     pam_cracklib.so try_first_pass retry=3 type=

Oznacza to, że pozytywne przejście modułu jest wymagane dla typu password. Jak widzimy moduł jest wywołany z trzema opcjami:
* try_first_pass - ta opcja przed spytaniem użytkownika o hasło sprawdzi, czy wcześniej zastackowane hasło nie będzie wystarczające do autoryzacji. Przy zmianie hasła chyba nie wykorzystywane
* retry=3 - określa ile razy zapytać o hasło przed zwróceniem błędu
* type= funkcja jest aliasem dla authok_type, a odpowiada za wyświetlenie części prompta zmiany hasła. Wartość nie powinna zawierać spacji. Wartość pojawi się w postaci: "New WARTOSC_ZE_ZMIENNEJ_TYPE password:" oraz "Retype new WARTOSC_ZE_ZMIENNEJ_TYPE password:" przy próbue zmiany hasła.

Jak widać, żadna z opcji nie określa warunków, jakie hasło powinno spełniać, dlatego pozwolę sobie wymienić i wdrożyć kilka najprzydatniejszych z nich. Zmiany opcji, aby mieć pewność prawidłowego działania nowych reguł należy wdrożyć w obu plikach, tj: password-auth oraz system-auth.

Opcje weryfikacji wymogów dla haseł

Wszystkich z poniższych opcji możemy używać jednocześnie, umieszczając je po sobie oddzielone spacją.

* difok=N - użycie opcji wymusza ilość znaków, którymi nowo podane hasło musi różnić się od starego hasła (domyślnie jest to 5)

Konfiguracja:

password    requisite     pam_cracklib.so try_first_pass retry=3 type= difok=3

Działanie:

-bash-4.1$ passwd
Changing password for user test.
Changing password for test.
(current) UNIX password:1qaz@WSX
New password:1qaz@WDC
BAD PASSWORD: is too similar to the old one
New password:1qaz#EDC
Retype new password:1qaz#EDC
passwd: all authentication tokens updated successfully.

* lcredit=N
* ucredit=N
* dcredit=N
* ocredit=N

Wymienione powyżej opcje determinują maksymalną ilość tzw. znaków kredytowych w haśle.Znakami tymi są odpowiednio:
     l (lowercase) - małe litery
    u (uppercase) - duże litery
    d (digits) - cyfry
    o (other) - znaki specjalne
Ważną właściwością tych opcji jest to, że określają maksymalną, a nie jak by mogło się wydawać naturalne minimalną ilość znaków danego typu w haśle. Szczęśliwie opcaj przyjmuje wartości ujemne odwracając swoje działanie, dlatego jeśli chcemy zdefiniować minimalną wymaganą ilość znaków danego typu wrtość opcji ustawiamy na wartość ujemną (np. ucredut=-3 spowoduje, że w haśle będą musiały wystąpić conajmniej 3 duże litery). Komunikat o niespełnieniu wymagań nie mówi niestety nic o wymogach jakie podawane hasło powinno spełniać. Dla przykładowej konfiguracji:

password    requisite     pam_cracklib.so try_first_pass retry=3 type= ucredit=-1 dcredit=-2

moduł będzie wymagał minimum 1 dużej litery oraz 2 cyfr. Komunikat przy niepoprawnym haśle będzie mówił:

bash-4.1$ passwd
Changing password for user test.
Changing password for test.
(current) UNIX password:
New password: smallitblog
BAD PASSWORD: is too simple
New password: sma11itBlog
Retype new password:

* minlen=N - określa jakiej minimalnie długości ma być hasło. Na pozór zastosowanie okazuje się być oczywiste i proste, ale.... moim zdaniem jest to najbardziej "skopana" opcja modułu. Czemu? Już odpowiadam. W podstawowej konfiguracji, np:

password    requisite     pam_cracklib.so try_first_pass retry=3 type= minlen=12

bash-4.1$ passwd
Changing password for user test.
Changing password for test.
(current) UNIX password:
New password: tooshort
BAD PASSWORD: is too simple

Jak się okazuje hasło długości 11 znaków, np: smallitblog będzie wystarczające do spełnienia wymagań modułu. Jest to pierwsza z ingerencji samego modułu w wymaganą długość hasła - jeśli w konfiguracji poza definicją samej minlen nie będziemy wymagać kilku klas kredytowych moduł zmniejszy wymaganą długość hasła o 1 w stosunku do zdeklarowanej przez nas.
Kolejna ingerencja w długość dotyczy również znaków kredytowych. Jeśli przy powyższej konfiguracji w naszym haśle uwzględnimy inne niż lcredit klasy kredytowe, to każda z zastosowanych klas skróci nam wymaganą długość hasła o 1, np:
    - hasło smallitblog przejdzie weryfikację dla wymaganej minimalnej długości 12 znaków
    - hasło Smallitblog przejdzie weryfikację dla 13 znaków, gdyż zastosowaliśmy jedną dodatkową klasę - dużą literę
    - hasło Smallitblo6 przejdzie weryfikację dla 14 znaków. Zastosowaliśmy 2 dodatkowe klasy - dużą literę oraz cyfrę
    - hasło Sm@llitblo6 będzie poprawne dla 15 znakowego limitu, gdyż użyliśmy wszystkich klas kredytowych - małej i dużej litery, cyfry oraz znaku specjalnego.

Przy okazji tej opcji trzeba wspomnieć o jeszcze jednej istotnej rzeczy. Cracklib ma hardkodowany drugi limit minimalnej długości 6 znaków dla hasła, który jest sprawdzany bez względu na wartość podaną przez zmienną minlem, więc jeśli chcesz używać haseł krótszych, będziesz musiał całkowicie wyłączyć weryfikację przez cracklib.

* maxrepeat=N - opcja określa maksymalną ilość powtórzeń tego samego znaku w haśle. Domyślnie ma ona wartość 0, czyli nie jest sprawdzana.

password    requisite     pam_cracklib.so try_first_pass retry=3 type= maxrepeat=1

bash-4.1$ passwd
Changing password for user test.
Changing password for test.
(current) UNIX password:
New password: smallitblog
BAD PASSWORD: contains too many same characters consecutively

* minclass=N - przy pomocy tej opcji możemy wymucić na użytkowniku użycie kilku klas znaków, przy czym nie jest brana pod uwaę ilość znaków z danej klasy, a jedynie jej wystąpienie.

password    requisite     pam_cracklib.so try_first_pass retry=3 type= minclass=3

bash-4.1$ passwd
Changing password for user test.
Changing password for test.
(current) UNIX password:
New password: SmallItBlog
BAD PASSWORD: not enough character classes

* reject_username - nie pozwoli w haśle użyć nazwy użytkownika

password    requisite     pam_cracklib.so try_first_pass retry=3 type= reject_username

bash-4.1$ passwd
Changing password for user test.
Changing password for test.
(current) UNIX password:
New password: test123
BAD PASSWORD: it is based on your username

* enforce_for_root - ta opcja wymusi na użytkowniku root spełnienie warunków jakie zdeklarowano dla haseł. Domyślnie root może ustawić dowolne hasło dla dowolnego usera.

Brak komentarzy:

Prześlij komentarz