Atrybuty plików w systemie Linux

Z openSUSE wiki

Niekompletny.png Ten artykuł jest niekompletny i wymaga rozbudowy. Szczegóły można znaleźć na stronie dyskusji.

W systemie Linux pliki posiadają swoje atrybuty, które określają cechy każdego pliku, takie jak nazwa, data modyfikacji, przynależność do właściciela, uprawnienia do korzystania z pliku itd. Taka organizacja danych pozwala na bezkonfliktowe użytkowanie systemu przez wielu użytkowników. Nawet jeśli z komputera, na którym zainstalowany jest nasz ulubiony SUSE, korzysta tylko jedna osoba, to i tak używa ona przynajmniej dwóch kont - zwykłego użytkownika oraz konta root. W przypadku, gdy system używany jest przez wiele osób zachodzi jeszcze większa potrzeba przestrzegania poufności danych, tak aby każdy użytkownik mógł chronić swoje pliki przed działaniem innych użytkowników. Dlatego w Linuksie oprócz elementarnych atrybutów jak nazwa czy data utworzenia pliku, wymagane jest także określenie uprawnień jakie względem danego pliku posiada jego właściciel oraz inni użytkownicy systemu.

Spis treści

Rodzaje obiektów

Linux traktuje wszystkie obiekty jak pliki, rozróżniając jedynie ich typy. I tak mamy w systemie zwykłe pliki, takie jak pliki tekstowe, binarne, czy graficzne, katalogi, które przechowują inne katalogi lub pliki, urządzenia blokowe, urządzenia znakowe, linki i potoki. Różnica między np. plikiem a katalogiem jest dla nas oczywista, ale Linux, choć oczywiście je rozpoznaje, nadaje im taki sam zestaw atrybutów.

Podglądanie i rozpoznawanie atrybutów

Aby dowiedzieć się jakie atrybuty posiada dany plik, użyjemy standardowych komend Linuksa. Po uruchomieniu termiala znajdujemy się w naszym katalogu domowym /home/uzytkownik o czym świadczy tylda "~" w znaku zachęty. Po wydaniu polecenia ls pojawi się zawartość bieżącego katalogu:

miszon@linux:~> ls
Desktop  download  plugins  media
bin  Documents  public_html
miszon@linux:~>

Nie za wiele tu widać, w dodatku niezbyt to wszystko zgrabnie uporządkowane. Polecenie ls wyświetiło nam zawartość katalogu domowego pokazując nam jedynie nazwę znajdujących się w nim obiektów a także w pewien sposób ich typ. Kolor niebieski świadczy, że mamy do czynienia z katalogami. Zawartość katalogów domowych oczywiście zależy od użytkowników, ale tuż po instalacji znajdziemy tam jedynie kilka katalogów. Spróbujmy przejść do bardziej ciekawego katalogu.

miszon@linux:~> cd /etc
miszon@linux:/etc>ls -l
...
-rw-------  1 root root        54 sty 27 23:16 grub.conf
-rw-r--r--  1 root root       842 lis 25 13:28 gssapi_mech.conf
drwxr-xr-x  3 root root        72 sty 18 16:56 hal
-rw-r--r--  1 root root       370 lis 26 00:05 host.conf
...
miszon@linux:/etc>

Polecenie cd /etc przeniosło nas do katalogu /etc. W katalogu tym można znaleźć wszelkie pliki konfiguracyjne. Jeżeli będziemy w przyszłości konfigurować pracę naszego systemu prawdopodobnie najczęściej będziemy odsyłani do tego właśnie katalogu. Polecenie ls -l szczegółowo wylistowało nam zawartość tego katalogu (powyższy przykład to tylko fragment, ale wystarczający).


Wskazówka.png Wskazówka: Dla wygody można użyć polecenia ll zamiast ls -l. Efekt jest ten sam, należy jednak pamiętać, że nie jest to autonomiczne polecenie, a jedynie alias przypisany do polecenia ls -l. Alias ten jest dostarczony przez openSUSE "fabrycznie", jednak inne dystrybucje mogą się różnić pod tym względem.

To co się ukazało już na pierwszy rzut oka jest bardziej uporządkowane, a ponadto otrzymaliśmy szczegółowe informacje na temat każdego obiektu znajduącego się w tym katalogu. Informacje te są uporządkowane w 7 polach. Weźmy pod lupę jeden z przykładowych plików z katalogu /etc

-rw-r--r-- 1 root root 370 lis 26 00:05 host.conf

Pierwsze pole, -rw-r--r-- , to typ oraz uprawnienia do pliku (dokładny opis poniżej), drugie pole, 1, to liczba dowiązań, trzecie, root, określa właściciela pliku, czwarte, również root, określa grupę do której należy właściciel pliku, piąte, 370, to rozmiar pliku, szóste, lis 26 00:05, czas ostatniej modyfikacji i ostatnie siódme pole to nazwa pliku (lub innego obiektu) host.conf. Z tego całego zestawu na pewno najbardziej enigmatycznie wygląda pierwsze pole - typ i uprawnienia do pliku. Na to pole składa się 10 znaków, z czego każdy ma swoje znaczenie.

- r w - r - - r - -
1 2 3 4 5 6 7 8 9 10

Pierwszy znak identyfikuje typ obiektu w tym przypadku jest to zwykły plik (znak "-"). Występują następujące wartości:

 - - plik zwykły
 d - katalog
 b - urządzenie blokowe (np. dysk)
 c - urządzenie znakowe
 l - dowiązanie symboliczne
 p - potok

Kolejne 9 znaków identyfikują uprawnienia do pliku jakie ma właściciel pliku (znaki 2-4), grupa, do której właściciel należy (znaki 5-7) i pozostali użytkownicy systemu (znaki 8-10). Zwykły plik, do którego wszyscy będą mieli wszystkie uprawnienia wygląda tak:

-rwxrwxrwx

Litera "r" oznacza prawo do odczytu pliku, litera "w" prawo do modyfikacji pliku a litera "x" do wykonania pliku. W tym przypadku zarówno właściciel, grupa jak i pozostali użytkownicy mają pełen zestaw uprawnień, stąd trzy razy powtórzone znaki "rwx". Jeżeli danego uprawnienia nie ma w miejsce litery pojawia się znak "-". Wróćmy do naszego poprzedniego przykładu

-rw-r--r-- 1 root root 370 lis 26 00:05 host.conf

Zinterpretować należy, że plik host.conf jest zwykłym plikiem (znak "-" na początku), że właściciel (root) ma prawo do odczytu i modyfikacji pliku, ale nie ma prawa do wykonania go (zapis "rw-"). Grupa do której należy właściciel pliku oraz pozostali użytkwnicy systemu mają prawo odczytu pliku, ale nie mogą go modyfikować ani wykonywać (zapis "r--").

Właścicielem pliku jest jego twórca, więc jeśli użytkownik stworzy jakiś plik, automatycznie staje się jego właścicielem. Użytkownik root może również zmienić właściciela pliku. Właścicielem większości plików w systemie poza katalogiem /home jest użytkownik root, jako że system podczas instalacji uznaje użytkownika root za swojego "właściciela". W przypadku zwykłego pliku prawo "r" umożliwia wyświetlanie zawartości pliku, prawo "w" dale możliwość zmiany zawartości, a prawo "x" wykonania. Prawo to należy nadawać skryptom lub programom, które mają zostać wykonane przez system. W przypadku katalogu prawo "r" umożliwia przeglądanie zawartości katalogu (np. za pomocą znanego już polecenia ls), prawo "w" daje możliwość modyfikacji zawartości katalogu (tworzenia, modyfikowania i usuwania innych katalogów i plików), natomiast prawo "x" umożliwia wejście do katalogu.


Oprócz literowego zapisu praw istnieje jeszcze metoda "oktalna". Polega ona na tym, że prawa przedstawione są za pomocą liczb:

1 = tylko wykonanie             (--x)
2 = tylko zapis                 (-w-)
3 = zapis i wykonanie           (-wx)
4 = tylko odczyt                (r--)
5 = odczyt i wykonanie          (r-x)
6 = odczyt i zapis              (rw-)
7 = zapis, odczyt i wykonanie   (rwx)

Uprawnienia specjalne

Ogólny schemat:

|s|g|t|              |r|w|x|r|w|x|r|w|x|


s - bit SUID 

Ustawienie go powoduje, że dostęp do pliku może mieć tylko jeden użytkownik.

g - bit SGID

Ustawienie dla katalogu, powoduje, że pliki tworzone w tym katalogu będą należały do tej samej grupy, do której należy katalog, a nie do grupy do której należy właściciel pliku.

t - bit sticky 

Ustawienie go powoduje, że program po wykonaniu nie jest usuwany z pamieci.


Programy lsattr oraz chattr

Pokażmy to na przykładzie. Wyświetlmy listę plików w przykładowym folderze Nessus-4.0.2:

cheops:/home/kris/bin/Nessus-4.0.2 # lsattr
-------------e- ./nessus.tar.gz
-------------e- ./install.sh

Gdy wyświetlimy folder w sposób normalny nic nam się nie pokazuje:

cheops:/home/kris/bin/Nessus-4.0.2 # ls -ltr
total 8028
-rw-r--r-- 1 kris users 8215914 Sep 15  2009 nessus.tar.gz
-rwxr-xr-x 1 kris users    1119 Sep 15  2009 install.sh

Spróbujmy dodać jakiś atrybut dodatkowy:

cheops:/home/kris/bin/Nessus-4.0.2 # chattr +i install.sh

Powtórnie wyświetlamy:

cheops:/home/kris/bin/Nessus-4.0.2 # lsattr
-------------e- ./nessus.tar.gz
----i--------e- ./install.sh


Od tego momentu nawet root nie będzie miał możliwości usunięcia oraz edycji tego pliku.


cheops:/home/kris/bin/Nessus-4.0.2 # rm install.sh
rm: cannot remove `install.sh': Operation not permitted

Przykład wykorzystania programu chattr

Tak więc progam chattr możemy wykorzystać, np. jeśli nie chcemy by jakiś plik został nadpisany przez inny,

cheops:/home/kris/ # chattr +i /etc/resolv.conf