Zrozum PAM i NSS

21

W ostatnich dniach skonfigurowałem system Linux z uwierzytelnianiem LDAP i wszystko działa dobrze, ale wciąż jest coś, czego tak naprawdę nie mogę zrozumieć w odniesieniu do NSS i PAM, również po wielu badaniach.

Powołując się:

NSS pozwala administratorom określić listę źródeł, w których pliki uwierzytelniania, nazwy hostów i inne informacje będą przechowywane i wyszukiwane

i

PAM to zestaw bibliotek, które zapewniają konfigurowalną platformę uwierzytelniania dla aplikacji i systemu operacyjnego

To, czego nie rozumiem, to to, jak PAM i NSS współpracują ze sobą. W tej książce architektura została wyjaśniona całkiem dobrze: konfiguruję PAM do korzystania pam_ldapz kont LDAP i pam_unixkont lokalnych, a następnie konfiguruję nsswitch.confpobieranie informacji z plików lokalnych i LDAP.

Jeśli dobrze zrozumiałem, LDAP jest używany dwa razy: najpierw pam_ldapprzez NSS, który sam jest wywoływany z pam_unix. Czy to prawda? Czy LDAP naprawdę jest używany dwukrotnie? Ale dlaczego muszę skonfigurować zarówno NSS, jak i PAM? Wyjaśniam, że PAM wykonuje inne zadania niż NSS i jest używany przez inne programy. Ale wtedy powinno być możliwe używanie tylko NSS lub tylko PAM, jak czytałem na tej stronie .

Więc poeksperymentowałem trochę i najpierw próbowałem usunąć LDAP z nsswitch.conf(a uwierzytelnianie zatrzymało się, jakby tylko pam_ldap nie wystarczyło do wykonania zadania). Następnie ponownie włączyłem LDAP w NSS i usunąłem go z konfiguracji PAM (tym razem wszystko działało dobrze, jakby pam_ldapbyło bezużyteczne, a NSS wystarczy do uwierzytelnienia użytkownika).

Czy jest ktoś, kto może mi pomóc to wyjaśnić? Z góry bardzo dziękuję.

AKTUALIZACJA

Właśnie próbowałem coś teraz. Ponownie usunąłem wszystkie pam_ldapwpisy we wszystkich polach konfiguracji pam, a także usunąłem shadow: ldapz nsswitch.conf. Jak teraz w całym systemie są tylko linie: passwd: ldap filesi group: ldap filesw nsswitch.conf. Cóż ... logowanie do użytkowników LDAP działa idealnie, te dwie linie (plus /etc/ldap.conf) wystarczą, aby skonfigurować uwierzytelnianie LDAP.

Z mojej wiedzy PAM jest niezależny od NSS, ale moje testy wykazały, że nie. Więc zadaję sobie pytanie, czy można całkowicie wyłączyć NSS i używać tylko PAM?

ColOfAbRiX
źródło
Nie widziałem twojej aktualizacji. Uruchom następujące polecenia i zgłoś swoje wyniki, zastępując LDAPUSER użytkownikiem, który Twoim zdaniem jest skonfigurowany tylko w LDAP. getent shadow | grep LDAPUSER grep LDAPUSER /etc/shadow
Andrew B,

Odpowiedzi:

25

Pomaga rozbić takie rzeczy w twojej głowie:

  • NSS - oparty na modułach system do kontrolowania, w jaki sposób bazy danych na poziomie systemu operacyjnego są montowane w pamięci. Obejmuje to (ale nie tylko) passwd, group, shadow(jest to ważne, aby pamiętać) i hosts. Wyszukiwania UID korzystają z passwdbazy danych, a wyszukiwania GID korzystają z groupbazy danych.

  • PAM - modułowy system umożliwiający uwierzytelnianie i rozliczanie w oparciu o usługi. W przeciwieństwie do NSS, nie rozszerzasz istniejących baz danych; Moduły PAM mogą wykorzystywać dowolną logikę, jakkolwiek loginy powłoki nadal zależą od passwdi groupbaz danych NSS. (zawsze potrzebujesz wyszukiwania UID / GID)

Ważną różnicą jest to, że PAM nie robi nic samodzielnie. Jeśli aplikacja nie łączy się z biblioteką PAM i wykonuje do niej połączenia, PAM nigdy się nie przyzwyczai. NSS jest rdzeniem systemu operacyjnego, a bazy danych są dość wszechobecne dla normalnego działania systemu operacyjnego.

Teraz, gdy mamy to na uboczu, oto krzywa: chociaż pam_ldap jest popularnym sposobem uwierzytelniania na podstawie LDAP, nie jest to jedyny sposób.

  • Jeśli shadowwskazuje na usługę ldap wewnątrz /etc/nsswitch.conf, wszelkie uwierzytelnianie, które działa na bazie cienia, zakończy się powodzeniem, jeśli atrybuty tych mapowań pól cienia (w szczególności pole zaszyfrowanego hasła) są obecne w LDAP i pozwolą na logowanie.
    • To z kolei oznacza, że pam_unix.somoże to spowodować uwierzytelnienie w oparciu o protokół LDAP, ponieważ uwierzytelnia się ono w bazie danych w tle. (który jest zarządzany przez NSS i może wskazywać na LDAP)
  • Jeśli moduł PAM wykonuje wywołania przeciwko demonowi, który z kolei wysyła zapytanie do bazy danych LDAP (powiedzmy pam_sss.so, która podpina się sssd), możliwe jest, że odniesienie do LDAP będzie możliwe.
Andrew B.
źródło
Wielkie dzięki, wiem, że nsswitch.conf + pam_unix mogą same wykonać całą pracę. Ale PAM powinien być w stanie zrobić to samo, ponieważ jest niezależny, jak napisałeś. Rozumiem, że moduł pam_ldap powinien wystarczyć do uwierzytelnienia użytkownika na serwerze ldap. Czyż nie
ColOfAbRiX
6
Uwierzytelnij tak, ale jeśli nie masz innego sposobu na uzyskanie informacji o użytkowniku (lokalny / etc / passwd lub cokolwiek), nadal potrzebujesz sposobu na znalezienie członkostwa w grupie, katalogu domowego itp. Nadal mylisz uwierzytelnianie i wyliczanie autoryzacji / atrybutów.
TheFiddlerWins
1
@ColOfAbRiX TheFIddlerWins jest poprawny. Wystarczy uwierzytelnić się , ale jak zauważyłem, nadal potrzebujesz sposobu wyszukiwania identyfikatorów UID + członkostwa w GID. Są one uzyskiwane z baz danych passwdi group(NSS), co oznacza, że ​​muszą znajdować się w systemie lokalnym ( /etc/passwd+ /etc/group) lub uzyskać za pośrednictwem ldapmodułu NSS.
Andrew B,
3
Oto sposób na zrozumienie: uruchom getent passwdi włącz getent groupobsługę LDAP dla obu baz danych w /etc/nsswitch.conf. Następnie wyłącz LDAP w tym pliku i ponownie uruchom oba polecenia. getentto polecenie do zrzucania baz danych NSS.
Andrew B,
W końcu udało mi się wszystko zrozumieć przy odrobinie pracy. Dzięki chłopaki!
ColOfAbRiX
1

NSS służy do wyliczania informacji o usługach / użytkownikach (do jakiej grupy należysz, gdzie znajduje się Twój katalog domowy itp.). PAM określa, co zrobić z tymi informacjami.

Jeśli chcesz używać LDAP do uwierzytelniania , potrzebujesz pam_ldap. Jeśli używasz czegoś innego (konta lokalne, Kerberos itp.), Możesz tego nie robić.

Więc robią różne rzeczy. NSS otrzymuje informacje, PAM określa, kto może zrobić, co raz, gdy informacje te zostaną uzyskane.

TheFiddlerWins
źródło
Dzięki, ale problem polega na tym, że nie działa to w ten sposób, przynajmniej w moim systemie :) Na początku zrozumiałem to samo, ale potem próbowałem usunąć wszystkie wpisy pam_ldap w PAM i uwierzytelnianie LDAP nadal działało (i wyłączono pamięć podręczną). Zwiększyło to moje zamieszanie :)
ColOfAbRiX
Jak weryfikujesz autentyczność za pośrednictwem pam_ldap po jego usunięciu? Prześlij treść swojego wspólnego autora. Nie jestem pewien ścieżek w SUSE, ale w odpowiedzi na pierwszą część trzeciego pytania, nawet przy działającym pam_ldap, potrzebujesz sposobu, aby system wiedział, kim jesteś - zapewnia to NSS
TheFiddlerWins
Przepraszam, mam na myśli, że po usunięciu pam_ldap uwierzytelnianie LDAP działało bez niego, myślę, że działało przez NSS. Plik common-authzawierał tylko pam_env, pam_unix i pam_deny.
ColOfAbRiX
To nie ma sensu, jak potwierdziłeś, że autoryzacja LDAP działa?
TheFiddlerWins
Logowanie przy użyciu konta LDAP i monitorowanie dziennika serwerów LDAP. nscd (buforowanie) jest wyłączone
ColOfAbRiX