PAM - limitowanie uprawnień użytkowników
Kategoria: Artykuły, etykiety: system, bezpieczeństwo
Dodany: 2009-07-27 01:01
(zmodyfikowany: 2009-08-16 12:44)
Przez: winnetou
Wyświetleń: 24015
Tytułem wstępu
Zastanawiasz się jak ograniczyć samowolkę użytkowników w systemie? Masz dość powolnego działania systemu mimo, że zalogowanych jest tylko 5 użytkowników a maszyna teoretycznie powinna wytrzymać kolejnych minimum 10? Szukasz prostszego sposobu niż jail? Przyjrzyjmy się wbudowanym mechanizmom dostępnym "out-of-box".
Wykorzystane narzędzia
W standardowo zainstalowanym systemie wiele narzędzi korzysta z PAM - Pluggable Authentication Modules. Jednym z takich narzędzi jest /etc/security/limits.conf. Aby z zacząć z niego korzystać w plikach /etc/pam.d/login (i opcjonalnie /etc/pam.d/ssh) musimy odkomentować (lub jeśli nie istnieje to dopisać) linijkę:
session required pam_limits.so
Struktura pliku /etc/security/limits.conf
Limity określa się w pliku /etc/security/limits.conf, którego budowa wygląda następująco:
Kto TypOgraniczenia NazwaOgraniczenie Wartość
Kto może przybierać jedną z trzech wartości
- nazwa użytkownika
- nazwa grupy, która musi być poprzedzona znakiem @
- wildcard * oznaczający wszystkich.
TypOgraniczenia - może przyjąć jedną z wartości:
- hard - dla limitów nieprzekraczalnych
- soft - dla limitów, które chwilowo mogą być przekroczone
- "-" - co oznacza wyłączenie danego limitu
NazwaOgraniczenia przyjmuje jedną z poniższych wartości:
- core - limit rozmiaru tak zwanych plików core tworzonych podczas awarii jakiegoś programu.
- data - uboższa wersja narzędzia quota, ustawia rozmiar przestrzeni dyskowej przydzielonej użytkownikowi/grupie.*
- fsize - maksymalny rozmiar pojedynczego pliku (przydatne gdy nie chcemy aby użytkownicy trzymali na naszym komputerze filmy czy obrazy ISO)*
- memlock -
- nofile - maksymalna liczba jednocześnie otwartych plików.
- rss -
- stack - maksymalny rozmiar stosu
- cpu - maksymalny dostępny czas procesora, w minutach, dostępny dla pojedynczego procesu - ustawienie tego limitu pozwala zapobiegać sytuacjom gdy użytkownik zechce wykorzystać nasz komputer do kompilacji różnego rodzaju "kolosów". To, że ustawimy tutaj limit, np 2min nie oznacza, że użytkownik zostanie wylogowany po 2 minutach.
- nproc - określa ile procesów może uruchomić użytkownik. Należy zwrócić baczną uwagę na podawane tu ograniczenie. Ustawienie zbyt małej wartości może doprowadzić do tego, że zalogowanie się na dane konto nie będzie możliwe - mimo iż użytkownik nie zrobił jeszcze nic złego. Pamiętajmy, że samo zalogowanie się do systemu uruchamia procesy typu login, powłoka, etc. Ustawienie zbyt dużej wartości (lub całkowite zignorowanie jej) może doprowadzić do (nie)świadomego ataku DoS
- as -
- maxlogins - maksymalna liczba równoległych logowań.
- maxsyslogins - maksymalna liczba zalogowanych do systemu użytkowników.
- priority - priorytet z jakim będą uruchamiane procesy użytkownika. W systemach Linux/Unix priorytet procesu zawiera się w przedziale [-20,20]. Przy czym im niższa wartość priorytetu tym więcej czasu procesora zostaje przydzielone. Standardowo procesy użytkowników uruchamiane są z priorytetem równym 0. Dodatkowo do manipulacji priorytetami służą narzędzia nice oraz renice. Priorytet poniżej zera może ustawić tylko super user
- locks -
- sigpending - maksymalna ilość oczekujących komunikatów (między procesami) (kernel >2.6.x)
- msgqueue - dla systemów z krenelem 2.6.x rozmiar kolejki zajmowanej przez komunikaty POSIX
- nice - maksymalny priorytet jaki użytkownik może ustawić dla procesu (wartość powinna być z przedziału [0, priority].
- rtprio -
Uwaga! Jednostką podstawową dla wielkości plików i przestrzeni dyskowej jest KB.
* - Przy ustalaniu limitu na rozmiar pliku czy dostępnej przestrzeni dyskowej należy zwrócić baczną uwagę na już istniejące pliki, i na pliki z katalogu /etc/skel, które kopiowane są podczas tworzenia nowych kont. Ustawienie maksymalnego rozmiaru pliku na 50kb podczas gdy chociaż jeden z plików konfiguracyjnych zajmuje 100k może zablokować możliwość zalogowania się na konto lub błąd podczas tworzenia konta.
Przykłady użycia.
Załóżmy, że nasza maszyna to serwer udostępnia usługi ftp,www oraz konta shellowe. Chcemy ograniczyć użytkownikom z grupy ftp i www rozmiar pliku do 1MB, przydzieloną przestrzeń dyskową do 100MB, oraz zabronić im logowania się przez ssh oraz pozwolić na otwarcie maksymalnie 2 plików.
@ftp hard data 102400
@ftp hard fsize 1024
@ftp hard maxlogins 0
@ftp hard nofile 2
@www hard data 102400
@www hard fsize 1024
@www hard maxlogins 0
@www hard nofile 2
Dla użytkownikom posiadającym konta shell chcemy pozwolić na maksymalnie 2 równoległe logowania, przydzielimy 1GB przestrzeni dyskowe i 10MB na pojedynczy plik. Dopuścimy równoczesne otwarcie 5 plików, uruchomienie 10 procesów, ograniczymy czas procesora do 15 minut, pozwolimy zająć maksymalnie 30MB pamięci a uruchamiane przez nich procesy będą miały priorytet 10
@shell hard data 1048576
@shell hard fsize 10240
@shell hard maxlogins 2
@shell hard nofile 5
@shell hard nproc 10
@shell hard priority 15
@shell hard cpu 15
@shell hard memlock 30720
Dodatkowo dla użytkownika janek zniesiemy limit rozmiaru plików, ilości otwartych plików, oraz zwiększymy liczbę logowań, procesów i czas procesora.
janek hard data 1048576
janek - fsize 10240
janek hard maxlogins 5
janek - nofile 5
janek hard nproc 30
janek hard priority 15
janek hard cpu 30
janek hard memlock 30720
Uwaga: Limity użytkowników są ważniejsze od limitów grup. Powiedzmy, że użytkownik janek z powyższego przykładu należy do grupy shell to jedyne ograniczenia jakie będą go dotyczyć to te poprzedzone jego loginem. W przypadku, gdy grupa ma ustawionych więcej ograniczeń to ustawienia użytkownika nadpisują te powtarzające się.
Niestety nie znalazłem dokładnego opisu (a te które wskazał wujek google bardzo często były sprzeczne lub nie działały) kilku zmiennych dlatego nie opisałem ich. Jak tylko znajdę uaktualnię opis.
Błędy i sugestie proszę zgłaszać na:
- JID: winnetou\małpa/jabster.pl
- E-mail: wilkosz.p\małpa/gmail.com