Pluggable Authentication Modules
Transkrypt
Pluggable Authentication Modules
PAM Pluggable Authentication Modules Co to jest PAM ● Sens: – ● umożliwienie elastycznej kontroli dostępu do systemu i programów przez wprowadzenie możliwości definiowania własnych modułów dostępu. Koncepcja działania – ładowalne moduły autoryzacji (Pluggable Authorization Modules, PAM), popularnie zwane wtyczkami, zawierające specjalizowane metody identyfikacji – Oprócz autoryzacji mają dodatkowe możliwości, takie jak nakładanie dodatkowych ograniczeń (np. na liczbę jednoczesnych loginów). Poziomy działania, pierwszy ● Programista aplikacji: – umieszcza w programie (np. /bin/login) odpowiednie wywołania funkcji dla ładowalnych modułów autoryzacji (no i linkuje program z odpowiednią biblioteką). Drugi ● Programista modułów: – pisze ładowalne moduły autoryzacji zawierające specjalizowane metody identyfikacji (np. linie papilarne), które będą używane w aplikacjach. Poziom trzeci i najważniejszy:) ● Administrator: – instaluje i modyfikuje pliki konfiguracyjne dla aplikacji i modułów autoryzacji (i zapewne także instaluje moduły w systemie). API PAM ● ● API systemu PAM dzieli się na 4 w miarę niezależne grupy/usługi: – auth: zarządzanie autoryzacją i identyfikacją, – account: zarządzanie kontami, – session: zarządzanie sesjami (np. limity), – password: zarządzanie aktualizacją żetonów identyfikujących (np. haseł). Niektóre programy, np. login, potrzebują usług z wszystkich czterech grup. Inne, takie jak passwd, mogą korzystać tylko z wybranych grup. Konfiguracja ● ● ● Każda aplikacja chcąca używać PAM ma plik konfiguracyjny zawierający listę modułów dla procesu uwierzytelniania. Pliki te znajdują się w katalogu /etc/pam.d (w starych wersjach mógł być jeden wspólny plik /etc/pam.conf, obecnie jest on używany tylko gdy brak katalogu /etc/pam.d), na przykład dla /bin/login login plikiem tym będzie /etc/pam.d/login. Plik konfiguracyjny other zawiera wartości domyślne (zwykle zabrania wszystkiego). Konfiguracja c.d. ● Wpisy w plikach konfiguracyjnych mają postać: – ● <grupa> <kategoria> <moduł> np.: – auth required pam_securetty.so – auth auth required pam_stack.so service=system- Kategorie ● ● ● ● requisite niepowodzenie natychmiast wraca do aplikacji z błędem, required każdy taki moduł musi zwrócić sukces, sufficient sukces takiego modułu i wszystkich jego poprzedników, powoduje zwrócenie sukcesu do aplikacji (niepowodzenie jest ignorowane), optional ,,ozdobnik'' bez wpływu na sukces lub niepowodzenie. Moduł pam_stack.so i inne ● ● ● Moduł pam_stack.so odgrywa specjalną rolę --powoduje dołączenie list z innego podanego pliku --- zwykle system-auth. Poszczególne moduły ładowane są kolejno, wiele z nich ma pliki konfiguracyjne zawarte w katalogu /etc/security. Modułów PAM jest wiele, są one typu opensource, więc można je samodzielnie modyfikować. Moduły, przykłady ● Moduł pam_access zarządza klasycznym logowaniem do systemu lub aplikacji. W celu uaktywnienia modułu pam_access dla aplikacji login należy do jej pliku konfiguracyjnego dodać na końcu grupy account wiersz: – ● account required pam_access.so Moduł pam_access ma plik sterujący /etc/security/access.conf. Każdy wiersz w nim ma postać – <uprawnienie> : <użytkownicy> : <miejsca> – Uprawnienie to jeden ze znaków + lub -. Nazwy użytkowników można oddzielać spacjami. Miejsce to nazwa komputera, LOCAL oznacza dostęp lokalny. Limity ● ● Do nakładania limitów służy moduł pam_limits: – session required pam_limits.so – z plikiem konfiguracyjnym limits.conf. Składnia wierszy: – <dziedzina> <typ> <ograniczenie> <wartość> – gdzie <dziedzina> określa użytkowników lub grupy, <typ> to hard lub soft, zaś <ograniczenie> to np. fsize lub nproc. Aby pozwolić użytkownikowi guest tylko na jednokrotne logowanie, należy tam wpisać ● guest hard maxlogins 1 Inne ● ● ● Moduł pam_deny odmawia dostępu (zawsze zwraca niepowodzenie). Moduł pam_warn rejestruje w syslogu informacje o wykonywanej operacji. Moduł pam_securetty ogranicza do konsoli możliwość logowania się na konto root. PAM we własnym programie ● PAM można używać również we własnych aplikacjach. Popatrzmy na przykład w języku C: #include <security/pam_appl.h> #include <security/pam_misc.h> retval = pam_authenticate(pamh, 0); próba autoryzacji */ if (retval != PAM_SUCCESS) { #include <stdio.h> static struct pam_conv login_conv = { fprintf(stderr, "Chyba się nie udało!\n"); misc_conv, /* przykładowa funkcja konwersacji z libpam_misc */ exit(2); } NULL /* ewentualne dane aplikacji (,,domknięcie'') */ }; void main () { else fprintf(stderr, "Świetnie Ci poszło.\n"); pam_handle_t* pamh = NULL; int retval; char *username = NULL; printf("OK\n"); aplikacji */ retval = pam_start("login", username, &login_conv, &pamh); if (pamh == NULL || retval != PAM_SUCCESS) { fprintf(stderr, "Error when starting: %d\n", retval); exit(1); } /* rzekomy kod pam_end(pamh, PAM_SUCCESS); exit(0); } /* Opis programu ● ● ● Po wywołaniu pam_start zmienna pam będzie zawierać dowiązanie do obiektu PAM, który będzie argumentem wszystkich kolejnych wywołań funkcji PAM Zmienna pam_conv to struktura zawierająca informacje o funkcji do konwersacji ● z użytkownikiem -- tu użyliśmy najprostszej bibliotecznej funkcji ● misc_conv, można jednak użyć własnej ● Pierwszy argument funkcji pam_start to nazwa aplikacji, potrzebna do odnalezienia pliku konfiguracyjnego Opis programu c.d., kompilacja ● ● ● ● Funkcja pam_authenticate uruchamia ,,motor'' sprawdzania PAM – usługę Dla pozostałych usług/grup istnieją analogiczne funkcje Funkcja pam_end kończy sesję Przy kompilacji i linkowaniu należy pamiętać o bibliotekach libpam i libpam_misc, np. – gcc -o tescik tescik.c -lpam -lpam_misc – ew. apt-get install libpam0g-dev Zadanie ● ● ● Logowanie na konto user1 przez ssh niech będzie możliwe od 19 do 19:30 Ogranicz liczbę procesów dla user1 do 100 Wprowadź sprawdzanie złożoności hasła dla user1 (słownik) oraz dodatkowe warunki: – Minimalna długość hasła 12 znaków – Przynajmniej jedna wielka litera i cyfra