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ń: 24005

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

OSnews Wykop Blip Flaker Kciuk Śledzik Facebook Identi.ca Twitter del.icio.us Google Bookmarks