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)
Liczba komentarzy: 10
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>


chattr
jeszcze bym dodał np
Bardzo fajna inicjatywa i bardzo przydatny (i zarazem prosty) “samouczek”. Dzięki!
Nie czytałem wszystkiego, ale zgubiliście na początku literkę “o” i zamiast root, napisane jest toot ; ]
Fajny artykół. Nie ustrzegł się jednak małego błędu:
Może UID?
“nie jawna” chyba “niejawna”.
P.S.
Możnaby jeszcze napisać dokładniej co znaczy “Modyfikowanie zawartości katalogu.” w tabelce.
guzo:
1. slownik ortograficzny sie klania
2. UID a GID to dwie rozne rzeczy - G to skrot od Grupy a nie Usera
sorry, nie doczytalem dokladnie, istotnie masz racje, chodzilo tam o UID
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…
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ę
często powracam do niego, żeby doczytać coś tam
Łatwy do zrozumienia
Pozdrawiam
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ł.
“Pierwsze 3 znaki (kolejno 2,3 i 4 licząc od prawej strony) to uprawnienia użytkownika “.
Chyba od lewej :>