Wyszukiwanie w witrynie

Jak skonfigurować i używać PAM w systemie Linux


Linux-PAM (skrót od Pluggable Authentication Modules, który wyewoluował z architektury Unix-PAM) to potężny zestaw współdzielonych bibliotek używanych do dynamicznego uwierzytelniania użytkownika w aplikacjach (lub usługach) ) w systemie Linux.

Integruje wiele modułów uwierzytelniania niskiego poziomu w interfejs API wysokiego poziomu, który zapewnia dynamiczną obsługę uwierzytelniania dla aplikacji. Umożliwia to programistom pisanie aplikacji wymagających uwierzytelniania, niezależnie od podstawowego systemu uwierzytelniania.

Wiele nowoczesnych dystrybucji Linuksa domyślnie obsługuje Linux-PAM (zwany dalej „PAM”). W tym artykule wyjaśnimy jak skonfigurować zaawansowany PAM w systemach Ubuntu i CentOS.

Zanim przejdziemy dalej, zauważ, że:

  • Jako administrator systemu najważniejszą rzeczą jest opanowanie sposobu, w jaki pliki konfiguracyjne PAM definiują połączenie między aplikacjami (usługami) a wymiennymi modułami uwierzytelniającymi (PAM), które wykonują rzeczywiste zadania uwierzytelniania. Nie musisz koniecznie rozumieć wewnętrznego działania PAM.
  • PAM może poważnie zmienić bezpieczeństwo Twojego systemu Linux. Błędna konfiguracja może spowodować częściowe lub całkowite zablokowanie dostępu do systemu. Na przykład przypadkowe usunięcie plików konfiguracyjnych w /etc/pam.d/* i/lub /etc/pam.conf może zablokować dostęp do własny system!

Jak sprawdzić, czy program obsługuje PAM

Aby zastosować PAM, aplikacja/program musi „obsługiwać PAM”; musi zostać napisany i skompilowany specjalnie do użycia PAM. Aby dowiedzieć się, czy program jest „obsługujący PAM”, czy nie, sprawdź, czy został skompilowany z biblioteką PAM za pomocą polecenie ldd.

Na przykład sshd:

sudo ldd /usr/sbin/sshd | grep libpam.so

	libpam.so.0 => /lib/x86_64-linux-gnu/libpam.so.0 (0x00007effddbe2000)

Jak skonfigurować PAM w systemie Linux

Główny plik konfiguracyjny PAM to /etc/pam.conf, a katalog /etc/pam.d/ zawiera pliki konfiguracyjne PAM dla każdą aplikację/usługę obsługującą PAM. PAM zignoruje plik, jeśli katalog istnieje.

Składnia głównego pliku konfiguracyjnego jest następująca. Plik składa się z listy reguł zapisanych w jednej linii (reguły można rozszerzyć za pomocą znaku ucieczki „\ ”), a komentarze są poprzedzone znakiem „# ” znaczniki i przedłużyć do następnego końca linii.

Format każdej reguły to zbiór tokenów oddzielonych spacjami (w przypadku pierwszych trzech wielkość liter nie jest uwzględniana). Wyjaśnimy te tokeny w kolejnych sekcjach.

service type control-flag module module-arguments 

Gdzie :

  • usługa: rzeczywista nazwa aplikacji.
  • typ: typ modułu/kontekst/interfejs.
  • flaga kontrolna: wskazuje zachowanie PAM-API w przypadku, gdy modułowi nie powiedzie się zadanie uwierzytelnienia.
  • moduł: bezwzględna nazwa pliku lub względna nazwa ścieżki PAM.
  • argumenty modułu: oddzielona spacjami lista tokenów służących do kontrolowania zachowania modułu.

Składnia każdego pliku w /etc/pam.d/ jest podobna do składni pliku głównego i składa się z linii w następującej formie:

type control-flag module module-arguments

To jest przykład definicji reguły (bez argumentów modułu) znalezionej w pliku /etc/pam.d/sshd, która uniemożliwia logowanie przez użytkownika innego niż root podczas /etc/nologin istnieje:

account required pam_nologin.so

Zrozumienie grup zarządzania PAM i flag kontrolnych

Zadania uwierzytelniania PAM są podzielone na cztery niezależne grupy zarządzania. Grupy te zarządzają różnymi aspektami typowego żądania użytkownika dotyczącego usługi z ograniczeniami.

Moduł jest powiązany z jednym z następujących typów grup zarządzania:

  • konto: świadczenie usług weryfikacji konta: czy hasło użytkownika wygasło?; czy ten użytkownik ma dostęp do żądanej usługi?.
  • uwierzytelnianie: uwierzytelnianie użytkownika i konfigurowanie jego poświadczeń.
  • hasło: odpowiadają za aktualizację haseł użytkowników i współpracują z modułami uwierzytelniającymi.
  • sesja: zarządzaj działaniami wykonywanymi na początku i na końcu sesji.

Pliki obiektów ładowalnych PAM (moduły) należy umieścić w katalogu: /lib/security/ lub /lib64/security w zależności od architektura.

Obsługiwane flagi kontrolne to:

  • warunek: awaria natychmiast przywraca kontrolę do aplikacji, wskazując charakter awarii pierwszego modułu.
  • wymagane: wszystkie te moduły są wymagane do powodzenia, aby libpam przywróciło pomyślność aplikacji.
  • wystarczający: biorąc pod uwagę, że wszystkie poprzednie moduły powiodły się, sukces tego modułu prowadzi do natychmiastowego i pomyślnego powrotu do aplikacji (awaria tego modułu jest ignorowana).
  • opcjonalne: sukces lub porażka tego modułu zazwyczaj nie jest rejestrowana.

Oprócz powyższych słów kluczowych istnieją dwie inne ważne flagi kontrolne:

  • include i substack: uwzględnia wszystkie linie danego typu z pliku konfiguracyjnego podanego jako argument tej kontrolki.

Jak ograniczyć dostęp roota do usługi SSH za pośrednictwem PAM

Jako przykład skonfigurujemy sposób używania PAM do wyłączania dostępu użytkownika root do systemu poprzez SSH i programy logowania. W tym miejscu chcemy wyłączyć dostęp użytkownika root do systemu, ograniczając dostęp do usług logowania i sshd.

Możemy skorzystać z modułu /lib/security/pam_listfile.so, który oferuje dużą elastyczność w ograniczaniu uprawnień poszczególnych kont. Otwórz i edytuj plik usługi docelowej w katalogu /etc/pam.d/, jak pokazano.

sudo vim /etc/pam.d/sshd
OR
sudo vim /etc/pam.d/login

Dodaj tę regułę w obu plikach.

auth    required       pam_listfile.so \
        onerr=succeed  item=user  sense=deny  file=/etc/ssh/deniedusers

Wyjaśnienie tokenów w powyższej regule:

  • auth: to typ modułu (lub kontekst).
  • wymagany: to flaga kontrolna, która oznacza, że jeśli moduł jest używany, musi przejść pomyślnie, w przeciwnym razie ogólny wynik będzie negatywny, niezależnie od stanu innych modułów.
  • pam_listfile.so: to moduł umożliwiający odmowę lub zezwolenie na usługi oparte na dowolnym pliku.
  • onerr=succeed: argument modułu.
  • item=user: argument modułu określający, co znajduje się w pliku i co należy sprawdzić.
  • sense=deny: argument modułu określający akcję, jaką należy podjąć w przypadku znalezienia elementu w pliku. Jeśli element NIE zostanie znaleziony w pliku, żądana jest akcja odwrotna.
  • file=/etc/ssh/deniedusers: argument modułu określający plik zawierający jeden element w każdej linii.

Następnie musimy utworzyć plik /etc/ssh/deniedusers i dodać w nim nazwę root:

sudo vim /etc/ssh/deniedusers

Zapisz zmiany i zamknij plik, a następnie ustaw dla niego wymagane uprawnienia:

sudo chmod 600 /etc/ssh/deniedusers

Od tej chwili powyższa reguła będzie informować PAM o sprawdzaniu pliku /etc/ssh/deniedusers i odmawianiu dostępu do usług SSH i logowania każdemu z wymienionych użytkowników.

Jak skonfigurować zaawansowany PAM w systemie Linux

Aby napisać bardziej złożone reguły PAM, możesz użyć prawidłowych flag kontrolnych w następującej formie:

type [value1=action1 value2=action2 …] module module-arguments

Gdzie wartośćN odpowiada kodowi powrotu z funkcji wywołanej w module, dla którego zdefiniowano linię. Obsługiwane wartości można znaleźć w internetowym Przewodniku administratora PAM. Wartość specjalna jest wartością domyślną, co oznacza, że żadna wartość N nie jest wyraźnie wymieniona.

DziałanieN może przyjąć jedną z następujących form:

  • ignore: jeśli ta akcja zostanie użyta ze stosem modułów, status zwrotu modułu nie będzie miał wpływu na kod powrotu otrzymywany przez aplikację.
  • zły: wskazuje, że kod powrotu należy traktować jako wskazujący awarię modułu. Jeśli ten moduł jako pierwszy na stosie ulegnie awarii, jego wartość statusu zostanie użyta jako wartość całego stosu.
  • umrzeć: odpowiednik złego, ale może zakończyć stos modułów i PAM natychmiast powróci do aplikacji.
  • ok: to instruuje PAM, że administrator systemu uważa, że ten kod powrotu powinien bezpośrednio wpływać na kod powrotu pełnego stosu modułów.
  • gotowe: odpowiednik ok, ale może zakończyć stos modułów i PAM natychmiast powróci do aplikacji.
  • N (liczba całkowita bez znaku): odpowiednik ok, ale może przeskoczyć następne N modułów na stosie.
  • Resetuj: ta akcja czyści całą pamięć stanu stosu modułów i uruchamia ponownie z następnym ułożonym modułem.

Każde z czterech słów kluczowych: wymagane; wymagany; wystarczający; i opcjonalne, mają równoważne wyrażenie pod względem składni [...], które pozwalają na pisanie bardziej skomplikowanych reguł i są to:

  • wymagane: [success=ok new_authtok_reqd=ok ignorowanie=ignore default=bad]
  • wymaganie: [success=ok new_authtok_reqd=ok ignorowanie=ignore default=die]
  • wystarczający: [success=done new_authtok_reqd=done default=ignore]
  • opcjonalne: [success=ok new_authtok_reqd=ok default=ignore]

Poniżej znajduje się przykład z nowoczesnego systemu CentOS 7. Rozważmy te reguły z pliku /etc/pam.d/postlogin PAM:

#%PAM-1.0
This file is auto-generated.
User changes will be destroyed the next time authconfig is run.
session     [success=1 default=ignore] pam_succeed_if.so service !~ gdm* service !~ su* quiet
session     [default=1]   pam_lastlog.so nowtmp showfailed
session     optional      pam_lastlog.so silent noupdate showfailed

Oto kolejna przykładowa konfiguracja z pliku PAM /etc/pam.d/smartcard-auth:

#%PAM-1.0
This file is auto-generated.
User changes will be destroyed the next time authconfig is run.
auth        required      pam_env.so
auth        [success=done ignore=ignore default=die] pam_pkcs11.so nodebug wait_for_card
auth        required      pam_deny.so

account     required      pam_unix.so
account     sufficient    pam_localuser.so
account     sufficient    pam_succeed_if.so uid < 1000 quiet
account     required      pam_permit.so

password    required      pam_pkcs11.so

session     optional      pam_keyinit.so revoke
session     required      pam_limits.so
-session     optional      pam_systemd.so
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session     required      pam_unix.so

Aby uzyskać więcej informacji, zobacz stronę podręcznika pam.d:

man pam.d 

Na koniec, obszerny opis składni pliku konfiguracyjnego i wszystkich modułów PAM można znaleźć w dokumentacji Linux-PAM.

Streszczenie

PAM to potężny interfejs API wysokiego poziomu, który umożliwia programom wymagającym uwierzytelniania autentycznych użytkowników korzystanie z aplikacji w systemie Linux. Jest potężny, ale bardzo trudny do zrozumienia i użycia.

W tym artykule wyjaśniliśmy, jak skonfigurować zaawansowane funkcje PAM w Ubuntu i CentOS. Jeśli masz jakieś pytania lub uwagi, którymi chcesz się podzielić, skorzystaj z poniższego formularza opinii.