1. Przypomnienie – standardowe uprawnienia Linux (rwx)
Każdy plik/katalog ma trzy podstawowe zestawy uprawnień:
- 1. Przypomnienie – standardowe uprawnienia Linux (rwx)
- 2. Czym są SUID, SGID i sticky bit – ogólny przegląd
- 3. SUID – uruchamianie programu z uprawnieniami właściciela
- 4. SGID – uprawnienia grupy na pliku i dziedziczenie grupy w katalogach
- 5. Sticky bit – ochrona przed usuwaniem cudzych plików w katalogu
- 6. Jak ustawiać specjalne bity – praktyczna ściągawka
- 7. Praktyczne scenariusze – gotowe przepisy
- 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 zamiastx),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/Sw polu uprawnień użytkownika (owner) zamiastx; - SGID – litera
s/Sw polu uprawnień grupy zamiastx; - sticky – litera
t/Tw polu uprawnień others zamiastx.
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
/sharednależy do grupyprojektX, - na katalogu ustawiono SGID,
- każdy nowy plik w
/sharedma 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
devsi/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
- Utwórz grupę (jeśli jej nie ma):
sudo groupadd projektX
- Dodaj użytkowników do grupy:
sudo usermod -aG projektX jan
sudo usermod -aG projektX anna
- Utwórz katalog:
sudo mkdir -p /srv/projekty/projektX
- Ustaw właściciela i grupę:
sudo chown root:projektX /srv/projekty/projektX
- 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.
- (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.








