9.2 Prawa dostępu

Prawa dostępu to kolejna ważna kwestia w aspekcie wieloużytkownikowego systemu plików. Dzięki nim można decydować kto może czytać, wykonywać czy pisać do pliku.

Informacja o prawach przechowywana jest jako czterocyfrowa liczba w systemie ósemkowym. Wyróżnione są prawa: właściciela, grupy i reszty użytkowników (każde z nich to jedna cyfra). Czwarta cyfra używana jest do przechowywania informacji specjalnych takich jak set user ID, set group ID, oraz sticky bit. Wartości oktalne przypiane prawom (sa również odpowiedniki literowe wyświetlane przez programy takie jak ls i akceptowane przez chmod) zostały opisane poniżej:

Tabela 9-1. Wartości oktalne praw dostępu

Rodzaj prawa Wartość oktalna Odpowienik literowy
“sticky” bit 1 t
set user ID 4 s
set group ID 2 s
read(odczyt) 4 r
write(zapis) 2 w
execute(wykonywanie) 1 x


Prawa mogą być przypisywane grupom. Na przykład aby nadać prawa “read”(odczytu) i “write”(zapisu) należy użyć cyfry “6” w części praw dotyczącej grupy.

Domyślne prawa bash'a to:

% ls -l /bin/bash
-rwxr-xr-x   1 root     bin  477692 Mar 21 19:57 /bin/bash

Pierwszy myślnik będzie zastąpiony literą “d” gdy do czynienia mamy z katalogiem. Trzy części praw (patrząc od lewej: właściciela, grupy, reszty) wyświetlone są dalej. Jak widać właściciel pliku ma prawa odczytu, zapisu i wykonywania (rwx). Grupa ma tylko prawo odczytu i wykonania (r-x). Reszta użytkowników również ma prawo do odczytu i wykonania.

Jak ustawić prawa dla pliku tak by były one takie jak w przypadku bash'a? Najpierw utwórzmy przykładowy plik:

% touch /tmp/example
% ls -l /tmp/example
-rw-rw-r---  1 david    users    0 Apr 19 11:21 /tmp/example

Następnie użyta zostanie komenda chmod(1) (co znaczy “change mode”) by ustawić do niego prawa. Teraz należy dodać wartości oktalne odpowiadające wymaganym prawom. Dla właściciela będą to: odczyt, zapis i wykonanie co w sumie daje wartość 7. Odczyt i wykonanie zsumuje się do 5. Teraz należy złożyć cyfry razem i przekazać do chmod:

% chmod 755 /tmp/example
% ls -l /tmp/example
-rwxr-xr-x   1 david    users    0 Apr 19 11:21 /tmp/example

Nasuwa się pytanie “Dlaczego poprostu nie utworzyć pliku z wymaganymi prawami?” Odpowiedź jest prosta. bash posiada pewne wbudowane wartości (built-ins) domyślne nazwane umask. Jest tak w przypadku większości powłok Unix'owych. Wartości te kontrolują jakie prawa nadawane będą nowo tworzonym plikom. Inne wartości domyślne bash'a omówione zostały w Sekcja 8.3.1. Używanie umask wymaga pewnej praktyki. Działa podobnie do chmod tyle, że na odwrót. Określa się wartości oktalne, które nie mają być nadawane nowym plikom. Domyślna wartość umask to 0022.

% umask
0022
% umask 0077
% touch tempfile
% ls -l tempfile
-rw--------  1 david    users    0 Apr 19 11:21 tempfile

Przeczytaj strony manuala dla bash'a by uzyskać więcej informacji.

Aby nadać specjalne prawa poleceniem chmod, należy dodać ich wartości oktalne i umieścić je w pierwszej kolumnie. na przykład by nadać set user ID oraz set group ID, użyta zostanie cyfra 6 w pierwszej kolumnie:

% chmod 6755 /tmp/example
% ls -l /tmp/example
-rwsr-sr-x   1 david    users    0 Apr 19 11:21 /tmp/example

Obok wartości ósemkowych podczas używania polecenia chmod można posłużyć się ich odpowiednikami literowymi.

Owner - właściciel u
Group - grupa g
World - reszta o
All of the above - wszystkie z powyższych a

Aby jednak dokonać tego co zrobiliśmy wcześniej należy wpisać kilka linijek poleceń:

% chmod a+rx /tmp/example
% chmod u+w /tmp/example
% chmod ug+s /tmp/example

Niektórzy wolą literki zamiast wartości oktalnych. W każdym razie obie metody są równoważne.

Format z użyciem cyfr ósemkowych jest często szybszy i powszechnie używany w skryptach powłoki. Litery są jednak w niektórych przypadkach bardzo przydatne. Na przykład nie ma łatwego sposobu (w przypadku cyfr) na zmiane określonych praw właścicielowi z zachowoaniem pozostałych w niezmienionej postaci.

% ls -l /tmp/
-rwxr-xr-x   1 alan    users    0 Apr 19 11:21 /tmp/example0
-rwxr-x---   1 alan    users    0 Apr 19 11:21 /tmp/example1
----r-xr-x   1 alan    users    0 Apr 19 11:21 /tmp/example2
% chmod g-rwx /tmp/example?
-rwx---r-x   1 alan    users    0 Apr 19 11:21 /tmp/example0
-rwx------   1 alan    users    0 Apr 19 11:21 /tmp/example1
-------r-x   1 alan    users    0 Apr 19 11:21 /tmp/example2

Wspomnieliśmy wcześniej o specjalnych prawach set user ID i set group ID. Wyjaśnimy co to takiego. W normalnym przypadku gdy uruchamiamy program, wykonuje się on z takimi prawami jakie ma dany użytkownik. To samo odnosi się do grupy. Przy pomocy prawa set user ID mozna zmusić program by zawsze wykonywał się z prawami właściciela (np. “root”'a). Analogicznie jest w przypadku set group ID.

Należy zachować ostrożność z tymi opcjami, gdyż mogą one potencjalnie powodować dziury w zabezpieczeniach. Jeżeli dla programów, których właścicielem jest root zostają nadane powyższe prawa, każdy może wykonywać je jako root. Ponieważ root nie ma ograniczeń w systemie od razu widać jakie skutki może to spowodować. W skócie używanie set user ID oraz set group ID nie jest złe ale trzeba robić to z rozwagą.

Grenlandia 2012