Wielodostępność i anatomia plików użytkowników w Linuxie

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:

💡 Władzę daje UID, a nie nazwa!

Użytkownik root nie ma praw administratora dlatego, że nazywa się "root". Ma je dlatego, że jego UID = 0! Gdybyś utworzył konto o nazwie adam z UID = 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:

  1. uid=1000(student) - identyfikator bieżącego użytkownika,
  2. gid=1000(student) - grupa podstawowa (Primary Group), do której domyślnie należeć będą wszystkie pliki tworzone przez tego użytkownika,
  3. grupy=... - grupy dodatkowe (Supplementary Groups), nadające dodatkowe uprawnienia (np. grupa sudo pozwalają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ę $PATH zwykłego użytkownika oraz pozostaje w jego katalogu /home/...! Skutkuje to błędem command not found przy próbie wykonania poleceń z katalogów /sbin lub /usr/sbin (np. fdisk, reboot, iptables).

Zawsze używaj: su - (lub su -l), co uruchamia tzw. Login Shell - ładuje czyste środowisko roota, jego $PATH oraz 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/sudoers choćby jedną literówkę, parser zablokuje działanie sudo dla wszystkich użytkowników w systemie. Do edycji tego pliku służy wyłącznie narzędzie sudo visudo.

visudo blokuje plik przed jednoczesną edycją oraz przed zapisaniem na dysku weryfikuje poprawność składniową. Jeśli wykryje błąd, zapyta: What now? [e, x, Q] (wybierz e, aby poprawić lub x, 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 (:):

  1. Pole 1: Nazwa użytkownika (Login)
    Unikalny identyfikator tekstowy używany podczas logowania (np. root, student).
  2. Pole 2: Znacznik hasła (litera 'x')
    Oznacza, że zaszyfrowany hash hasła znajduje się w zabezpieczonym pliku /etc/shadow.
  3. Pole 3: UID (User ID)
    Liczbowy identyfikator użytkownika (0 dla roota, 1000+ dla zwykłych użytkowników).
  4. Pole 4: GID grupy podstawowej (Primary GID)
    Identyfikator grupy, do której domyślnie przypisywane są nowo tworzone pliki.
  5. Pole 5: GECOS (Pole komentarza)
    Imię i nazwisko, numer pokoju, telefony kontaktowe (często puste lub oddzielone przecinkami).
  6. Pole 6: Katalog domowy
    Ścieżka bezwzględna do katalogu użytkownika (np. /root lub /home/student).
  7. 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, mail). Różnica: /bin/false po prostu natychmiast kończy działanie z kodem 1, natomiast /usr/sbin/nologin dodatkowo 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:

  1. Pole 1: Login użytkownika
    Nazwa konta, odpowiadająca wpisowi w /etc/passwd.
  2. Pole 2: Zaszyfrowane hasło ($id$salt$hash)
    Skrót kryptograficzny hasła wraz z identyfikatorem algorytmu i solą.
  3. Pole 3: Data ostatniej zmiany hasła
    Liczba dni, jakie upłynęły od 1 stycznia 1970 r. (Epoka UNIX) do dnia ostatniej zmiany.
  4. 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).
  5. 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).
  6. 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).
  7. Pole 7: Okres karencji/łaski (nieaktywność)
    Liczba dni po wygaśnięciu hasła, po których konto zostanie całkowicie wyłączone.
  8. 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.
  9. 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

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:

  1. Pole 1: Nazwa grupy
     Tekstowa nazwa grupy (np. sudo, users, programisci).
  2. Pole 2: Hasło grupy
     Znak x (ewentualne hasła grup przechowywane są w /etc/gshadow).
  3. Pole 3: GID (Group ID)
     Unikalny numer identyfikacyjny grupy.
  4. 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 anna ma grupę programisci jako 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/group wymienia się wyłącznie użytkowników, dla których jest to grupa dodatkowa.