Konsola nie gryzie – prawa dostępu 11


W systemach sieciowych (czyli takich, do których dostęp ma wiele różnych osób), definiowanie uprawnień dostępu do danych jest bardzo ważne. Bezpośrednio wpływa ono na bezpieczeństwo systemu oraz na prywatność danych użytkowników — system GNU/Linux nie stanowi w tej materii żadnego wyjątku.

Przy pierwszym kontakcie całe to zagadnienie wydaje się być niezwykle obszerne, zwłaszcza jeśli spojrzymy na nie z punktu widzenia użytkownika konsoli. Jednak po zapoznaniu się z odrobiną teorii kwestie praw dostępu stają się zdecydowanie prostsze.

Oczywiście, graficzne menedżery plików również umożliwiają odczyt oraz ewentualne modyfikacje uprawnień do plików. Obsługa tego typu aplikacji nie wymaga jednak od użytkownika głębszej znajomości tematyki, stąd też w tym artykule skupimy się na konsolowych „podstawach” zagadnienia praw dostępu.

Użytkownicy i grupy

Najlepiej chyba zacząć od tych dwóch pojęć — zwłaszcza, że ich zdefiniowanie raczej nie przysporzy nikomu większych problemów. Użytkownik to osoba korzystająca z komputera — ktoś, kto posiada swoje prywatne konto w systemie oraz własne pliki, na których pracuje. Pisząc zupełnie prosto — użytkownikiem jest każdy, kto korzysta z komputera.
Grupa to pewien zbiór użytkowników, których łączy jakaś wspólna cecha (np. dostęp do Internetu, do drukarki, czy dostępu do plików).

Wszystko jest plikiem — w myśl tej idei uważamy m.in. katalogi za pliki. Pliki (w potocznym znaczeniu tego słowa) nazywamy plikami zwyczajnymi.

Prawa dostępu — teoria

Uprawnienia do plików możemy zdefiniować osobno dla właściciela pliku (z ang. user), grupy do której plik należy (group) oraz pozostałych użytkowników (others). Uprawnienia, które możemy nadawać to: prawo odczytu, zapisu oraz wykonania.

Tutaj jedna uwaga — o ile w przypadku większości plików prawa dostępu działają całkowicie zgodnie ze swoimi nazwami, o tyle w przypadku katalogów jest trochę inaczej. Prawo do odczytu oznacza możliwość wyświetlenia zawartości folderu na ekranie, zapis oznacza tworzenie i modyfikowanie plików, natomiast prawo wykonania to nic innego jak możliwość wejścia do danego katalogu.

Sprawdzanie uprawnień

Skoro już wiemy, jak w teorii wyglądają prawa dostępu, możemy obejrzeć, w jaki sposób są przypisywane plikom w praktyce. Najszybciej będzie posłużyć się komendą ls — potrafi ona wyświetlić zawartość danego folderu. Parametr -l włączy tryb szczegółowy, wyświetlający więcej informacji o plikach. Zatem komenda:

ls -l
może zwrócić na przykład coś takiego:

-rw-r--r-- 1 krzysztof users  256 2008-12-16  dysk.sh
drwxr-xr-x 3 krzysztof users 4096 03-17 17:36 Obrazy

Powyższy wynik możemy podzielić na siedem kolumn rozdzielonych spacjami – opiszemy je zaczynając od końca. Ostatnia to nazwa pliku, szósta — data ostatniej modyfikacji, piąta — rozmiar interesującego nas obiektu. Kolumna trzecia i czwarta zawierają nazwę właściciela pliku oraz grupy, do której on należy. W drugiej kolumnie podawana jest ilość odwołań do pliku — a żeby być bardziej precyzyjnym, liczba dowiązań twardych.

Dla zwykłego pliku ilość dowiązań twardych wynosi po prostu 1. W przypadku katalogów musimy wiedzieć, że oprócz samego folderu odnosi się do niego także wirtualny katalog o nazwie . (ten symbol oznacza po prostu katalog bieżący), umiejscowiony w jego wnętrzu. To oznacza, że dla zwyczajnego katalogu liczba dowiązań twardych wynosi przynajmniej 2. „Przynajmniej” – ponieważ każdy podkatalog to kolejne dowiązanie, powiększające wartość pokazywaną przez polecenie ls.

Nas z perspektywy praw dostępu najbardziej interesuje jednak chińszczyzna dziesięciu znaków pierwszej kolumny. Najłatwiej będzie rozbić ten ciąg na mniejsze cząstki:

  • pierwszy znak — oznacza typ pliku, do najważniejszych należą:
    • — zwykły plik
    • d — katalog
    • l — dowiązanie symboliczne
  • kolejne trzy bloki (po trzy znaki w każdym) oznaczają kolejno uprawnienia dla: właściciela, grupy oraz pozostałych użytkowników — jeśli dane uprawnienie występuje jest oznaczone odpowiednią literą, ich brak przedstawiony jest znakiem
    • read — uprawnienia odczytu
    • write — uprawnienia zapisu
    • execute — uprawnienia wykonania

Jak łatwo można ustalić, w przypadku przykładowego skryptu dysk.sh, uprawnienia do odczytu i zapisu ma właściciel pliku, wszyscy inni użytkownicy mogą go natomiast odczytać. W przypadku katalogu Obrazy pełne prawa ma właściciel, pozostali użytkownicy mogą jedynie obejrzeć jego zawartość i wejść do niego.

Zmiana uprawnień

Ponieważ potrafimy już sprawdzić prawa dostępu dla danego pliku, czas zająć się ich modyfikowaniem. Używamy do tego komendy chmod, a całe polecenie tworzymy podając:

  • symbol oznaczający osoby, których mają dotyczyć zmiany
    • u — właściciel pliku
    • g — grupa pliku
    • o — pozostali użytkownicy
    • a — wszyscy użytkownicy, alternatywny zapis: ugo
  • znak definiujący zmianę uprawnień
    • + — nadanie uprawnień
    • — usunięcie uprawnień
    • = — ustawienie jedynie praw podanych, pozostałe są usuwane
  • uprawnienia, które będą zmienione
    • r — prawo odczytu
    • w — prawo zapisu
    • x — prawo wykonania

Na końcu polecenia znaleźć się musi lista plików, których zmiany dotyczą.

Przyklad 1. Przykład zastosowanie komendy chmod
chmod u=rwx,go=rx ~

Czasem potrzebujemy zmienić prawa dla katalogu wraz z całą jego zawartością — warto wtedy posłużyć się parametrem -R, który wprowadza zmiany rekursywnie. Jak już wcześniej pisaliśmy prawo wykonania działa zupełnie inaczej dla katalogów i plików zwyczajnych. W tych pierwszych jest on jak najbardziej pożądany, z kolei dla tych drugich znacznie rzadziej (uruchamiamy tylko pliki binarne oraz skrypty, muzyki czy zdjęć już nie). Wyobraźmy sobie sytuację kiedy chcielibyśmy udostępnić katalog wraz z jego zawartością grupie po minimalnych uprawnieniach. g=rx nie zda w takiej sytuacji egzaminu — każdy plik otrzyma prawa uruchomienia dla grupy, do której należy. Rozwiązaniem jest zastosowanie g=rX – wielkie X. Takie polecenie nada uprawnienia execute jedynie dla katalogów, pomijając pliki.

Po takiej porcji teorii czas na kilka przykładów:

Przykład 2.
chmod ug=rw .bashrc
Komenda nadaje właścicielowi i jego grupie prawa odczytu i zapisu do pliku .bashrc, pozbawiając równocześnie innych użytkowników jakichkolwiek praw.

Przykład 3.
chmod go= -R /boot
Tutaj z kolei odebraliśmy użytkownikowi i jego grupie wszelkie prawa do folderu /boot oraz jego zawartości.

Przykład 4.
chmod g-w,o+r .bashrc
W tym przykładzie grupa właściciela .bashrc straciła prawo zapisu tego pliku, natomiast pozostali użytkownicy zyskali możliwość odczytu tego pliku.

Chmod — składnia absolutna (numeryczna)

Oprócz przedstawionej powyżej formy zapisu uprawnień, polecenie chmod rozpoznaje także składnię numeryczną. Najbardziej popularny przykład to nieszczęsne chmod -R 777 /, przy pomocy którego początkujący użytkownicy próbują nadać sobie uprawnienia administratora.

Najogólniej rzecz ujmując, trzy kolejne cyfry oznaczają prawa dla właściciela, grupy oraz pozostałych użytkowników, a ich wartość to cyfrowe oznaczenie odpowiadające poszczególnym prawom. Nasz przykładowy plik dysk.sh miał uprawnienia:

rw-r--r--

Żeby było prościej, rozbijmy to na trzy części odpowiadające uprawnieniom właściciela, grupy i pozostałych użytkowników:

rw-   r--   r--

Wystarczy teraz wiedzieć, że do uprawnienia wykonywalności przypisana jest liczba 1, do kolejnych uprawnień (a więc po kolei — zapisu i odczytu) przypisana jest liczba dwukrotnie wyższa od poprzedniej, czyli:

  • odczyt – 4
  • zapis – 2
  • uruchomienie – 1

Jeśli równocześnie pojawia się więcej niż jedno prawo dostępu (np. odczyt i zapis, jak w tym przykładzie), wartości liczbowe po prostu sumujemy. Tak więc w przypadku opisywanego tu do bólu pliku dysk.sh, uprawnienia w postaci absolutnej to 644.

W przypadku zastosowania takiej metody zapisu, poleceniu z Przykładu 2. równoważny będzie Przykład 5.

Przykład 5.
chmod 600 .bashrc

Prawa specjalne

Wiemy już, jak nadawać prawa odczytu, zapisu i wykonania dla plików czy folderów. Linux oferuje nam jednak coś więcej – możliwość nadawania uprawnień specjalnych. Do tej kategorii należą:

  • SetUID — ustaw identyfikator użytkownika — jeśli takie prawo zostało zdefiniowane dla pliku wykonalnego, uruchomiony w ten sposób proces będzie miał takie uprawnienia jak właściciel programu,
  • SetGID — ustaw identyfikator grupy — analogicznie do wcześniejszego prawa, tutaj plik wykonalny zostanie uruchomiony z uprawnieniami grupy, która jest jego właścicielem,
  • sticky bit — bit zaczepienia — używany dla zabezpieczenia zawartości katalogu w sytuacji, w której uprawnienia zapisu ma większa grupa użytkowników. Jeśli zdefiniujemy dla folderu takie prawo, zawartość tego katalogu będzie mógł modyfikować bądź usuwać tylko i wyłącznie jego właściciel.

W klasycznym zapisie informującym o prawach dostępu, prawa specjalne pojawiają się zawsze w miejscu normalnie definiującym uprawnienia dotyczące wykonywania danego pliku. SetUID zajmie miejsce w informacji o prawach wykonania dla właściciela, SetGID – grupy, sticky bit – innych użytkowników. Ponieważ prawa specjalne „zajęły” nam miejsce, w którym znajdowała się informacja o prawie wykonania (lub jego braku), o tej kwestii dowiemy się odpowiednio dzięki małej lub wielkiej literze odpowiadającej za prawo specjalne. I tak, poniższy zapis:

-rws--------- 1 krzysztof users  256 2008-12-16  dysk.sh

…oznacza, że dla pliku dysk.sh SetUID jest aktywny (odpowiada za to literka „s” w wyniku), a właściciel ma pełne prawa do pliku — prawo odczytu, zapisu oraz wykonania (o tym ostatnim informuje nas mała litera s).
Sytuacja w kolejnym wpisie będzie wyglądać nieco inaczej:

drwxrwxrwT 1 krzysztof users  256 2008-12-16  Obrazy

Jeśli chodzi o właściciela i jego grupę, wszystko jest jasne — posiadają pełne prawa. Dla innych użytkowników dostęp do zawartości folderu ogranicza sticky bit (tak, to ta litera „T”) i nie mają oni prawa wykonania (wejścia do katalogu), o czym informuje wielka litera definiująca sticky bit.

Skoro już wiemy, jak sprawdzić ustawienia praw specjalnych, pora nauczyć się je modyfikować. Podobnie jak w przypadku zwykłych praw, możemy użyć składni zwykłej:
Przykład 6.
chmod u+s system.sh
…aktywuje SetUID dla skryptu system.sh. Analogicznie:
Przykład 7.
chmod g+s system.sh
…oznacza nadanie SetGID.

Prawa specjalne można definiować także przy pomocy postaci absolutnej. W takiej sytuacji „zwyczajowe” trzy cyfry należy poprzedzić jeszcze jedną, będącą sumą uprawnień specjalnych: dla SetUID będzie to 4, dla UserUID — 2, natomiast dla sticky bit — 1. O „sumie” uprawnień specjalnych piszemy tylko dla porządku – w praktyce używa się ich pojedynczo. Jednoczesne stosowanie SetUID i SetGID dla jakiegoś pliku wykonalnego nie ma sensu, a sticky bit jest wykorzystywany w przypadku katalogów.
Zostawiając na boku te teoretyczne dywagacje – przykładowa komenda, która nadaje plikowi „skrypt” SetUID, pełne uprawnienia dla właściciela i prawo wykonania dla grupy oraz pozostałych użytkowników, wyglądać będzie tak:
Przykład 8.
chmod 4711 skrypt
Prawa specjalne nie są może często wykorzystywane, jednak niektóre pliki systemowe wykorzystują ich możliwości. Przykładem dotyczącym każdej instalacji Ubuntu może być chociażby wynik poniższego polecenia:
Przykład 9.
ls -l /usr/bin/passwd

-rwsr-xr-x 1 root root 37140 2010-04-20 13:14 /usr/bin/passwd

Zmiana właściciela i grupy pliku

Zmiany właściciela pliku może dokonać tylko użytkownik z uprawnieniami administratora (a więc root, względnie normalny użytkownik mogący korzystać z sudo). Właściciel pliku może co najwyżej zmienić grupę, do której plik należy — o ile sam jest członkiem nowej grupy, której chce przypisać dany plik.
Przeprowadzenie takiego zabiegu dla pliku „test” pokazują poniższe przykłady:
Przykład 10a.
chown użytkownik:grupa test
Przykład 10b.
chown użytkownik test
Przykład 10c.
chown :grupa test

W przykładzie 10a. zmodyfikowaliśmy zarówno właściciela jak i grupę, do której należy plik test. W kolejnych dwóch przykładach skupiliśmy się na zmianie tylko jednej informacji (albo właściciela pliku — przykład 10b., albo też grupy do której dany obiekt należy — przykład 10c.). W takiej sytuacji w składni polecenia pomijamy po prostu zapis „użytkownik” względnie „:grupa”. Jeśli interesuje nas jedynie zmiana grupy do której należy plik, możemy skorzystać z trochę innego polecenia:
Przykład 11.
chgrp grupa test

Jak łatwo się domyślić — ta komenda służy wyłącznie do zmiany grupy, do której należy dany obiekt. Przykład 11. jest zatem równoważny poleceniu z przykładu 10c.

Jeżeli chcemy użyć któregoś z powyższych poleceń dla folderu wraz z jego zawartością, stosujemy parametr -R, dokładnie tak samo jak w przypadku komendy chmod

Definiowanie domyślnych uprawnień dla plików

Każdy nowo utworzony plik czy katalog posiada z góry zdefiniowane wartości właściciela oraz grupy, a także uprawnienia. W przypadku dwóch pierwszych kwestii sprawa jest prosta — właścicielem zostaje użytkownik, który stworzył plik lub katalog, natomiast grupą — domyślna grupa właściciela. Jeśli chodzi o prawa dostępu przypisane automatycznie świeżo tworzonym plikom, definiuje je maska uprawnień. Aktualną wartość maski uzyskamy poleceniem
umask

0022

Jak to odczytać? Na chwilę zapomnijmy o pierwszej cyfrze (odpowiada ona za nieczęsto wykorzystywane prawa specjalne, a w przypadku niektórych dystrybucji Linuksa w ogóle nie jest wyświetlana) i zajmijmy się resztą wyniku. Są to uprawnienia postaci absolutnej, które należy odjąć od pełnych uprawnień katalogu (777) oraz pliku (666 – wykonanie w przypadku plików jest zdecydowanie rzadziej wykorzystywane). Świeżo utworzone katalogi będą miały zatem pełne uprawnienia dla jego właściciela oraz uprawnienia odczytu (wylistowania zawartości) oraz wejścia do folderu dla pozostałych użytkowników.
Wróćmy na chwilę do pominiętego powyżej pierwszego znaku w czterocyfrowym wyniku umask. Wiemy już, że odpowiada on za prawa specjalne — tyle że trudno wyobrazić sobie sytuację, w której ktoś chciałby uaktywnić któreś z tych praw dla wszystkich nowych plików tworzonych w systemie. Aby nie zagłębiać się w teoretyczne dywagacje „do czego można tego użyć…?” zapamiętajmy jedynie, że wartość „0” oznacza tutaj brak zdefiniowanych praw specjalnych.

Jeśli komuś postać absolutna i odejmowanie uprawnień sprawia problemy – nie ma sprawy! Możemy wyświetlić umask w zdecydowanie przyjemniejszej dla oka postaci:
umask -S

u=rwx,g=rx,o=rx

Skoro wiemy jak wyświetlać wartość umask, pora zabrać się za jej modyfikowanie, które okazuje się być niezwykle intuicyjne. Wystarczy, że jako argument polecenia podamy nową wartość maski — i gotowe.
Aby nadać pełne uprawnienia nowo tworzonych plików dla właściciela, zaś dla reszty uprawnienia zerowe użyjemy polecenia:
Przykład 12a.
umask 0077
Możemy oczywiście użyć formy „standardowej”:
Przykład 12b.
umask -S u=rwx,g=,o=

Wydanie powyższych poleceń jest jednak jednorazowe — po wylogowaniu i ponownym zalogowaniu umask wróci do domyślnych ustawień. Zaradzić temu możemy, dodając stosowny wpis (np. umask 0077) do pliku konfiguracyjnego powłoki. Dla wykorzystywanego przez znakomitą większość użytkowników Ubuntu Basha ten plik to ~/.bashrc.

I to już koniec kolejnego artykułu o czarnym ekranie, białych znaczkach i tym, co można przy ich pomocy osiągnąć…


Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.

11 komentarzy do “Konsola nie gryzie – prawa dostępu