Prawa dostępu.doc

(76 KB) Pobierz
Prawa dostępu

Prawa dostępu

 

W systemie wielodostępnym potrzebne jest narzędzie, które zapewnić powinno ład i porządek. Narzędziem tym są prawa dostępów do plików i katalogów.
W Linuksie (UNIX-ie) wyróżniamy trzy rodzaje praw dostępu do pliku:

 

·         prawo czytania (r - read)

·         prawo pisania (w - write)

·         prawo wykonywania (x - execute)

 

Powyższe prawa w stosunku każdego pliku (katalogu) są niezależnie nadawane w trzech kategoriach:

 

·         prawa właściciela pliku

·         prawa użytkowników należących do określonej grupy

·         prawa pozostałych użytkowników

 

Każdy plik (katalog) ma swojego właściciela indywidualnego (najczęściej jest to użytkownik, który utworzył plik) oraz właściciela zbiorowego (grupę). Właściciel pliku jest automatycznie członkiem grupy (czasami jest to grupa jednoosobowa). Pozostałym użytkownikom, również mogą być przypisane określone prawa do danego pliku.

Wyjątkowym użytkownikiem jest root, który posiada wszystkie prawa dostępu do każdego pliku. Ponadto może je zawsze zmienić, nawet gdy nie jest właścicielem pliku. W odniesieniu do konkretnego pliku określony użytkownik może posiadać dane prawo dostępu lub też nie. Posiadanie prawa:

 

·         czytania - umożliwia otwieranie pliku i przeglądanie jego zawartości

·         pisania - umożliwia otwieranie pliku i modyfikację jego zawartości

·         wykonywania - umożliwia wykonywanie programu (jeżeli jest to plik binarny) lub skryptu powłoki

Aby usunąć plik, musimy mieć prawo pisania do katalogu, w którym ten plik się znajduje.

Prawa dostępu do pliku

$ pwd

/home/crash1

[crash1@linux crash1]$ ls -F

kat2/  mojplik1  mojplik2

[crash1@linux crash1]$ ls -l

total 3

drwxrwxr-x  2  crash1  crash1   1024  Apr  1  12:10  kat2

-rw-rw-r--  1  crash1  crash1     11  Apr  2  22:10  mojplik1

-rw-rw-r--  1  crash1  crash1      6  Apr  6  22:11  mojplik2

[crash1@linux crash1]$ _

 

Polecenie ls z opcją -l oferuje nam informację o prawach dostępu do pliku. Pierwszy znak wiersza określa typ pliku. I tak "d" oznacza katalog (directory), a znak minus "-" plik zwykły.
Kolejne dziewięć znaków należy odbierać jako trzy trójki znaków. Pierwsza trójka określa prawa dostępu dla właściciela pliku, druga dla grupy (użytkowników), trzecia dla pozostałych użytkowników. Każda trójka określa kolejno trzy prawa: czytania (r - read), pisania (w - write) i wykonywania (x - execute). Minus w miejscu odpowiadającym określonemu prawu oznacza brak tego prawa.

 

·         Użytkownik dysponuje tylko jednym zestawem uprawnień do pliku. Jeżeli jest właścicielem pliku dysponuje tylko i wyłącznie zestawem praw właściciela, mimo, że jest także członkiem grupy i zalicza się także do pozostałych użytkowników. Jeżeli nie jest właścicielem, ale jest członkiem grupy, będzie dysponował tylko zestawem uprawnień grupy, mimo, że zalicza się przecież także do pozostałych użytkowników. Jeżeli nie jest ani właścicielem, ani członkiem grupy, będzie dysponował tylko zestawem praw pozostałych użytkowników.

 

Zgodnie ze zdrowym rozsądkiem, właściciel pliku powinien dysponować najszerszymi prawami do niego i najczęściej tak jest. W ogólności zależy to jednak od zdefiniowania zestawów uprawnień i w szczególnych sytuacjach może się tak zdarzyć, że właściciel będzie maił mniejsze prawa niż grupa, czyli pozostali użytkownicy.
Wróćmy teraz do wiersza z listingu - polecenia ls -l. Następne pola z prawami dostępu to liczba określająca liczbę sztywnych dowiązań do pliku. Kolejne pole to nazwa właściciela pliku. W następnym polu umieszczona jest nazwa grupy. Następnie mamy liczbę określającą długość pliku w bajtach, a za nią pole podające datę (miesiąc, dzień, godzina : minuta) utworzenia lub modyfikacji pliku. Ostatnie pole zawiera nazwę pliku. W naszym przypadku nazwa użytkownika i grupy są takie same. Wynika to z faktu, że nie zajmowaliśmy się porządkowaniem i tworzeniem grup w systemie. Przy zakładanie konta passwd użytkownika crash1 automatycznie została utworzona grupa o tej nazwie. Użytkownik crash1 jest zatem jedynym członkiem grupy crash1.
Reszta oznaczeń typu pliku stosowane w poleceniu ls:

 

-    plik zwykły

d    katalog

b    plik specjalny (blokowy)

c    plik specjalny (znakowy)

`    gniazdo

p    łącze nazwane (FIFO)

l    dowiązanie miękkie (symboliczne)

 

W szczególności polecenie ls -l zastosować możemy do pojedynczego pliku, na przykład pliku specjalnego (blokowego) hdc:

 

$ ls -l  /dev/hdc

brw-rw----  1  root  disk   22,  0  Mar  5  2000   /dev/hdc

[crash1@linux crash1]$ _

 

Widzimy tutaj pewną różnicę w podaniu daty. Pojawiła się dodatkowo liczba "22". Określająca numer programu obsługi.

 

$ cd /home/crash2

bash:   /home/crash2: Permission danied

[crash1@linux crash1]$ ls -l /home

total 2

drwx------  6  crash1  crash1   1024  Apr  1  12:10  crash1

drwx------  5  crash2  crash2     11  Apr  2  22:10  crash2

[crash1@linux crash1]$ _

 

Widzimy, że do katalogu /home/leszek2 wszelkie prawa posiada tylko właściciel crash2. Grupa i pozostali użytkownicy nie posiadają tu żadnych praw.

 

$ su

Password:

[root@linux crash1]# cd /home/crash2

[root@linux crash2]# exit

exit

[crash1@linux crash1]$ _

 

Jak należało się spodziewać, ograniczenia wynikające z praw dostępu nie dotyczą root-a. Można powiedzieć, że do każdego pliku root posiada pełny zestaw (rwx) praw.

Zmieniamy prawa dostępu (zapis oktalny chmod)

Prawa dostępu nie są nadane raz na zawsze. Możemy je zmieniać. Zmiany praw dostępu do pliku (poleceniem chmod) może dokonać jedynie jego właściciel bądź administrator (root). Inną metodą wpływu na dostępność pliku jest zmiana jego właściciela bądź grupy (polecenia chown i chgrp).
 

Zapis praw:
 

rwx--x-wx
 

możemy przedstawić jako: 111001011
 

Jedynka oznacza tutaj istnienie (nadanie) prawa, a zero cofnięcie (brak) prawa. Zapis powyższy jest zapisem pozycyjnym. Możemy mówić tutaj o bitach (pozycjach dwójkowych) określających prawa w poszczególnych trójkach. Pierwszy, najbardziej znaczący bit w trójce określa prawa czytania (r), drugi prawo pisanie (w), a trzeci wykonywania (w).
Liczbę binarną, czyli zapisaną w systemie dwójkowym 111001011 możemy przedstawić w postaci oktalnej (system ósemkowy) jako 713. W tym zapisie pierwsza cyfra oktalna (7) określa prawa właściciela, druga cyfra oktalna (1) prawa grupy, a trzecia (3) dotyczy praw pozostałych użytkowników. Zmiana z postaci binarnej na oktalną (i odwrotnie) polega na niezależnym przyporządkowaniu każdej trójce binarnej cyfry oktalnej:

 

000  =  0   (żadnych praw  ---)

001  =  1   (tylko wykonywanie  --x)

010  =  2   (tylko pisanie  -w-)

011  =  3   (pisanie i wykonywanie  -wx)

100  =  4   (tylko czytanie  r--)

101  =  5   (czytanie i wykonywanie  r-x)

110  =  6   (czytanie i pisanie rw-)

111  =  7   (wszystkie prawa rwx)

 

Przykładowo -x-rwx---, czyli 010111000 binarnie to {010}{111}{000}, czyli 270 oktalnie. Zapis oktalny jest zwięzły, a jednocześnie czytelny, co pozwala szybko ocenić, jakie prawa nadajemy właścicielowi, jakie grupie, a jakie pozostałym użytkownikom.
 

Cały ta notacja dotycząca praw jest w szczególności wykorzystywana przez chmod:

 

$ cd /home/crash1

[crash1@linux crash1]$ ls -l mojplik1

-rw-rw-r--  1  crash1  crash1     11  Apr  1  12:10  mojplik1

[crash1@linux crash1]$ chmod 777 mojplik1

[crash1@linux crash1]$ ls -l mojplik1

-rwxrwxrwx  1  crash1  crash1     11  Apr  1  12:10  mojplik1

[crash1@linux crash1]$ chmod 000 mojplik1

[crash1@linux crash1]$ ls -l mojplik1

----------  1  crash1  crash1     11  Apr  1  12:10  mojplik1

[crash1@linux crash1]$ _

 

W powyższym przykładzie najpierw nadaliśmy plikowi mojplik1 wszystkie możliwe prawa (777) dla wszystkich, a następnie cofnęliśmy (000) wszystkim wszystkie możliwe prawa. Nie dotyczy to oczywiście root-a. Ale dotyczy jak najbardziej właściciela pliku. Właściciel pliku, który odebrał sobie wszystkie prawa do niego dopóki pozostaje właścicielem pliku może je sobie przywrócić.

Zmieniamy prawa dostępu (zapis symboliczny chmod)

Polecenie chmod obsługuje nie tylko oktalny, ale również symboliczny zapis nadawania (cofania) praw.
Zapis symboliczny jest jednak bardziej kłopotliwy i łatwiej w nim o pomyłki. W zapisie oktalnym jednoznacznie określamy, jakie prawa będzie ostatecznie posiadał plik. W zapisie symbolicznym stosujemy mechanizm "plus-minus", co oznacza, że możemy nadawać (+) lub cofać (-) określone z wybranego zestawu prawa. Na podstawie takiego zapisu nic nie możemy powiedzieć o ostatecznych prawach dostępu do pliku, jeżeli nie znamy również ich postaci przed zmianą. Zobaczymy to na przykładzie, nadając, po czym cofając pozostałym użytkownikom prawo pisania i czytania. Następnie nadamy i cofniemy wszystkim wszystkie prawa:

 

$ ls -l mojplik1

-rw-rw-r--  1  crash1  crash1     11  Apr  1  12:10  mojplik1

[crash1@linux crash1]$ chmod o+rw mojplik1

[crash1@linux crash1]$ ls -l mojplik1

-rw-rw-rw-  1  crash1  crash1     11  Apr  1  12:10  mojplik1

[crash1@linux crash1]$ chmod o-rw mojplik1

[crash1@linux crash1]$ ls -l mojplik1

-rw-rw----  1  crash1  crash1     11  Apr  1  12:10  mojplik1

[crash1@linux crash1]$ chmod a+rwx mojplik1

[crash1@linux crash1]$ ls -l mojplik1

-rwxrwxrwx  1  crash1  crash1     11  Apr  1  12:10  mojplik1

[crash1@linux crash1]$ chmod a-rwx mojplik1

[crash1@linux crash1]$ ls -l mojplik1

----------  1  crash1  crash1     11  Apr  1  12:10  mojplik1

[crash1@linux crash1]$ _

 

 

 

Jak łatwo zauważyć litera o (others) w opcji wskazuje, komu nadajemy (cofamy) prawa. W tym przypadku dotyczy to pozostałych użytkowników. Litera a (all) jest domyślna i dotyczy wszystkich naraz. Dla grupy użyjemy g (group), a właściciela u (user).
Przywróćmy teraz plikowi mojplik1 pierwotne prawa dostępu:

 

[crash1@linux crash1]$ chmod u+rw,g+rw,o+r mojplik1

[crash1@linux crash1]$ ls -l mojplik1

-rw-rw-r--  1  crash1  crash1     11  Apr  1  12:10  mojplik1

[crash1@linux crash1]$ _

Tworzymy i usuwamy dowiązania

Dowiązanie to pierwszym przybliżeniu nic innego, jak inna nazwa pliku. W szczególności dowiązanie może pozwolić nam zastąpić długą, pełną ścieżkę dostępu do pliku kilkuliterowym skrótem, na przykład:

 

$ cd /

[crash1@linux /]$ cat mojplik1

cat:  mojplik1:  No such file or directory

[crash1@linux /]$ cat /home/crash1/mojplik1

Cos zapisane w pliku

[crash1@linux /]$ su

Password:

[root@linux /]# ln /home/crash1/mojplik1 skrszt

[root@linux /]# ln -s /home/crash1/mojplik1 skrsym

[root@linux /]# exit

exit

[crash1@linux /]$ cat skrszt

Cos zapisane w pliku

[crash1@linux /]$ cat skrsym

Cos zapisane w pliku

[crash1@linux /]$ ls -l skrszt skrsym  /home/leszek1/mojplik1

-rw-rw-r--  2  crash1  crash1     11  Apr  1  12:10  /home/leszek1/mojplik1

lrwxrwxrwx  1  root    root       22  Apr  1  12:10  skrsym -> /home/leszek1/mojplik1

-rw-rw-r--  2  crash1  crash1     11  Apr  1  12:10  skrszt

[crash1@linux /]$ su

Password:

[root@linux /]$ rm skrszt  skrsym

rm: remove  'skrszt'? y

rm: remove  'skrsym'? y

[root@linux /]$ exit

exit

[crash1@linux /]$ cd ~

[crash1@linux crash1]$ _

 

Do pełnej ścieżki dostępu do pliku mojplik1 utworzyliśmy tu dwa dowiązania: sztywne (ln) i symboliczne (ln -s). Dowiązania utworzył a później usunoł root, ponieważ zwykły użytkownik crash1 (sprawdźmy to: ls -la /) ma tylko prawo czytania i wykonywania do katalogu głównego /, a to za mało. Aby utworzyć (usunąć) plik znajdujący się w danym katalogu, należy mieć do tego katalogu prawo pisania. Natomiast sama modyfikacja zawartości istniejącego już pliku jest możliwa, gdy posiadamy prawo pisania do pliku, ale nie koniecznie od katalogu.
Zwróćmy uwagę czym różni się dowiązanie sztywne od symbolicznego w zakresie praw dostępu i właścicieli. Dowiązanie sztywne zachowuje pełne prawa dostępu i właścicieli oryginału. Dowiązanie symboliczne oferuje pełne prawa wszystkim, a jego właścicielem jest ten co je utworzył.
Dowiązania (łączniki) dzielimy na sztywne (ln) i miękkie, inaczej zwane symbolicznymi (ln -s). Usunięcie dowiązanie dokonujemy poleceniem rm. Różnica pomiędzy dowiązaniem sztywnym a symbolicznym nie sposób wyjaśnić bez wprowadzenia pojęcia i-węzła (ang. inode), będącego strukturą, w której jądro przechowuje informacje o pliku. Każdy plik ma dokładnie jeden unikatowy i-węzeł. Każdą nazwę pliku skojarzoną wprost z i-węzłem nazywamy dowiązaniem sztywnym, często dowiązaniem (ang. link). Zatem każdy plik ma co najmniej jedno sztywne dowiązanie, gdyż musi mieć co najmniej jedną nazwę. Tak naprawdę, nazwa potrzebna jest tylko człowiekowi. System identyfikuje pliki w oparciu o niepowtarzalny (wewnątrz konkretnego systemu plików) numer i-węzła. I-węzeł nie przechowuje nazwy pliku. Do przechowywania nazwy pliku służą katalogi.
Dowiązanie symboliczne to skojarzenie nazwy pliku z nie z jego i-węzłem, lecz z istniejącą już nazwą (ściślej: ścieżka dostępu) pliku.

$ cd /home/leszek1

[crash1@linux crash1]$ ln mojplik1 nowyszt

[crash1@linux crash1]$ ln -s mojplik1 nowysym

[crash1@linux crash1]$ ls -li

total 4

89652 drwxrwxr-x  2  crash1  crash1     1024  Apr  1  12:10  kat2

32847 -rw-rw-r--  2  crash1  crash1       11  Apr  1  10:10  mojplik1

32848 -rw-rw-r--  1  crash1  crash1        6  Apr  1  10:11  mojplik2

32846 lrwxrwxrwx  1  crash1  crash1        8  Apr  1  12:11  nowysym -> mojplik1

32847 -rw-rw-r--  2  crash1  crash1       11  Apr  1  10:10  nowyszt

[crash1@linux crash1]$ _

 

Do pliku mojplik1 utworzyliśmy dwa dowiązania: jedno sztywne (nowyszt) i jedno symboliczne (nowysym). Przy okazji poznaliśmy nową opcję -i polecenia ls, uwidaczniającą numery i-węzłów poszczególnych plików (są to pięciocyfrowe liczby na początku każdego wiersza). Porównajmy wiersz mojplik1 z wierszem nowyszt. Są one identyczne. Zwróćmy uwagę na te same numery i-węzłów i identyczne prawa dostępu. Dla odmiany porównajmy teraz wiersz mojplik1 z nowysym. Różnica jest widoczna. Nowysym posiada inny numer i-węzła oraz inne, pełne prawa dostępu, tylko jedno dowiązanie, inną długość i datę utworzenia lub modyfikacji. Można go traktować jak zupełnie inny plik. O tym, że jest to dowiązanie symboliczne, informuje nas litera "l" umieszczona przed prawami dostępu oraz strzałka wskazująca na mojplik1, czyli obiekt, do którego utworzone jest dowiązanie symboliczne.
Zmienimy teraz nazwę pliku mojplik1 i zobaczymy co się stanie:

 

$ cat mojplik

Cos zapisane w pliku

[crash1@linux crash1]$ cat nowyszt

Cos zapisane w pliku

[crash1@linux crash1]$ cat nowysym

Cos zapisane w pliku

[crash1@linux crash1]$ mv mojplik inny

[crash1@linux crash1]$ ls

inny  kat2  mojplik2  nowysym  nowyszt

[crash1@linux crash1]$ cat inny

Cos zapisane w pliku

[crash1@linux crash1]$ cat nowyszt

Cos zapisane w pliku

[crash1@linux crash1]$ cat nowysym

cat:  nowysym: No such file or directory

[crash1@linux crash1]$ _

 

Efekt był możliwy do przewidzenia. Dowiązanie sztywne związane z "fizycznym" plikiem (i-węzłem) 32847 nie zareagowało na zmianę nazwy mojplik1 na inny. Natomiast dowiązanie symboliczne po zmianie nazwy trafia "w próżnię", gdyż nazwa mojplik1 już nie istnieje. To co tutaj jest wadą dowiązania symbolicznego, w innych sytuacjach okazać się może zaletą:

 

$ cat  mojplik1

pusty

[crash1@linux crash1]$ mv  mojplik2  mojplik1

[crash1@linux crash1]$ cat mojplik1

pusty

[crash1@linux crash1]$ cat nowysym

pusty

[crash1@linux crash1]$ _

 

Nie można mówić o przewadze dowiązania sztywnego nad symbolicznym, raczej o ich cechach, które mogą być wykorzystywane w konkretnych sytuacjach. Na zakończenie przywróćmy sytuację początkową:

 

$ mv mojplik1 mojplik2

[crash1@linux crash1]$ mv inny mojplik1

[crash1@linux crash1]$ rm nowysym nowyszt

[crash1@linux crash1]$ _

Ograniczenia dowiązania sztywnego

Przygotujmy sformatowaną (fdformat) na niskim poziomie dyskietkę i wykonajmy:

 

$ su

...
Zgłoś jeśli naruszono regulamin