Uprawnienia w Linuksie

28 listopada 2007, adz

W drugiej części serii “Wszystko o konsoli” pisaliśmy już o tym jak uzyskać pomoc korzystając z manuali oraz o procesach w Linuksie. Teraz pora zrozumieć jak w tym systemie działają uprawnienia do plików. W artykule dowiecie się o podstawach zarządzania prawami dostępu, jak używać jakich komend jak chmod czy chown oraz co tak naprawdę znaczą te tajemnicze numerki jak 700 czy 644 pojawiające się w wielu tutorialach.

1. Podstawy

Unix od samego początku był systemem umożliwiającym pracę wielu użytkownikom naraz (tzw. wieloużytkownikowość). Cecha ta wymagała implementacji odpowiednich mechanizmów bezpieczeństwa w celu ochrony danych, jak i samego systemu operacyjnego przed niepowołanym dostępem. Standardowo użyty jest model DAC (ang. Discretionary Access Control - swobodna kontrola dostępu). W DAC użytkownik decyduje zabezpieczeniach i prawach dostępu do pliku. Wraz z rozwojem systemów operacyjnych model ten z czasem stał się nie wystarczający co wymusiło opracowanie taki modeli jak min. MAC (ang. Mandatory Access Control - model obowiązkowej kontroli dostępu), ACL (ang. Access Control List - listy kontroli dostępu) i ich praktycznych implementacji takich jak np. SELinux, TrustedBSD, Trusted Solaris.

2. Właściciel pliku

Z reguły właścicielem pliku jest użytkownik, który go utworzył. W systemach unix-like pliki mają dwóch właścicieli: użytkownika (ang. user) i grupę (ang. group). Właściciele nie muszą stanowić pary, właściciel użytkownik nie musi być członkiem grupy, która posiada plik. Zazwyczaj jednak grupą posiadającą plik jest grupa do której należy użytkownik. Jeżeli jakiś użytkownik nie jest właścicielem ani członkiem grupy posiadającej dany plik jest traktowany jako “reszta świata” (ang. others). Każdy użytkownik posiada przypisany do jego nazwy numer UID (ang. user identification number) po którym jest rozpoznawany przez system. Root posiada numer 0, natomiast ostatni numer z puli, 65534 (w Ubuntu) 32767 (w NetBSD), przypisany jest użytkownikowi nobody. Tak więc o przyznanie uprawnień nie będzie zależne od nazwy a od odpowiedniego UID’a, np. w niektórych systemach (np. NetBSD) utworzone jest konto toor’a posiadające UID równy 0 czyli drugie konto superużytkownika. Każda grupa posiada swój unikalny GID (ang. group identification number - numer identyfikacyjny grupy) jest to odpowiedniku numeru GID. Do wyświetlania właścicieli pliku używa się opisanego wcześniej polecenia ls z parametrem -l.

$ ls -l
razem 1822
drwxr-xr-x  3 adam adam    120 2007-09-03 16:00 Desktop
-rw-r–r–  1 adam adam    400 2007-08-22 18:49 prog_09.py

Trzecia i czwarta kolumna to odpowiednio użytkownik i grupa posiadająca plik.

2.1. chgrp

Jest to polecenie umożliwiające zmianę grupy posiadacza pliku. Jeżeli jest uruchamiane przez zwykłego użytkownika musi on być posiadaczem pliku oraz członkiem grupy której chce nadać prawo własności, co ciekawe nie musi być członkiem grupy aktualnie posiadającej plik. Składania polecenia jest następująca: chgrp nowa-grupa pliki, może być podana nazwa grupy lub też jej identyfikator GID.

$ ls -l
-rw-r–r–  1 adam root      0 2007-09-03 15:33 plik.txt
$ chgrp users plik.txt
$ ls -l
-rw-r–r–  1 adam users      0 2007-09-03 15:33 plik.txt

Polecenie te posiada parametr -R umożliwiający rekurencyjną zmianę grupy dla wszystkich plików i podkatalogów, działa on tak samo jak jego odpowiednik z innych, opisanych już wcześniej poleceń (rm, ls).

2.2. chown

To polecenie używane jest do zmiany właściciela i grupy posiadającej plik. W większości systemów może wykonywać je tylko root. Polecenie ma składnię: chown nowy_użytkownik:nowa_grupa pliki. Podobnie jak w poleceniu chgrp można podać nazwę użytkownika, grupy, lub też ich liczbowe identyfikatory, polecenie nie sprawdza czy podane numery są poprawne tak więc można UID i GID nieistniejących użytkowników i grup.

$ ls -l
-rw-r–r–  1 adam users      0 2007-09-03 15:33 plik.txt
root@laptop:# chown root:root plik.txt
adam@laptop:~$ ls -l
-rw-r–r–  1 root root      0 2007-09-03 15:33 plik.txt

Zmienia grupę oraz właściciela pliku.

$root@laptop:# chown zoidberg plik.txt

Zmieni właściciela pliku, na użytkownika zoidberg, grupa pozostanie bez zmiany.

$ chown :futurama plik.txt

Zmieni grupę, na grupę futurama, właściciel pozostanie niezmieniony. Chown umożliwia rekurencyjną zmianę właściciela za pomocą parametru -R.

3. Prawa dostępu

W każdym uniksie dostępne są trzy rodzaje praw dostępu: odczyt (ang. read) oznaczany w skrócie r, zapis (ang. write) oznaczany w i wykonanie (ang. execute) oznaczane x.

Prawo dostępu Plik Katalog
r Odczyt zawartości pliku. Wyświetlenie zawartości katalogu, np. poleceniem ls.
w Możliwość zapisu do pliku. Modyfikowanie zawartości katalogu.
x Prawo do wykonania pliku. Możliwość przejścia do katalogu poleceniem cd.

Analizując prawa dostępu do katalogów należy pamiętać, że są one plikami zawierającymi nazwy umieszczonych w nich plików oraz informacje o ich lokalizacji na dysku. Aby wyświetlić zawartość katalogu poleceniem ls (bez parametrów) wystarczy posiadanie uprawnienia tylko do odczytu, jednak uruchomienie ls -l wymagać będzie już posiadanie uprawnień do odczytu i wykonania ponieważ wykonywana jest w trakcie jego pracy nie jawna zmiana katalogów. Generalnie każde działanie na katalogu poza zwykłym wypisaniem jego zawartości wymagać będzie posiadania uprawnienia do wykonania. Posiadanie uprawnienia do wykonania katalogu umożliwi dostęp do jego zawartości, poprzez nazwy plików.

$drw-r–r–  2 adam adam      96 2007-09-05 18:04 blob
drwxr-xr-x  2 adam adam     176 2007-09-04 15:57 tapety
-rw-r–r–  1 adam adam     125 2007-08-29 18:31 fme.py

Prawa dostępu można wyświetlić za pomocą polecenia ls z parametrem -l, pierwsza kolumna przedstawia typ pliku (pierwszy znak) oraz uprawnienia (pozostałe 9 znaków). Pierwsze 3 znaki (kolejno 2,3 i 4 licząc od prawej strony) to uprawnienia użytkownika, określane w skrócie u od user, kolejne 3 (czyli 5,6,7) to uprawnienia grupy oznaczane g od group, ostatnie trzy to uprawnienia tzw. “reszty świata”, oznaczane o od others.

Tak więc w powyższym przykładzie blob jest katalogiem, jego właściciel ma prawo do odczytu i zapisu, natomiast nie posiada prawa do wykonania (rw-), grupa posiada prawo tylko do odczytu (r), reszta świata posiada prawo tylko do odczytu (r). Tapety też jest katalogiem, którego właściciel ma pełnie praw dostępu (rwx), grupa prawo do odczytu i wykonania (r-x), reszta do odczytu i wykonania (r-x).

3.1. chmod

Jest to polecenie zmieniające prawa dostępu do plików, składnię ma następującą:

$chmod prawa dostępu pliki

Aby skonstruować polecenia należy wybrać klasę użytkowników, którym chcemy zmienić uprawnienia (ugo), dostępna jest dodatkowa klasa a (ang. all - wszyscy) łącząca wszystkie trzy klasy. Następnie wybrać jeden z trzech operatorów: + przydziela prawo, - odbiera prawo, = przypisuje podane prawo. A na koniec podać rodzaj prawa dostępu (rwx).

$ chmod u+x skrypt.sh

Użytkownik otrzyma prawo do wykonania pliku skrytp.sh.

$ chmod go-r raport.odt

Grupa i pozostali użytkownicy stracą prawo do odczytu pliku raport.odt.

$ chmod a=w finanse.ods

Wszystkie klasy użytkowników otrzymają prawo do zapisu pliku finanse.ods, jeżeli któraś z klas posiadała prawo do odczytu i wykonania, zostanie ono odebrane.

$ chmod u+rwx,g+rwx,o+x trurl.py

Użytkownik i grupa otrzymają pełnię praw dostępu, natomiast reszta jedynie prawo do wykonania pliku trurl.py.

3.2. Numeryczne tryby dostępu

Aby uprościć zapis polecenia chmod opracowane zostały numeryczne prawa dostępu. Poszczególnym trybom przypisane zostały określone wartości liczbowe. Wykorzystując zapis binarny, jeżeli dana klasa posiada określone prawo dostępu, stawiana jest 1 jeżeli nie ma stawiane jest 0. Tryb dostępu rwx r-x r-x binarnie zapisany zostanie 111 101 101. Zapis dwójkowy jest jednak niewygodny dlatego przelicza się go na wartości w systemie ósemkowym, zamieniając wartości dla poszczególnych klas. Tak więc w powyższy przykład ósemkowo zapisze się 755, ponieważ 111 to 7 ósemkowo, a 101 to 5. Ta metoda jest dość uciążliwa nawet dla użytkownika posiadającego wprawę w operowaniu różnymi systemami liczbowymi, jest jednak prostszy sposób. Wystarczy wiedzieć, że uprawnienie tylko do odczytu (r–) to 4, tyko do zapisu (-w-) to 2 a uprawnienie do tylko do wykonania to (–x) 1. Teraz zapisując uprawnienia liczbowo wystarczy podać sumę uprawnień dla danej klasy.

Zapis symboliczny Zapis liczbowy - ósemkowo
–x 1
-w- 2
-wx 3
r– 4
r-x 5
rw- 6
rwx 7

Tak więc zapis:

$ chmod u=rwx,g=rwx,o=x trurl.py

Równoważny będzie z:

$ chmod 771 trurl.py

3.3. Specjalne tryby dostępu

Opracowane zostało kilka trybów rozszerzających standardowe możliwości.

3.3.1. X

Przyznaje on wskazanym klasom prawo do wykonania pliku tylko wtedy gdy prawo to zostało przyznane innym klasom dostępu.

$ ls -l
-rwx——  1 adam users        14 2007-09-10 21:48 skrypt.sh
drwx——  1 adam users        14 2007-09-10 21:48 tapety
-rw——-  1 root users      3665 2007-09-17 17:23 wynik.txt
$ chmod go+X *
$ ls -l
-rwxr-xr-x  1 adam users        14 2007-09-10 21:48 skrypt.sh
drwxr-xr-x  1 adam users        14 2007-09-10 21:48 tapety
-rw-r–r–  1 adam users      3665 2007-09-17 17:23 wynik.txt

Bez opcji X plik wynik.txt otrzymałby prawo do wykonania.

3.3.2. Bit lepki (ang. sticky bit)

Ustawione dla pliku wykonywalnego, te prawo dostępu, powoduje przechowywanie w pamięci operacyjnej pliku wykonywalnego po zakończeniu działania programu, opcja obecnie rzadko stosowana, zaprojektowana by zmniejszyć koszty uruchamiania popularnych programów. Ustawione dla katalogu, umożliwia kasowanie elementów w nim się znajdujących tylko poprzez właściciela katalogu, właściciela pliku który się w nim znajduje lub roota.

$drwxrwxrwt  10 root root   464 2007-09-20 12:45 tmp

Bit lepki często stosowany jest dla katalogu /tmp, który zgodnie z przyjętą konwencją, powinien być dostępny dla wszystkich, jednak użytkownicy nie mogą mieć prawa do usuwania plików których właścicielami nie są.

Sticky bit dla katalogu ustawia się za pomocą polecenia chmod:

$ chmod u+t test/
# ls -l
drwxrwxrwt  2 adam users        48 2007-09-20 15:28 test

Lub też wykorzystując zapis numeryczny:

$ chmod 1000 test/

3.3.3. setuid

Setuid dla plików wykonywalnych powoduje uruchomienie danego programu, na prawach właściciela pliku a nie użytkownika, który go uruchamia. Niektóre polecenia administracyjne jak np. sudo mogą wymagać ustawienia tego trybu dla poprawnego działania.

$ ls -l /usr/bin/ | grep sudo
-rwsr-xr-x 1 root   root      91508 2006-10-09 13:37 sudo

Tryb setuid ustawia się za pomocą polecenia chmod, wykorzystując zapis symboliczny lub też wartość liczbową.

$ chmod u+s program
# chmod 4000 program

3.3.4. setgid

Tryb setgid działa identycznie jak setuid z tą różnicą program uruchamiany jest na prawach grupy posiadacza pliku, w przypadku katalogów grupą posiadającą nowo utworzony plik będzie nie grupa użytkownika tworzącego a grupa posiadająca dany katalog. Do ustawienia trybu setgid stosuje się polecenie chmod.

$ chmod g+s test/
# chmod 2000 test/
# ls -l
drwxrwsrwt  2 adam adam        48 2007-09-20 15:28 test

3.4. umask

Polecenie umask służy do określania domyślnego trybu dostępu dla wszystkich nowo utworzonych plików. Jego parametrem są, przedstawione numerycznie, prawa dostępu które nie zostaną przyznane. Tryb dostępu określa się wykonując binarną operację:

domyślna wartość AND NOT(wartość umask)

Upraszczając: od domyślnego trybu wyrażonego ósemkowo (domyślenie 666), wystarczy odjąć wartość umask.

$ umask
0022
$ touch plik
$ ls -l
-rw-r–r–  2 adam adam        48 2007-09-20 15:28 plik
umask 0111
$ ls -l
-rw-rw-rw-  1 adam adam         0 2007-09-20 17:31 plik2

Ten artykuł jest częścią serii “Wszystko o konsoli” tworzonej na wiki projekt jakilinux.org przez społeczność związaną z wortalem pod przewodnictwem Adama Zielińskiego. Jeśli chciałbyś napisać kolejną część artykułu, po prostu napisz do Adama albo stwórz zalążek artykułu na wiki!

Komentarze (RSS) | Trackback (URI)

Komentarze są prywatnymi opiniami dodających je osób. Prosimy o zachowanie kultury wypowiedzi. Komentarze obraźliwe oraz obniżające poziom serwisu będą usuwane. Więcej w regulaminie komentowania.

Liczba komentarzy: 10

zwiń wątek CKU  28 listopada 2007 o godz. 11:46 # Zwiększ karmę Zmniejsz karmę Cofnij swój głos Zgłoś komentarz do usunięcia KARMA: +4 [Pokaż komentarz]

chattr
jeszcze bym dodał np

 
zwiń wątek neonique  28 listopada 2007 o godz. 12:30 # Zwiększ karmę Zmniejsz karmę Cofnij swój głos Zgłoś komentarz do usunięcia KARMA: +1 [Pokaż komentarz]

Bardzo fajna inicjatywa i bardzo przydatny (i zarazem prosty) “samouczek”. Dzięki!

 
zwiń wątek lukas  28 listopada 2007 o godz. 13:21 # Zwiększ karmę Zmniejsz karmę Cofnij swój głos Zgłoś komentarz do usunięcia KARMA: -1 [Pokaż komentarz]

Nie czytałem wszystkiego, ale zgubiliście na początku literkę “o” i zamiast root, napisane jest toot ; ]

 
zwiń wątek guzo  28 listopada 2007 o godz. 20:03 # Zwiększ karmę Zmniejsz karmę Cofnij swój głos Zgłoś komentarz do usunięcia KARMA: 0 [Pokaż komentarz]

Fajny artykół. Nie ustrzegł się jednak małego błędu:

Każda grupa posiada swój unikalny GID (ang. group identification number - numer identyfikacyjny grupy) jest to odpowiedniku numeru GID

Może UID?
“nie jawna” chyba “niejawna”.
P.S.
Możnaby jeszcze napisać dokładniej co znaczy “Modyfikowanie zawartości katalogu.” w tabelce.

 
zwiń wątek sys  30 listopada 2007 o godz. 0:08 # Zwiększ karmę Zmniejsz karmę Cofnij swój głos Zgłoś komentarz do usunięcia KARMA: 0 [Pokaż komentarz]

guzo:
1. slownik ortograficzny sie klania
2. UID a GID to dwie rozne rzeczy - G to skrot od Grupy a nie Usera

zwiń wątek sys  30 listopada 2007 o godz. 0:14 # Zwiększ karmę Zmniejsz karmę Cofnij swój głos Zgłoś komentarz do usunięcia KARMA: 0 [Pokaż komentarz]

sorry, nie doczytalem dokladnie, istotnie masz racje, chodzilo tam o UID :)

zwiń wątek guzo  30 listopada 2007 o godz. 17:00 # Zwiększ karmę Zmniejsz karmę Cofnij swój głos Zgłoś komentarz do usunięcia KARMA: 0 [Pokaż komentarz]

sys “UID a GID to dwie różne rzeczy” - właśnie o to chodziło:). Błąd celowy. Czasem lubię walnąć jakiegoś “kalafiora” i patrzeć czy ktoś się zorientuje. Tym razem była to pierwsza osoba, ale czasem nie orientuje się nikt…

(Poniżej tego poziomu komentarze nie będą zagnieżdżane)
 
 
 
zwiń wątek Leonar  29 grudnia 2007 o godz. 9:25 # Zwiększ karmę Zmniejsz karmę Cofnij swój głos Zgłoś komentarz do usunięcia KARMA: 0 [Pokaż komentarz]

Witam, dziękuje za taki “samouczek”. Właśnie dok. tego mi brakowało przez cały czas jak używam linuksa. Odkąd jestem teraz więcej przez ssh nie mogłem zmieniać(bo nie umiałem) praw , a teraz to umię :)
Łatwy do zrozumienia :) często powracam do niego, żeby doczytać coś tam

Pozdrawiam

 
zwiń wątek Adam  7 marca 2008 o godz. 7:34 # Zwiększ karmę Zmniejsz karmę Cofnij swój głos Zgłoś komentarz do usunięcia KARMA: 0 [Pokaż komentarz]

Przydałoby się jeszcze opisać działanie ustawienia suida i sgida dla katalogów. Bit lepkości w tym przypadku został opisany, natomiast o suidzie i sgidzie autora zapomniał.

 
zwiń wątek x10d  10 października 2008 o godz. 21:23 # Zwiększ karmę Zmniejsz karmę Cofnij swój głos Zgłoś komentarz do usunięcia KARMA: 0 [Pokaż komentarz]

“Pierwsze 3 znaki (kolejno 2,3 i 4 licząc od prawej strony) to uprawnienia użytkownika “.
Chyba od lewej :>

 
Identyfikator (wymagane)
Adres e-mail (wymagany - nie pokażemy go publicznie)
Adres URI
Rozmiar pola: zmniejsz rozmiar | zwiększ rozmiar
Uwaga! Niektóre komentarze, m.in. te dodane przez niezalogowanych i nowych użytkowników, są ręcznie moderowane. Jeśli Twój komentarz nie ukaże się od razu, nie dodawaj go ponownie, tylko cierpliwie poczekaj na akceptację.

Literówki najlepiej zgłaszać jabberem: michuk@jakilinux.org lub kocio@jabber.org!

W komentarzach możesz używać prostych znaczników HTML. Przykłady:
  • Link: <a href="jaklinux.org">Linux dla każdego</a>,
  • Wytłuszczenie: <strong>tekst pogrubiony</strong>,
  • Kursywa: <em>tekst pochylony</em>,
  • Przekreślenie: <strike>tekst przekreślony</strike>,
  • Kod: <code>printf("blok kodu");</code>,
  • Cytat: <blockquote>cytat</blockquote>
Uwaga: jeśli dodasz nieznany znacznik, będzie on niewidoczny, gdyż system filtruje takie znaczniki.