Uprawnienia plików w Linuksie: chmod 755, 644 i 777
Uprawnienia plików w Linuksie decydują o tym, kto może odczytać, zapisać lub uruchomić każdy plik i katalog w systemie. Każdy element ma trzy klasy użytkowników (właściciela, grupę oraz wszystkich pozostałych), a każda klasa otrzymuje trzy bity uprawnień: odczyt (r), zapis (w) i wykonanie (x). To dziewięć bitów na plik. Ustawia je chmod, a skrót, który widać wszędzie, to zapis ósemkowy: rwx każdej klasy zwija się do jednej cyfry od 0 do 7 (odczyt 4 + zapis 2 + wykonanie 1).
Trzy tryby pokrywają niemal wszystko, co kiedykolwiek wpiszesz:
- 755 (
rwxr-xr-x) — katalogi i skrypty: właściciel może je zmieniać, a wszyscy pozostali odczytywać i uruchamiać. - 644 (
rw-r--r--) — zwykłe pliki: właściciel zapisuje, reszta tylko odczytuje. - 777 (
rwxrwxrwx) — pełny dostęp dla każdego. Prawie zawsze błąd; to luka w zabezpieczeniach, a nie rozwiązanie.
Przełącz dowolną kombinację w darmowym kalkulatorze chmod i obserwuj, jak zapis ósemkowy, ciąg rwx oraz dokładne polecenie aktualizują się razem. Pozostała część tego przewodnika wyjaśnia, jak te liczby działają i gdzie każda z nich pasuje.
Uprawnienia plików w Linuksie w 30 sekund
| Ósemkowo | Symbolicznie | Typowe zastosowanie |
|---|---|---|
| 400 | r-------- | Klucz prywatny SSH, tylko do odczytu |
| 600 | rw------- | Pliki prywatne, klucze SSH, .env |
| 644 | rw-r--r-- | Strony WWW, konfiguracja, większość plików |
| 700 | rwx------ | Katalogi prywatne (~/.ssh) |
| 755 | rwxr-xr-x | Skrypty, pliki binarne, katalogi WWW |
| 775 | rwxrwxr-x | Katalogi współdzielone przez grupę |
| 777 | rwxrwxrwx | Wszyscy, wszystko — unikać |
| 1777 | rwxrwxrwt | Współdzielone katalogi tymczasowe jak /tmp |
Zasada praktyczna: 644 dla plików, 755 dla katalogów, a stamtąd zaostrzaj. Rozluźniaj tryb tylko wtedy, gdy coś konkretnego przestaje działać, nigdy zapobiegawczo.
Model uprawnień: właściciel, grupa, pozostali
Jeden plik współdzielą trzy klasy. Właściciel (zwykle ten, kto go utworzył), pojedyncza grupa oraz pozostali, czyli każde konto, które nie jest ani właścicielem, ani członkiem grupy. Każda klasa niezależnie otrzymuje odczyt, zapis i wykonanie:
- odczyt (r) — podejrzenie zawartości pliku lub wylistowanie wpisów katalogu.
- zapis (w) — zmiana pliku albo dodawanie i usuwanie wpisów w katalogu.
- wykonanie (x) — uruchomienie pliku jako programu lub wejście (
cd) do katalogu.
Haczyk, który wielu zaskakuje: na katalogu bity znaczą co innego. r pozwala wylistować nazwy, w pozwala tworzyć i usuwać wpisy w środku, a x pozwala wejść do katalogu przez cd i sięgnąć po pliki w środku. Można mieć r bez x na katalogu, uruchomić na nim ls, a mimo to dostać „Permission denied” w chwili próby wejścia. Właśnie dlatego katalogi mają 755, a nie 644.
Odczytywanie wiersza ls -l
Uruchom ls -l, a każdy wpis zaczyna się od dziesięcioznakowego bloku:
$ ls -l
-rw-r--r-- 1 jack staff 1400 Jul 17 10:00 index.html
drwxr-xr-x 5 jack staff 160 Jul 17 10:00 assets
Czytaj go od lewej do prawej. Pierwszy znak to typ pliku, a nie uprawnienie: - to zwykły plik, d to katalog, l to dowiązanie symboliczne, c lub b to urządzenie, p to nazwany potok, s to gniazdo. Kolejne dziewięć znaków to trzy grupy rwx: właściciel, grupa, pozostali. Zatem -rw-r--r-- to zwykły plik, w którym właściciel odczytuje i zapisuje (rw-), a grupa i pozostali tylko odczytują (r-- r--), czyli 644. drwxr-xr-x to katalog o uprawnieniach 755.
Niektóre systemy dopisują znacznik po dziewięciu bitach. Końcowa . sygnalizuje kontekst SELinux, + oznacza, że ACL dodaje reguły wykraczające poza podstawowe bity, a w systemie macOS @ wskazuje atrybuty rozszerzone. Żaden z nich nie zmienia wartości ósemkowej. Zignoruj znacznik i odczytaj dziewięć znaków.
Zapis ósemkowy: jak 755 staje się rwxr-xr-x
Ósemkowe uprawnienia plików działają, ponieważ każde uprawnienie to potęga dwójki:
- odczyt = 4
- zapis = 2
- wykonanie = 1
Zsumuj bity, które ma dana klasa, a otrzymasz jej cyfrę. rwx to 4 + 2 + 1 = 7. r-x to 4 + 1 = 5. r-- to 4. Zatem rwxr-xr-x odczytuje się, w trójkach, jako 7 5 5. Zrób to samo dla rw-r--r--, a otrzymasz 4 + 2, 4, 4 → 644. To cała sztuczka; w uprawnieniach ósemkowych nie ma nic więcej niż trzy niezależne sumy.
Cyfry uprawnień 0–7 w skrócie
| Cyfra | Binarnie | Uprawnienia |
|---|---|---|
| 0 | 000 | Brak uprawnień |
| 1 | 001 | Tylko wykonanie |
| 2 | 010 | Tylko zapis |
| 3 | 011 | Zapis + wykonanie |
| 4 | 100 | Tylko odczyt |
| 5 | 101 | Odczyt + wykonanie |
| 6 | 110 | Odczyt + zapis |
| 7 | 111 | Odczyt + zapis + wykonanie |
Zapis ósemkowy to po prostu system o podstawie 8, więc każda cyfra pakuje trzy bity bez nachodzenia na następną klasę. Jeśli arytmetyka pozycyjna nieco zardzewiała, konwerter systemów liczbowych pokazuje, jak podstawa 8 odwzorowuje się na system binarny w taki sam sposób jak każda cyfra uprawnień.
chmod 755 vs 644 vs 777: tryby, które naprawdę wpiszesz
Oto porównanie, które wprost odpowiada na pytanie chmod 755 vs 644 vs 777:
| Ósemkowo | Symbolicznie | Właściciel | Grupa | Pozostali | Typowe zastosowanie | Ryzyko |
|---|---|---|---|---|---|---|
| 644 | rw-r--r-- | odczyt/zapis | odczyt | odczyt | Zwykłe pliki | Bezpieczny domyślny |
| 755 | rwxr-xr-x | wszystko | odczyt/wyk. | odczyt/wyk. | Katalogi, skrypty | Bezpieczny domyślny |
| 600 | rw------- | odczyt/zapis | — | — | Pliki prywatne, klucze | Bardzo bezpieczny |
| 700 | rwx------ | wszystko | — | — | Katalogi prywatne | Bardzo bezpieczny |
| 775 | rwxrwxr-x | wszystko | wszystko | odczyt/wyk. | Katalogi grupowe | Grupa może zapisywać |
| 777 | rwxrwxrwx | wszystko | wszystko | wszystko | (unikać) | Zapisywalny dla wszystkich |
Różnica między 755 a 644 to jeden bit: wykonanie. Katalogi, skrypty i pliki binarne potrzebują x, by można było do nich wejść lub je uruchomić, więc lądują na 755. Zwykły plik, taki jak strona HTML, obraz czy plik konfiguracyjny, nie ma powodu być wykonywalnym, więc pozostaje przy 644. Pomylenie tych dwóch stoi za większością codziennych błędów uprawnień.
Dlaczego 777 jest niebezpieczne. Oddaje dostęp do zapisu każdemu kontu na maszynie, w tym przejętemu kontu usługi lub porwanemu procesowi WWW. Katalog główny witryny zapisywalny dla wszystkich to podręcznikowa droga do podmienionej strony lub wstrzykniętego złośliwego oprogramowania, ponieważ każdy, kto do niego dotrze, może nadpisać kod. Kiedy wpis na forum każe ci chmod 777 na czymś „aby zadziałało”, prawdziwy problem to niemal zawsze własność, omówiona poniżej.
Wyjątek 1777. /tmp jest zapisywalny dla wszystkich celowo, ale z zabezpieczeniem. Tryb 1777 dodaje sticky bit, który pozwala każdemu tworzyć pliki, a jednocześnie powstrzymuje użytkowników przed usuwaniem lub zmianą nazwy plików, których nie są właścicielami. Dlatego współdzielone katalogi tymczasowe są bezpieczne przy 1777, ale nigdy przy zwykłym 777. Wpisz 777 w kalkulatorze chmod, a panel ryzyka natychmiast to oznaczy, podczas gdy 1777 zostanie rozpoznany jako standardowy wzorzec katalogu współdzielonego.
Tryb liczbowy a symboliczny
chmod przyjmuje te same bity na dwa sposoby.
Tryb liczbowy (bezwzględny) określa kompletny wynik. chmod 755 file ustawia wszystkie dziewięć bitów na rwxr-xr-x, niezależnie od tego, co było wcześniej. To właśnie sprawdza się w skryptach i wdrożeniach, gdzie wymusza się znany, poprawny stan.
Tryb symboliczny (względny) opisuje zmianę. chmod u+x file przełącza jeden bit (dodaje wykonanie właścicielowi) i nie rusza reszty. chmod u=rwx,go=rx file ustawia całe klasy jawnie. Tryb symboliczny nadaje się do jednorazowych poprawek, gdzie ponowne podawanie całego trybu byłoby przesadą.
# Numeric: overwrite the whole mode
$ chmod 644 report.txt
# Symbolic: change only what you name
$ chmod u+x deploy.sh # add execute for the owner
$ chmod go-w shared.conf # remove write from group and others
$ chmod u=rw,go=r notes.md # set each class explicitly → 644
Jedna pułapka trybu symbolicznego: chmod +x bez podania klasy jest filtrowane przez umask. Przy popularnej umask 022 chmod +x script.sh dodaje wykonanie każdemu, więc odpowiada chmod a+x. Przy surowszej umask, takiej jak 077, dotyczy tylko właściciela. Gdy zależy ci na gwarantowanym wyniku, podaj klasę: u+x dla samego właściciela, a+x dla wszystkich.
Uprawnienia specjalne: setuid, setgid i sticky bit
Poza dziewięcioma standardowymi bitami czwarta, wiodąca cyfra ósemkowa niesie trzy tryby specjalne:
- setuid = 4000 — program działa z uprawnieniami właściciela pliku, a nie wywołującego. Właśnie tak
passwd, którego właścicielem jest root, pozwala zwykłemu użytkownikowi zaktualizować bazę haseł należącą do roota. - setgid = 2000 — ta sama idea dla grupy. Na katalogu sprawia też, że nowe pliki dziedziczą grupę katalogu, dzięki czemu współdzielony projekt pozostaje spójnie przypisany do grupy.
- sticky bit = 1000 — na współdzielonym katalogu ogranicza usuwanie, tak że użytkownicy mogą usuwać tylko własne pliki.
/tmpprzy 1777 to kanoniczny przykład.
$ chmod 4755 /usr/local/bin/mytool # setuid
$ chmod 2775 /srv/shared # setgid on a shared dir
$ chmod 1777 /tmp # sticky bit
$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 59976 Jul 17 10:00 /usr/bin/passwd
Reguła wielkości liter s/S i t/T
W ls -l bity specjalne ponownie wykorzystują pole wykonania, a wielkość litery mówi, czy wykonanie również jest ustawione. Mała s (setuid/setgid) lub t (sticky) oznacza, że bit specjalny oraz wykonanie są włączone, czyli przypadek normalny. Wielka S lub T oznacza, że bit specjalny jest ustawiony, ale wykonanie nie, co zwykle jest błędem, ponieważ bit specjalny na pliku niewykonywalnym nie robi nic pożytecznego.
Porównaj rwsr-xr-x (4755, setuid z wykonaniem, poprawnie) z rwSr--r-- (4644, setuid bez wykonania, podejrzanie). Ilekroć widzisz wielką S lub T, sprawdź, czy ktoś przypadkiem nie usunął bitu wykonania.
Pułapka katalogów GNU, o której nikt nie wspomina
Oto różnica między platformami, którą myli niemal każdy poradnik. W Linuksie (GNU coreutils) liczbowe chmod 755 dir nie czyści istniejącego bitu setuid ani setgid na tym katalogu. Zachowuje go. Jeśli katalog ma już 2755 (setgid), a uruchomisz chmod 755 w oczekiwaniu na czystą kartę, bit setgid pozostaje i katalog nadal ma w rzeczywistości 2755.
Aby naprawdę go wyczyścić, zrób to jawnie:
$ chmod 00755 dir # five-digit form zeroes the special digit
$ chmod =755 dir # = clears every bit not listed
$ chmod u-s,g-s dir # remove setuid and setgid by name
BSD i macOS robią odwrotnie: liczbowe chmod 755 domyślnie czyści bity specjalne. Zatem skrypt wdrożeniowy, który „resetuje” uprawnienia poleceniem chmod -R 755, zachowuje się inaczej na laptopie z systemem Mac niż na serwerze z Linuksem. To zachowywanie jest udokumentowane w podręczniku GNU coreutils; w razie wątpliwości użyj formy pięciocyfrowej lub u-s,g-s, aby wynik był wszędzie identyczny.
umask: co dostają nowo tworzone pliki
Rzadko ustawia się chmod na każdym pliku ręcznie; większość dostaje swój tryb w chwili utworzenia, a decyduje o tym umask. umask to zestaw bitów do wyłączenia. Nowe pliki startują od podstawy 666, a nowe katalogi od 777, i umask maskuje część bitów:
effective mode = base & ~umask
Pliki zaczynają od 666, a nie 777, ponieważ zupełnie nowy plik nie ma powodu, by być domyślnie wykonywalnym. Ten bit dodaje się celowo poleceniem chmod +x.
| umask | Nowe pliki | Nowe katalogi | Znaczenie |
|---|---|---|---|
| 022 | 644 | 755 | Domyślnie — pozostali odczytują, nie zapisują |
| 077 | 600 | 700 | Prywatne dla właściciela |
| 002 | 664 | 775 | Współpraca w grupie |
Przelicz domyślne 022 ręcznie: 666 & ~022 = 666 & 755 = 644, a 777 & ~022 = 755. Sprawdź swoją bieżącą wartość poleceniem umask i ustaw domyślną dla sesji, na przykład umask 077, na maszynie, gdzie nic nie powinno być odczytywalne przez grupę ani wszystkich.
chmod a chown: uprawnienia a własność
chmod i chown odpowiadają na różne pytania. chmod zmienia to, co wolno robić właścicielowi, grupie i pozostałym: bity uprawnień. chown zmienia to, kim właściciel i grupa faktycznie są. Sięganie po 777 to często problem własności przebrany za problem uprawnień.
Klasyczny przypadek: serwer WWW działający jako www-data nie może zapisywać w swoim katalogu przesyłania. chmod 777 usuwa błąd, bo pozwala zapisywać całemu światu, ale zostawia po sobie lukę. Poprawne rozwiązanie przypisuje własność procesowi, który jej potrzebuje:
# Wrong: opens the directory to every account on the box
$ sudo chmod -R 777 /var/www/uploads
# Right: give it to the web user, keep a tight mode
$ sudo chown -R www-data:www-data /var/www/uploads
$ sudo find /var/www/uploads -type d -exec chmod 755 {} +
$ sudo find /var/www/uploads -type f -exec chmod 644 {} +
Kolejność diagnozy, gdy coś nieoczekiwanie nie daje się odczytać: najpierw uruchom ls -l, aby zobaczyć, kto jest właścicielem, w drugim kroku odczytaj tryb, a następnie zdecyduj, czy rozwiązaniem jest chown, chmod, czy dodanie użytkownika do grupy.
Uprawnienia rekurencyjne zrobione dobrze
Hurtowe chmod -R 755 . oznacza każdy zwykły plik jako wykonywalny, co w najlepszym razie jest szumem, a w najgorszym cichym ryzykiem. Zamiast tego rekurencyjnie przetwarzaj według typu:
$ find . -type d -exec chmod 755 {} + # directories → 755
$ find . -type f -exec chmod 644 {} + # files → 644
GNU chmod ma jednowierszowy skrót z wielką X, która dodaje wykonanie tylko katalogom i plikom, które już mają bit wykonania:
$ chmod -R u+rwX,go+rX .
Kalkulator chmod generuje polecenia find obejmujące tylko katalogi i tylko pliki dla dowolnego wybranego trybu, więc możesz skopiować poprawny podział, zamiast sięgać po zwykłe -R.
Najlepsze praktyki uprawnień plików w Linuksie
- Przyznawaj najmniejsze uprawnienia, które działają. Zacznij od najbardziej restrykcyjnego trybu i otwieraj tylko to, co przestaje działać. Każdy dodatkowy bit zapisu to powierzchnia ataku.
- Domyślnie stosuj pliki 644 w katalogach 755. To połączenie sprawdza się niemal w każdym katalogu głównym witryny i pobranym repozytorium. Zwykłe pliki rzadko potrzebują wykonania; katalogi zawsze.
- Nigdy nie zostawiaj 777 na niczym, do czego może dotrzeć serwer. Jeśli kilka kont musi zapisywać, użyj współdzielonej grupy z 775 lub 2775 (setgid utrzymuje spójną własność grupy), zamiast otwierać tryb dla całego świata.
- Trzymaj klucze prywatne SSH na 600 lub 400, gdy są już finalne. OpenSSH wprost odmawia obsługi kluczy prywatnych odczytywalnych przez grupę lub wszystkich. Zobacz podręcznik OpenSSH, by poznać dokładny wymóg dla pliku klucza. Klucze publiczne i
authorized_keysmogą spokojnie mieć 644. - Łącz tryby plików z innymi mechanizmami kontroli. Uprawnienia to podstawa; połącz je z uwierzytelnianiem basic auth z generatora htpasswd, gdy katalog wymaga logowania, i traktuj tryby plików jako jeden element obrazu opisanego w naszym przewodniku bezpieczeństwo aplikacji webowych.
FAQ
Co oznacza d lub l na początku drwxr-xr-x?
Pierwszy znak w wierszu ls -l to typ pliku, a nie uprawnienie. d oznacza katalog, l dowiązanie symboliczne, - zwykły plik, c lub b urządzenie, p nazwany potok, a s gniazdo. Dopiero dziewięć znaków po nim koduje faktyczne bity odczytu, zapisu i wykonania.
Jaka jest różnica między małą s a wielką S w uprawnieniach?
Zarówno mała s, jak i wielka S oznaczają, że bit setuid lub setgid jest ustawiony. Mała s znaczy, że wykonanie jest również ustawione, czyli normalny, działający przypadek. Wielka S znaczy, że bit specjalny jest włączony, ale wykonanie wyłączone (jak w 4644), co niemal zawsze jest błędem konfiguracji, ponieważ bit specjalny nie ma znaczenia bez wykonania.
Czym jest umask i jak decyduje o domyślnych uprawnieniach?
umask to zestaw bitów uprawnień wyłączanych przy tworzeniu pliku. Nowe pliki zaczynają od podstawy 666, a katalogi od 777, następnie effective = base & ~umask usuwa zamaskowane bity. Domyślna 022 daje pliki 644 i katalogi 755; uruchom umask, aby zobaczyć swoją, lub umask 077, aby uzyskać bardziej prywatną wartość domyślną.
Kiedy używać 400 lub 700 zamiast 644 lub 755?
Używaj 400 lub 700, gdy plik lub katalog musi pozostać w pełni prywatny. 400 (r--------) to prywatny plik tylko do odczytu, idealny dla finalnego klucza prywatnego SSH, którego nigdy nie edytujesz. 700 (rwx------) to katalog, do którego może wejść tylko właściciel, jak ~/.ssh czy ~/.gnupg. W przeciwieństwie do 644 i 755 nie przyznają nic nikomu innemu.
Dlaczego mogę wylistować katalog, ale nie wejść do niego przez cd?
Uprawnienia katalogu oddzielają listowanie od przechodzenia: bit r pozwala wylistować nazwy, bit x pozwala wejść. Katalog z r, ale bez x (katalog 644) pokazuje swoje nazwy pod ls, lecz blokuje cd i wszelki dostęp do plików w środku. Dodaj wykonanie (ustaw 755), aby dało się do niego wejść.
Czy uprawnienia plików działają tak samo w macOS jak w Linuksie?
Uprawnienia plików dzielą ten sam podstawowy model rwx i ósemkowy w obu, ponieważ oba trzymają się POSIX, ale szczegóły się różnią. BSD i macOS domyślnie czyszczą setuid/setgid katalogu przy liczbowym chmod, podczas gdy Linux go zachowuje. Odczyt trybu też się różni: stat -c '%a' file w Linuksie, stat -f '%Lp' file w macOS, a macOS dodaje ACL-e i flagi plików.
Czy mogę zmieniać uprawnienia plików bez wiersza poleceń?
Uprawnienia można obliczyć i odczytać bez terminala. Darmowy kalkulator chmod pozwala zaznaczyć macierz uprawnień, wpisać wartość ósemkową lub wkleić wiersz ls -l, a następnie zwraca dokładne polecenie chmod. Zastosowanie go do prawdziwego pliku i tak wymaga tego polecenia na serwerze albo klienta GUI lub FTP, który udostępnia pola uprawnień.