Konfiguracja Limitow

G

Guest

Gość
Do czego są te limity ?
Slużą one to ograniczania możliwości użytkowników poprzez np. ograniczenie ilości uruchamianych programów, powierzchni dyskowej, zajmowanej pamięci komputera, czy nawet całkiem blokowania wybranych opcji.

Aby limity działały, trzeba je najpierw włączyć w PAMie.
Otwieramy w jakimś edytorze tekstowym plik /etc/pam.d/login i dopisujemy lub odhaszowujemy linijkę:

session required pam_limits.so

Teraz dokładnie to samo robimy w pliku /etc/pam.d/ssh.
W tym momencie program login podczas uruchamiania będzie odczytywał plik /etc/security/limits.conf.
Otwieramy plik /etc/security/limits.conf i edytujemy...

W pliku limits.conf, każda reguła ma budowę:

<użytkownik/grupa> <rodzaj ograniczenia> <opcja> <wartość>

Jako pierwszy parametr możemy zdefiniować pojedynczego użytkownika lub całą grupę. Jako użytkownika podajemy tylko jego nazwę, natomiast jako grupę - nazwę grupy poprzedzoną znakiem @.

Rodzaje limitów mogą być tylko trzy: soft, hard lub znak "-".
Limit soft oznacza 'słabe ograniczenie', natomiast hard 'mocne'. Znak "-" wyłącza ten parametr.

Opcji do ograniczania mamy już trochę więcej:

* core - limit wielkości dla plików typu 'core', czyli tworzonych podczas awarii programów. (KB)
* data - po prostu dostępna powierzchnia dysku dla danego użytkownika/grupy. (KB)
* fsize - maksymalna dopuszczalna wielkość dla jednego pliku. (KB)
* memlock - maksymalna objętość zajmowanej pamięci komputera. (KB)
* nofile - ile plików maksymalnie w jednym momencie otworzyć.
* stack - maksymalna wielkość stosu. (KB)
* cpu - maksymalny czas procesora. (Minuty)
* nproc - ilość jednocześnie uruchomionych procesów systemowych.
* as - ograniczenie adresu pamięci.
* maxlogins - maksymalna liczba zalogowanych sesji w tym samym czasie.
* priority - tutaj można ustawić priorytet dla procesów uruchamianych przez użytkownika.
* locks - maksymalna ilość blokowanych plików w tym samym czasie.

W nawiasach podane są jednostki, jakimi określać trzeba wartość limitu.

Teraz przypuśćmy, że mamy w systemie użytkownika o nazwie "franek", który konta potrzebuje tylko do strony www i shell nie jest mu tak bardzo potrzebny, więc dodajemy do /etc/security/limits.conf:

franek hard nofile 2
franek hard nproc 7
franek hard maxlogins 2

Teraz franek będzie mógł mieć otworzone w jednym momencie tylko dwa pliki, będzie mógł mieć uruchomionych tylko 7 procesów i nie zaloguje się jednocześnie więcej niż dwoma sesjami. :)
Jako inny przykład, weźmy np. grupę użytkowników, którzy mają mieć dostęp tylko do servera ftp i pewnymi ograniczeniami, np.:

@ftp_users hard data 2048
@ftp_users hard fsize 100
@ftp_users hard nofile 1
@ftp_users hard maxlogins 0

Jak widać z tego, użytkownicy grupy "ftp_users" nie będą zadowoleni. ;)
Ich pojemność konta będzie wynosiła tylko 2 MB, maksymalna wielkość jednego pliku 100 KB, będą mogli w jednym momencie otworzyć tylko jeden plik i nie zalogują się na shella.

Równie dobrze możemy być trochę bardziej litościwi i obdarować swoich użytkowników 'trochę' lepszymi ograniczeniami. ;-)

raven soft data 1048576
raven - nproc 200

Czyli powierzchnia 1 GB i liczba procesów do 200. :)

Aktualny stan swoich limitów można zawsze sprawdzić poleceniem ulimit z podanym parametrem, który nas interesuje. Parametr "-a" pokazuje wszystkie ograniczenia, np.:

ulimit: usage: ulimit [-SHacdflmnpstuv] [limit]

:::raven@damned:::~$ ulimit -a
core file size (blocks, -c) 10240
data seg size (kbytes, -d) 1048576
file size (blocks, -f) unlimited
max locked memory (kbytes, -l) unlimited
max memory size (kbytes, -m) unlimited
open files (-n) 200
pipe size (512 bytes, -p) 8
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 500
virtual memory (kbytes, -v) 153600

Do czego jeszcze mogą nam się przydać limity ?
Jeśli nasz użytkownik jest początkującym programistą, który lubi testować swoje nowe programy na naszym komputerze, i nieodpowiednio użyje blokowania plików to może doprowadzić nasz system do trochę wolniejszej pracy.
Na pewno też przyda się do tak oczywistych rzeczy jak ograniczanie zużycia procesora (kiedy użytkownik będzie się nudził i zacznie sobie kompilować przez kilka godzin jakiegos giganta ;) lub zużycie pamięci.
Bardzo ważną opcją jest też 'nproc', które może nas czasami uchronić przed lokalnym atakiem DDoS, lub programów używających funkcji fork() w zły sposób. Przykładowo taki prosty program w C:

<------------ CUT --------------->

#include <sys/types.h>
#include <unistd.h>

int main()
{
for(;;)
{
fork();
}
return 0;
}

<------------ CUT --------------->

będzie tworzył w bardzo szybkim tempie procesy potomne w nieskończoność, co przeciętny komputer doprowadzi do zawieszenia w ciągu kilku sekund. Dokładniej mówiąc, po pierwszym wykonaniu pętli for() powstanie jeden proces potomny (w sumie juz będą dwa), po następnym wykonaniu powstaną kolejne procesy potomne aktulnych procesów (czyli juz 4), później będzie 8, itd. Wyobraź sobie efekty. ;-)
Jeśli ograniczymy naszemu użytkownikowi ilość uruchamianych procesów, będziemy spokojni o nasz system. (no prawie).

Jedna uwaga... zwracaj uwagę na limity jakie ustawiasz. Możesz ustawić zbyt mały co doprowadzi to niezamierzonych problemów, np. ustawiając 'fsize' lub 'data' zwróć uwagę na już istniejące pliki na koncie (chociażby te, które są dodawane automatycznie z kontem), ponieważ może się pojawić sytuacja, że ustawisz limit 'data' powiedzmy na 512, a użytkownik będzie mial na koncie pliki konfiguracyjne dodane przez system, które będą zajmowały ponad 1024 KB. W efekcie użytkownik nie będzie mogł się zalogować, chociaż nic złego nie zrobił. :)
Podobna sytuacja jest z liczbą procesów. Pamiętaj, że kiedy użytkownik się loguje do systemu, uruchamiane są różne programy (np. login), które są w tym przypadku procesami użytkownika. Może być sytuacja, że samo logowanie się użytkownika, uruchamia przez chwilę 5 procesów systemowych. Jeśli ustawisz mu mniej, to po prostu nie zaloguje się lub zostanie wpuszczony, ale wszystko będzie u niego wyglądało jak po przejściu burzy. ;-)
Po prostu część programów się nie uruchomi (np. nie zostaną załadaowane zmienne środowiskowe).
Dlatego właśnie zawsze przed ustawieniem limitu sprawdź czy na pewno nie będzie on stwarzał problemów.

--------
RAVEN ([email protected])
 
Do góry Bottom