Skip to content
Powrót do bloga
Bezpieczeństwo

Uprawnienia plików w Linuksie: chmod 755, 644 i 777

Zrozum uprawnienia plików w Linuksie: jak działają chmod, ósemkowo (755, 644, 777) i rwx, plus setuid i umask, z darmowym kalkulatorem chmod.

11 min czytania

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

ÓsemkowoSymbolicznieTypowe zastosowanie
400r--------Klucz prywatny SSH, tylko do odczytu
600rw-------Pliki prywatne, klucze SSH, .env
644rw-r--r--Strony WWW, konfiguracja, większość plików
700rwx------Katalogi prywatne (~/.ssh)
755rwxr-xr-xSkrypty, pliki binarne, katalogi WWW
775rwxrwxr-xKatalogi współdzielone przez grupę
777rwxrwxrwxWszyscy, wszystko — unikać
1777rwxrwxrwtWspół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

CyfraBinarnieUprawnienia
0000Brak uprawnień
1001Tylko wykonanie
2010Tylko zapis
3011Zapis + wykonanie
4100Tylko odczyt
5101Odczyt + wykonanie
6110Odczyt + zapis
7111Odczyt + 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:

ÓsemkowoSymbolicznieWłaścicielGrupaPozostaliTypowe zastosowanieRyzyko
644rw-r--r--odczyt/zapisodczytodczytZwykłe plikiBezpieczny domyślny
755rwxr-xr-xwszystkoodczyt/wyk.odczyt/wyk.Katalogi, skryptyBezpieczny domyślny
600rw-------odczyt/zapisPliki prywatne, kluczeBardzo bezpieczny
700rwx------wszystkoKatalogi prywatneBardzo bezpieczny
775rwxrwxr-xwszystkowszystkoodczyt/wyk.Katalogi grupoweGrupa może zapisywać
777rwxrwxrwxwszystkowszystkowszystko(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. /tmp przy 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.

umaskNowe plikiNowe katalogiZnaczenie
022644755Domyślnie — pozostali odczytują, nie zapisują
077600700Prywatne dla właściciela
002664775Współ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_keys mogą 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ń.

Tagi: linux chmod file-permissions permissions security

Powiązane artykuły

Zobacz wszystkie artykuły