Linux od samych swoich korzeni (architektura UNIX z lat 70.) został zaprojektowany jako system wielodostępny (multi-user) oraz wielozadaniowy. Oznacza to, że z jednej maszyny może jednocześnie korzystać wielu użytkowników, a setki procesów działają w izolacji. Aby zapewnić bezpieczeństwo i stabilność, system musi jednoznacznie wiedzieć: kto jest kim, co mu wolno oraz jak chronić zasoby przed nieuprawnionym dostępem.
Identyfikatory UID oraz GID - jak widzi Cię system?
Dla człowieka tożsamością w systemie jest login tekstowy, np. student, jan czy root. Jednak jądro systemu Linux (kernel) kompletnie ignoruje napisy tekstowe.
Wewnątrz struktur jądra (w tabeli procesów i uprawnieniach systemowych) liczą się wyłącznie liczby całkowite:
- UID (User Identifier): unikalny identyfikator użytkownika,
- GID (Group Identifier): identyfikator grupy, do której przypisany jest dany zasób lub proces.
💡 Władzę daje UID, a nie nazwa!
Użytkownik
rootnie ma praw administratora dlatego, że nazywa się "root". Ma je dlatego, że jego UID = 0! Gdybyś utworzył konto o nazwieadamzUID = 0, system nada mu absolutną władzę nad systemem dokładnie tak samo jak głównemu rootowi.
Standardowe przedziały numeracji UID i GID w Linuxie
| Zakres UID / GID | Przeznaczenie | Przykłady kont | Opis techniczny |
0 |
Superużytkownik (root) | root |
Omija wszelkie ograniczenia uprawnień (DAC). Zawsze UID=0. |
1-999 |
Konta systemowe / usługowe | daemon, bin, www-data, nginx, mysql, systemd-resolve |
Konta dedykowane demonom i usługom tła. Z reguły zablokowane logowanie interaktywne (powłoka /usr/sbin/nologin). (W starszych dystrybucjach RHEL 6 było to 1-499). |
1000-60000+ |
Zwykli użytkownicy (ludzie) | student, jan, egzamin |
Pierwszy użytkownik utworzony podczas instalacji otrzymuje zazwyczaj UID 1000. Wartości konfigurowane w pliku /etc/login.defs. |
65534 |
Konto nobody / nogroup | nobody |
Konto o celowo drastycznie obciętych uprawnieniach. Używane m.in. przez serwery plików NFS dla niezaufanych gości. |
Jak sprawdzić swoją tożsamość w konsoli? Polecenie id
student@debian:~$ id
uid=1000(student) gid=1000(student) grupy=1000(student),24(cdrom),27(sudo),100(users)
Polecenie id rozbija tożsamość na trzy elementy:
uid=1000(student)- identyfikator bieżącego użytkownika,gid=1000(student)- grupa podstawowa (Primary Group), do której domyślnie należeć będą wszystkie pliki tworzone przez tego użytkownika,grupy=...- grupy dodatkowe (Supplementary Groups), nadające dodatkowe uprawnienia (np. grupasudopozwalająca na podnoszenie uprawnień).
Powtórka: Podnoszenie uprawnień - su, sudo oraz /etc/sudoers
W codziennej pracy administratora obowiązuje Zasada Najmniejszych Przywilejów (Principle of Least Privilege): nigdy nie pracujemy bezpośrednio na koncie root bez wyraźnej potrzeby. Zwykłe zadania wykonujemy jako zwykły użytkownik, a uprawnienia podnosimy tylko na czas wykonania konkretnej czynności administracyjnej.
Tabela porównawcza: su vs sudo
| Cecha | Polecenie su (Switch User) | Polecenie sudo (Superuser Do) |
| Czyje hasło podajemy? | Hasło użytkownika docelowego (np. roota) | Hasło użytkownika wywołującego (Twoje własne) |
| Konto root w systemie | Musi być aktywne i posiadać zdefiniowane hasło. | Konto root może być całkowicie zablokowane (standard w Ubuntu). |
| Zakres działania | Przełącza tożsamość całej powłoki na innego użytkownika. | Wykonuje pojedyncze polecenie z prawami administratora. |
| Zasada rozliczalności (Audyt) | Słaba - po przełączeniu na roota nie wiadomo, który admin wydał polecenie. | Znakomita - każde polecenie jest logowane w /var/log/auth.log z dokładnym loginem użytkownika. |
| Kontrola uprawnień | Wszystko albo nic (albo znasz hasło roota, albo nie). | Precyzyjna (w /etc/sudoers można zezwolić np. tylko na restart jednej usługi). |
⚠️ Różnica między `su root` a `su - root`
Uruchomienie samego
su root(bez myślnika) zmienia uprawnienia na roota, ale zachowuje zmienne środowiskowe i ścieżkę$PATHzwykłego użytkownika oraz pozostaje w jego katalogu/home/...! Skutkuje to błędemcommand not foundprzy próbie wykonania poleceń z katalogów/sbinlub/usr/sbin(np.fdisk,reboot,iptables).Zawsze używaj:
su -(lubsu -l), co uruchamia tzw. Login Shell - ładuje czyste środowisko roota, jego$PATHoraz katalog roboczy/root.
Konfiguracja uprawnień: Plik /etc/sudoers i polecenie visudo
Plik /etc/sudoers określa, kto, na jakiej maszynie i jakie polecenia może wykonywać z podwyższonymi uprawnieniami.
⚠️Nigdy nie edytuj /etc/sudoers za pomocą nano / vim!
Jeśli zrobisz w pliku
/etc/sudoerschoćby jedną literówkę, parser zablokuje działaniesudodla wszystkich użytkowników w systemie. Do edycji tego pliku służy wyłącznie narzędziesudo visudo.
visudoblokuje plik przed jednoczesną edycją oraz przed zapisaniem na dysku weryfikuje poprawność składniową. Jeśli wykryje błąd, zapyta:What now? [e, x, Q](wybierze, aby poprawić lubx, aby wyjść bez zapisu).
Rozbicie składni wpisu w /etc/sudoers na czynniki pierwsze:

Typowe przykłady konfiguracji w /etc/sudoers:
# 1. Pełne uprawnienia roota dla konkretnego użytkownika:
jan ALL=(ALL:ALL) ALL
# 2. Pełne uprawnienia dla całej grupy (znak % oznacza grupę systemową!):
%sudo ALL=(ALL:ALL) ALL
%wheel ALL=(ALL:ALL) ALL
# 3. Uprawnienie tylko do jednego polecenia bez konieczności wpisywania hasła:
student ALL=(ALL) NOPASSWD: /usr/bin/apt update, /usr/bin/systemctl restart apache2
Budowa i analiza plików konfiguracyjnych
Wszystkie informacje o tożsamościach użytkowników i grup w tradycyjnym systemie Linux są przechowywane w trzech tekstowych bazach danych w katalogu /etc.
Plik bazy użytkowników /etc/passwd
Plik zawiera publiczne informacje o każdym koncie w systemie. Każda linia reprezentuje jednego użytkownika i składa się z dokładnie 7 pól rozdzielonych dwukropkiem (:):

- Pole 1: Nazwa użytkownika (Login)
Unikalny identyfikator tekstowy używany podczas logowania (np.root,student). - Pole 2: Znacznik hasła (litera 'x')
Oznacza, że zaszyfrowany hash hasła znajduje się w zabezpieczonym pliku/etc/shadow. - Pole 3: UID (User ID)
Liczbowy identyfikator użytkownika (0 dla roota, 1000+ dla zwykłych użytkowników). - Pole 4: GID grupy podstawowej (Primary GID)
Identyfikator grupy, do której domyślnie przypisywane są nowo tworzone pliki. - Pole 5: GECOS (Pole komentarza)
Imię i nazwisko, numer pokoju, telefony kontaktowe (często puste lub oddzielone przecinkami). - Pole 6: Katalog domowy
Ścieżka bezwzględna do katalogu użytkownika (np./rootlub/home/student). - Pole 7: Domyślna powłoka logowania
Program powłoki uruchamiany po zalogowaniu (np./bin/bash,/bin/sh)
🔍 Różnica: /usr/sbin/nologin vs /bin/false w polu 7
Oba wpisy uniemożliwiają interaktywne logowanie do powłoki dla kont usługowych (np.
www-data,/bin/falsepo prostu natychmiast kończy działanie z kodem 1, natomiast/usr/sbin/nologindodatkowo wyświetla uprzejmy komunikat "This account is currently not available." przed rozłączeniem.
Baza zaszyfrowanych haseł i zasad wygasania /etc/shadow
Plik o krytycznym znaczeniu dla bezpieczeństwa. Posiada uprawnienia -rw-r----- (należy do roota i grupy shadow) lub ---------- (w RHEL). Składa się z 9 pól:

- Pole 1: Login użytkownika
Nazwa konta, odpowiadająca wpisowi w/etc/passwd. - Pole 2: Zaszyfrowane hasło ($id$salt$hash)
Skrót kryptograficzny hasła wraz z identyfikatorem algorytmu i solą. - Pole 3: Data ostatniej zmiany hasła
Liczba dni, jakie upłynęły od 1 stycznia 1970 r. (Epoka UNIX) do dnia ostatniej zmiany. - Pole 4: Minimalna liczba dni ważności
Ile dni musi upłynąć, zanim użytkownik będzie mógł ponownie zmienić hasło (0 = w dowolnym momencie). - Pole 5: Maksymalna liczba dni ważności
Po ilu dniach hasło traci ważność i użytkownik musi je bezwzględnie zmienić (np. 90). - Pole 6: Dni ostrzeżenia przed wygaśnięciem
Ile dni przed wygaśnięciem hasła system zacznie ostrzegać przy logowaniu (np. 7 dni). - Pole 7: Okres karencji/łaski (nieaktywność)
Liczba dni po wygaśnięciu hasła, po których konto zostanie całkowicie wyłączone. - Pole 8: Data bezwzględnego wygaśnięcia konta
Data (w dniach od 01.01.1970), po której konto przestaje działać niezależnie od hasła. - Pole 9: Pole zarezerwowane
Zarezerwowane na przyszłe zastosowania jądra (obecnie pozostaje puste).
Jak rozszyfrować drugie pole w /etc/shadow?
Drugie pole ma format: $ID$SÓL$ZASZYFROWANY_SKRÓT
$1$= algorytm MD5 (przestarzały),$5$= algorytm SHA-256,$6$= algorytm SHA-512 (długi czas podstawowy standard),$y$= Yescrypt (współczesny domyślny standard w Debianie 12 i Ubuntu 22.04+ - algorytm odporny na łamanie na kartach graficznych).!na początku hasha (np.!$y$...) = konto zablokowane (komendąpasswd -llubusermod -L).*lub!jako jedyny znak = konto systemowe bez możliwości logowania hasłem.
Baza grup systemowych /etc/group
Definiuje grupy istniejące w systemie oraz ich członków dodatkowych. Składa się z dokładnie 4 pól:

- Pole 1: Nazwa grupy
Tekstowa nazwa grupy (np.sudo,users,programisci). - Pole 2: Hasło grupy
Znak x (ewentualne hasła grup przechowywane są w/etc/gshadow). - Pole 3: GID (Group ID)
Unikalny numer identyfikacyjny grupy. - Pole 4: Lista użytkowników dodatkowych
Loginy użytkowników należących do grupy jako grupy dodatkowej, oddzielone przecinkami (bez spacji!).
💡 Ważny szczegół: Gdzie podziała się grupa podstawowa?
Zwróć uwagę, że jeśli użytkownik
annama grupęprogramiscijako swoją grupę podstawową (wpisaną w 4. polu/etc/passwd), to NIE MUSI być wpisana w 4. polu pliku/etc/group! System i tak wie, że do niej należy. W/etc/groupwymienia się wyłącznie użytkowników, dla których jest to grupa dodatkowa.