SUID, SGID i sticky bit w Linuksie – jak działają i kiedy ich używać

Oskar Gajzler
Przez
Oskar Gajzler
Redaktor IINTE.edu.pl, na co dzień zajmuje się technologiami internetowymi i tłumaczeniem skomplikowanych tematów na prosty język. Pisze poradniki o tym, jak załatwiać sprawy przez internet, jak...
13 min czytania

1. Przypomnienie – standardowe uprawnienia Linux (rwx)

Każdy plik/katalog ma trzy podstawowe zestawy uprawnień:

  • dla właściciela (user),
  • dla grupy (group),
  • dla pozostałych (others).

Każdy zestaw to kombinacja:

  • r – read (odczyt);
  • w – write (zapis);
  • x – execute (wykonanie / wejście do katalogu).

Przykład z poleceniem ls -l:

ls -l /bin/ping
-rwsr-xr-x 1 root root 71024 Jan 1 12:00 /bin/ping

Pierwszy znak - oznacza zwykły plik. Kolejne 9 znaków to uprawnienia w trzech trójkach.

W powyższym przykładzie uprawnienia wyglądają tak:

  • rws – dla właściciela (zwróć uwagę na s zamiast x),
  • r-x – dla grupy,
  • r-x – dla innych.

Domyślnie w miejscu x widzimy x (wykonywalny) lub - (brak wykonania). Specjalne bity (SUID, SGID, sticky) „nadpisują” to miejsce literami s lub t.

2. Czym są SUID, SGID i sticky bit – ogólny przegląd

Linux ma trzy specjalne bity uprawnień:

  • SUID (Set UID),
  • SGID (Set GID),
  • sticky bit.

Działają one inaczej na plikach wykonywalnych niż na katalogach.

W skrócie ich działanie wygląda następująco:

Bit Na pliku Na katalogu
SUID Program działa z uprawnieniami właściciela pliku. Zazwyczaj ignorowany/nieużyteczny z powodów bezpieczeństwa.
SGID Program działa z uprawnieniami grupy pliku. Nowe pliki dziedziczą grupę katalogu (nie grupę tworzącego).
Sticky Historycznie na pliku – dziś praktycznie nieużywany. Tylko właściciel pliku, właściciel katalogu lub root może usuwać/zmieniać pliki.

W wizualizacji ls -l szukaj następujących wskaźników:

  • SUID – litera s/S w polu uprawnień użytkownika (owner) zamiast x;
  • SGID – litera s/S w polu uprawnień grupy zamiast x;
  • sticky – litera t/T w polu uprawnień others zamiast x.

Małe litery (s, t) oznaczają, że zwykłe x też jest ustawione. Wielkie litery (S, T) pojawiają się, gdy brakuje zwykłego x – to zwykle niespójna konfiguracja.

3. SUID – uruchamianie programu z uprawnieniami właściciela

3.1. Co robi SUID?

SUID (Set User ID) sprawia, że plik wykonywalny działa z uprawnieniami właściciela pliku, a nie użytkownika, który go uruchomił.

Typowy scenariusz wygląda tak:

  • program jest własnością roota,
  • zwykły użytkownik go uruchamia,
  • program działa „tak, jakby uruchomił go root” (czyli z prawami właściciela pliku).

Przykład: /usr/bin/passwd zmienia hasło, choć użytkownik sam nie może modyfikować /etc/shadow – passwd jako SUID-root może to zrobić.

3.2. Jak rozpoznać SUID?

ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 64424 Jan 1 12:00 /usr/bin/passwd

Widzisz rws u właściciela – litera s zamiast x oznacza, że SUID jest ustawiony.

Gdy właściciel nie ma x, zobaczysz duże S (zwykle błąd konfiguracji):

-rwSr-xr-x 1 root root ... plik

3.3. Jak ustawić i usunąć SUID?

Składnia symboliczna chmod

Ustawienie SUID:

chmod u+s plik

Usunięcie SUID:

chmod u-s plik

To najwygodniejsza forma w praktyce.

Składnia numeryczna

Standardowe uprawnienia rwxr-xr-x to 755. Bit SUID ma wartość 4 i jest dodatkową cyfrą z przodu.

Ustawienie SUID na pliku z uprawnieniami 755:

chmod 4755 plik

Ogólny wzór wartości w chmod:

[SUID(4)][SGID(2)][sticky(1)][rwx dla usera][rwx dla grupy][rwx dla innych]

3.4. Kiedy stosować SUID?

SUID ma sens, gdy spełnione są następujące warunki:

  • zwykły użytkownik musi wykonać czynność wymagającą wyższych praw,
  • nie chcesz dawać mu pełnego sudo,
  • czynność jest ściśle ograniczona do jednego, kontrolowanego programu.

Typowe zastosowania obejmują:

  • passwd – zmiana hasła (modyfikuje /etc/shadow);
  • ping – historycznie wymagał surowych gniazd (dziś często zastępują go capabilities);
  • dedykowane narzędzia administracyjne – np. bezpiecznie napisany program do restartu konkretnej usługi.

3.5. Zagrożenia bezpieczeństwa przy SUID

SUID to jeden z najczęstszych wektorów eskalacji uprawnień.

Kluczowe ryzyka:

  • błąd w programie SUID-root może umożliwić uzyskanie roota,
  • SUID na powłoce (/bin/bash) lub edytorze (/usr/bin/vim) ułatwia zdobycie root shella,
  • stare skrypty SUID mogą niebezpiecznie wywoływać programy zewnętrzne.

Rekomendacje bezpieczeństwa:

  • minimalizuj liczbę plików z SUID – mniej potencjalnych punktów ataku;
  • nie ustawiaj SUID na powłokach (bash, sh, zsh) – łatwa eskalacja uprawnień;
  • nie ustawiaj SUID na edytorach (vim, nano) – możliwość wywołań systemowych;
  • nie ustawiaj SUID na interpreterach (python, perl) – możliwość wykonania dowolnego kodu;
  • preferuj precyzyjny sudo lub capabilities (np. setcap) tam, gdzie to możliwe;
  • regularnie audytuj pliki z SUID (patrz sekcja 7.3).

4. SGID – uprawnienia grupy na pliku i dziedziczenie grupy w katalogach

4.1. SGID na pliku – program działa z uprawnieniami grupy

SGID (Set Group ID) działa podobnie jak SUID, ale na poziomie grupy. Jeśli na pliku wykonywalnym ustawisz SGID, program będzie działał z uprawnieniami grupy pliku, niezależnie od grupy użytkownika uruchamiającego.

Przykład z ls -l:

ls -l /usr/local/bin/program
-rwxr-sr-x 1 root devs 123456 Jan 1 12:00 /usr/local/bin/program

Widać rwxr-sr-x – litera s w pozycji grupy oznacza, że SGID jest ustawiony.

Scenariusz użycia:

  • plik należy do grupy devs,
  • program uruchamia użytkownik spoza devs,
  • program wykonuje operacje tak, jakby działał w kontekście grupy devs (np. zapis do katalogu dostępnego tylko dla tej grupy).

4.2. SGID na katalogu – dziedziczenie grupy

Wszystkie nowe pliki i podkatalogi tworzone w katalogu z SGID dziedziczą grupę katalogu, a nie grupę właściciela pliku.

Przykład konfiguracji:

  • katalog /shared należy do grupy projektX,
  • na katalogu ustawiono SGID,
  • każdy nowy plik w /shared ma grupę projektX, niezależnie od tego, kto go utworzył.

To standardowy sposób tworzenia współdzielonych katalogów projektowych.

Sprawdzenie w praktyce:

ls -ld /shared
drwxrwsr-x 2 root projektX 4096 Jan 1 12:00 /shared
# ^ ^ ^
# | | |
# katalog grupa projektX
# s w polu grupy → SGID

Zwróć uwagę na literę s w środkowej trójce (rws).

4.3. Jak ustawić/zdjąć SGID?

Symbolicznie

Ustaw SGID na pliku lub katalogu:

chmod g+s plik_lub_katalog

Zdejmij SGID:

chmod g-s plik_lub_katalog

Numerycznie

SGID ma wartość 2 jako dodatkowa cyfra z przodu.

Ustaw SGID na katalogu z uprawnieniami 775:

chmod 2775 /shared

Połączenie SUID + SGID (np. w specyficznych scenariuszach):

chmod 6755 plik # 4 (SUID) + 2 (SGID) + 0755

4.4. Kiedy używać SGID?

Na plikach – rzadko, podobnie jak SUID: dla specyficznych narzędzi, które muszą działać z uprawnieniami określonej grupy (np. dostęp do katalogu logów aplikacji).

Na katalogach – bardzo często, w szczególności w tych przypadkach:

  • współdzielone katalogi zespołowe/projektowe (np. /srv/projekty/projektX),
  • drzewa aplikacji WWW (np. /var/www/nazwa_aplikacji),
  • zespołowe katalogi developerskie (np. grupa devs i /home/devs/shared),
  • obszary robocze, gdzie ważna jest spójna grupa dla wszystkich plików.

Dzięki SGID użytkownicy nie muszą ręcznie zmieniać grupy (chgrp), a pliki zawsze zachowują spójne właścicielstwo grupowe.

5. Sticky bit – ochrona przed usuwaniem cudzych plików w katalogu

5.1. Co robi sticky bit?

Sticky bit na katalogu ogranicza możliwość usuwania/zmiany plików.

Pliki w katalogu ze sticky mogą usuwać/zmieniać tylko:

  • właściciel pliku,
  • właściciel katalogu,
  • root.

Inni użytkownicy, nawet posiadający prawo w do katalogu, nie mogą usuwać cudzych plików. To dlatego katalog /tmp jest współdzielony, ale użytkownicy nie usuwają sobie nawzajem plików.

5.2. Jak rozpoznać sticky bit?

ls -ld /tmp
drwxrwxrwt 10 root root 4096 Jan 1 12:00 /tmp
# ^^^
# t zamiast x dla "others" → sticky bit

Zwróć uwagę na końcowe t w uprawnieniach. Gdy nie ma x dla others, a jest sticky, zobaczysz duże T.

5.3. Ustawianie i zdejmowanie sticky bit

Symbolicznie

Ustaw sticky:

chmod +t katalog # lub precyzyjnie: chmod o+t katalog

Usuń sticky:

chmod -t katalog # lub: chmod o-t katalog

Numerycznie

Sticky ma wartość 1 jako dodatkowa cyfra z przodu.

Katalog współdzielony z pełnymi prawami i sticky (jak /tmp):

chmod 1777 /wspolne

5.4. Kiedy stosować sticky bit?

Sticky bit jest niemal obowiązkowy, gdy katalog jest współdzielony przez wiele osób:

  • każdy może tworzyć w nim pliki/katalogi,
  • ale nikt nie powinien usuwać cudzych,
  • chcesz prosto ograniczyć ryzyko przypadkowych lub złośliwych skasowań.

Typowe przykłady wdrożeń:

  • /tmp i /var/tmp – katalogi tymczasowe systemu;
  • wspólne katalogi projektowe – każdy może wrzucać pliki, ale nie usuwa cudzych;
  • katalogi typu /wymiana, /public, /upload – bezpieczna wymiana plików między użytkownikami.

6. Jak ustawiać specjalne bity – praktyczna ściągawka

6.1. Tabela wartości numerycznych

Poniżej znajdziesz szybkie porównanie wartości numerycznych dla specjalnych bitów:

Specjalny bit Wartość numeryczna Cyfra w chmod
SUID 4 4xxx
SGID 2 2xxx
sticky 1 1xxx

Można je sumować następująco:

  • SUID + SGID = 4 + 2 = 6,
  • SUID + sticky = 5,
  • SGID + sticky = 3,
  • SUID + SGID + sticky = 7.

6.2. Przykłady chmod – numerycznie

SUID na pliku wykonywalnym (rwxr-xr-x):

chmod 4755 /usr/local/bin/narzedzie

SGID na katalogu współdzielonym (rwxrwsr-x):

chmod 2775 /srv/projekty/projektX

Sticky na katalogu tymczasowym (jak /tmp):

chmod 1777 /tmp2

SGID + sticky (rzadziej spotykane):

chmod 3775 /srv/wspolne

6.3. Przykłady chmod – symbolicznie

SUID – ustaw/zdejmij:

chmod u+s plik
chmod u-s plik

SGID – ustaw/zdejmij:

chmod g+s katalog
chmod g-s katalog

Sticky – ustaw/zdejmij:

chmod +t katalog
chmod -t katalog

7. Praktyczne scenariusze – gotowe przepisy

7.1. Współdzielony katalog projektowy z dziedziczeniem grupy (SGID + opcjonalnie sticky)

Załóżmy, że masz grupę projektX i chcesz, aby wszyscy członkowie mogli tworzyć pliki w /srv/projekty/projektX, wszystkie pliki miały grupę projektX, a osoby spoza grupy nie miały dostępu.

Krok po kroku

  1. Utwórz grupę (jeśli jej nie ma):

sudo groupadd projektX

  1. Dodaj użytkowników do grupy:

sudo usermod -aG projektX jan
sudo usermod -aG projektX anna

  1. Utwórz katalog:

sudo mkdir -p /srv/projekty/projektX

  1. Ustaw właściciela i grupę:

sudo chown root:projektX /srv/projekty/projektX

  1. Ustaw uprawnienia z SGID:

sudo chmod 2775 /srv/projekty/projektX
# lub symbolicznie:
sudo chmod g+rws /srv/projekty/projektX

Od tej pory każdy nowo utworzony plik będzie miał grupę projektX.

  1. (Opcjonalnie) zabezpiecz przed usuwaniem cudzych plików (sticky):

sudo chmod 3775 /srv/projekty/projektX # SGID (2) + sticky (1) = 3
# lub:
sudo chmod g+s,+t /srv/projekty/projektX

7.2. Bezpieczniejsza alternatywa dla SUID – sudo

W wielu przypadkach lepiej użyć sudo z precyzyjną konfiguracją w /etc/sudoers niż własnych narzędzi z SUID.

Najważniejsze zalety sudo:

  • szczegółowe logowanie (kto, kiedy, co wykonał),
  • granularne uprawnienia (konkretne polecenia, z konkretnymi argumentami),
  • łatwiejszy audyt niż w przypadku programów z SUID.

SUID zostaw głównie dla domyślnych programów systemowych (np. passwd) oraz naprawdę koniecznych, dobrze przetestowanych narzędzi.

7.3. Jak znaleźć wszystkie pliki z SUID/SGID w systemie

Regularny audyt to podstawa bezpieczeństwa. Poniższe polecenia pomogą szybko wykryć newralgiczne pliki:

Znajdź pliki z SUID:

find / -perm -4000 -type f -exec ls -l {} \; 2>/dev/null

Znajdź pliki z SGID:

find / -perm -2000 -type f -exec ls -l {} \; 2>/dev/null

Znajdź pliki z SUID lub SGID:

find / \( -perm -4000 -o -perm -2000 \) -type f -exec ls -l {} \; 2>/dev/null

Warto porównać wyniki z listą „standardowych” SUID/SGID w danej dystrybucji, aby szybko wykryć anomalie.

Udostępnij ten artykuł
Obserwuj
Redaktor IINTE.edu.pl, na co dzień zajmuje się technologiami internetowymi i tłumaczeniem skomplikowanych tematów na prosty język. Pisze poradniki o tym, jak załatwiać sprawy przez internet, jak bezpiecznie korzystać z sieci i jak dobierać sprzęt oraz oprogramowanie. Prywatnie tropi nowinki technologiczne i testuje je, zanim opisze.
Brak komentarzy

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Wymagane pola są oznaczone *