LEKCJA 7 - UPRAWNIENIA W UBUNTU SERVER 24.04

I.Wstęp

Untitled-1

Pierwszy znak w podanym ciągu określa rodzaj obiektu systemowego:

  • - (myślnik) – zwykły plik;
  • d – katalog;
  • l – dowiązanie symboliczne.


Kolejne dziewięć znaków reprezentuje uprawnienia dostępu. Ich znaczenie jest następujące:

  • r (ang. read) – prawo do odczytu zawartości pliku, a w przypadku katalogu prawo do wyświetlenia listy zawartych w nim plików;
  • w (ang. write) – prawo do zapisu (modyfikacji) pliku, a w przypadku katalogu możliwość tworzenia oraz usuwania zawartych w nim obiektów;
  • x (ang. execute) – prawo do wykonania pliku (np. uruchomienia skryptu), a w przypadku katalogu możliwość wejścia do niego (przejścia do katalogu) oraz dostępu do zawartych w nim obiektów;
  • - (myślnik) – oznacza brak danego uprawnienia.


Oprócz zapisu literowego uprawnienia można przedstawiać również w postaci cyfrowej. Na zrzucie ekranu widoczna jest tabela zawierająca wartości przypisane do poszczególnych praw. Aby uzyskać postać liczbową, sumujemy wartości odpowiadające poszczególnym uprawnieniom. Ten temat zostanie szczegółowo omówiony w dalszej części lekcji.


Dziewięć znaków określających uprawnienia jest podzielonych na trzy grupy po trzy znaki, odpowiadające trzem kategoriom podmiotów (w podanej kolejności):

  • właściciel / user (kolor zielony);
  • grupa / group (kolor niebieski);
  • pozostali użytkownicy / others (kolor czerwony).


Przeanalizujmy uprawnienia przedstawione w przykładzie: drwxr-x--x.


Ciąg znaków rozpoczyna się od litery d, co oznacza, że analizowany obiekt jest katalogiem. Następnie widzimy zestaw rwx (kolor zielony), reprezentujący uprawnienia właściciela. Posiada on pełne prawa: do odczytu, zapisu oraz wykonania. Zapiszmy ten zestaw w postaci cyfrowej, sumując wartości poszczególnych praw: 4 + 2 + 1 = 7.


Kolejny zestaw trzech znaków r-x (kolor niebieski) określa uprawnienia grupy. Obecność myślnika w miejscu litery w oznacza brak prawa zapisu – członkowie grupy mogą jedynie odczytywać zawartość katalogu i do niego wchodzić. W zapisie cyfrowym otrzymujemy: 4 + 1 = 5.


Ostatni zestaw znaków --x (kolor czerwony) odnosi się do pozostałych użytkowników (osób nienależących do grupy i niebędących właścicielem). Widzimy, że mają oni wyłącznie prawo do wykonania (wejścia do katalogu). W zapisie cyfrowym odpowiada to wartości: 1.


Cały zestaw uprawnień dla tego katalogu w zapisie numerycznym przyjmuje postać 751.

7-2

Skupmy się teraz na odczytywaniu informacji o właścicielu oraz grupie właścicielskiej. Warto pamiętać, że każdy plik lub katalog w systemie posiada dokładnie jednego właściciela (użytkownika) oraz jedną grupę właścicielską. Na zrzucie ekranu nazwa właściciela została oznaczona kolorem czerwonym, natomiast nazwa grupy – kolorem zielonym. Uprawnienia właściciela określa pierwsze trzy litery w ciągu praw dostępu, a uprawnienia grupy – kolejne trzy.


Przypisanie grupy jako właściciela obiektu oznacza, że każdy członek tej grupy uzyska wcześniej zdefiniowane prawa (w naszym przypadku jest to odczyt i wykonanie). Warto dodać, że w systemie Linux istnieje możliwość zmiany własności pliku lub katalogu tak, aby nie przypadała ona konkretnemu użytkownikowi ani grupie – w tym celu w miejsce właściciela ustawiamy konto nobody, a w miejsce grupy nogroup. Modyfikacja ta będzie wykorzystywana w kolejnych lekcjach.

II. Przygotowanie środowiska

7-1

Pracę rozpoczynamy od utworzenia dwóch użytkowników testowych: uczen1 oraz uczen2. Wykonujemy to za pomocą poleceń:


$ sudo adduser uczen1
$ sudo adduser uczen2
7-2

Następnie tworzymy katalog skrypty w katalogu głównym systemu:


$ sudo mkdir /skrypty


Sprawdzamy zawartość katalogu głównego wraz z przypisanymi uprawnieniami:


$ ls -l /


Widzimy, że właścicielem nowo utworzonego katalogu jest użytkownik root, ponieważ polecenie mkdir zostało wykonane z uprawnieniami administratora (sudo).

III. Uprawnienia

7-3

Zmienimy teraz właściciela oraz grupę właścicielską katalogu skrypty na uczen1. Wykorzystujemy do tego polecenie chown, którego podstawowa składnia wygląda następująco:


chown [opcje] właściciel:grupa plik_lub_katalog


Wykonujemy polecenie:


$ sudo chown uczen1:uczen1 /skrypty/


Sprawdzamy poprawność wprowadzonej zmiany:


$ ls -ld /skrypty/


Widzimy, że nowym właścicielem katalogu stał się użytkownik uczen1.

7-4

Logujemy się na konto użytkownika uczen1 za pomocą polecenia:


$ sudo login uczen1
7-5

Nadal pracując jako użytkownik uczen1, przechodzimy do katalogu /skrypty/, tworzymy w nim plik skrypt1.sh i od razu weryfikujemy przypisane do niego uprawnienia:


$ cd /skrypty/
$ touch skrypt1.sh
$ ls -l skrypt1.sh


W rezultacie otrzymujemy zestaw uprawnień:


-rw-rw-r--


Oznacza to odpowiednio:

  • właściciel – prawo do odczytu i zapisu (rw-);
  • grupa – prawo do odczytu i zapisu (rw-);
  • pozostali użytkownicy – prawo wyłącznie do odczytu (r--).


W zapisie cyfrowym odpowiada to wartości 664.


Przejdziemy teraz do modyfikacji praw dostępu. Do tego celu służy polecenie chmod, którego składnia ma postać:


chmod [opcje] prawa plik_lub_katalog


Prawa dostępu w poleceniu chmod można definiować na dwa sposoby:

1. Sposób liczbowy (numeryczny) – podajemy trzy cyfry wyznaczone według omówionych wcześniej zasad.

2. Sposób symboliczny (literowy) – opiera się na zestawieniu oznaczeń podmiotów, operatorów oraz praw:

  * Oznaczenia podmiotów:

   - u (user) – właściciel;

   - g (group) – grupa;

   - o (others) – pozostali użytkownicy;

   - a (all) – wszyscy (u, g oraz o).

  * Operatory:

   - + – dodanie wskazanego prawa;

   - - – odebranie wskazanego prawa;

   - = – ustawienie dokładnie podanych praw (zastąpienie dotychczasowych).


Przykładowo, aby dodać wszystkim użytkownikom prawo do wykonania pliku, wpisujemy:


$ chmod a+x plik.txt


Natomiast jeśli chcemy ograniczyć prawa grupy wyłącznie do odczytu, stosujemy polecenie:


$ chmod g=r plik.txt
7-6

W ramach ćwiczenia ustawimy uprawnienia do pliku skrypt1.sh w następujący sposób:

  • właściciel – odczyt i zapis (4 + 2 = 6);
  • grupa – odczyt (4);
  • pozostali użytkownicy – brak praw (0).


W sposobie liczbowym polecenie przybierze postać:


$ chmod 640 skrypt1.sh


Natomiast w sposobie symbolicznym zapisujemy je następująco:


$ chmod g-w,o= skrypt1.sh
7-7

W kolejnym ćwiczeniu zdefiniujemy dla tego samego pliku następujący zestaw praw:

  • właściciel – odczyt, zapis i wykonanie (4 + 2 + 1 = 7);
  • grupa – odczyt i wykonanie (4 + 1 = 5);
  • pozostali użytkownicy – zapis (2).


W sposobie liczbowym komenda wygląda następująco:


$ chmod 752 skrypt1.sh


W sposobie symbolicznym wykonujemy to za pomocą polecenia:


$ chmod u=rwx,g=rx,o=w skrypt1.sh
7-8

Przygotujemy teraz uprawnienia pliku skrypt1.sh do dalszych zadań. Ustawiamy je w sposób następujący:

  • właściciel – odczyt i zapis (4 + 2 = 6);
  • grupa – odczyt (4);
  • pozostali użytkownicy – brak praw (0).


W sposobie liczbowym polecenie ma postać:


$ chmod 640 skrypt1.sh


Natomiast w sposobie symbolicznym wpisujemy:


$ chmod u=rw,g=r,o= skrypt1.sh
7-9

Sprawdzimy teraz dostęp do pliku z perspektywy drugiego użytkownika. Przełączamy się na konto uczen2 za pomocą polecenia:


$ su uczen2
7-10

Próbujemy odczytać zawartość pliku skrypt1.sh za pomocą polecenia cat:


$ cat skrypt1.sh


W odpowiedzi otrzymujemy komunikat o braku dostępu (Permission denied). Wynika to z faktu, że dla tego pliku użytkownik uczen2 należy do kategorii "pozostali użytkownicy", która nie posiada żadnych praw dostępu. Przed wykonaniem tej próby upewniamy się, że znajdujemy się w katalogu /skrypty/ (w razie potrzeby przechodzimy do niego za pomocą cd /skrypty/).

IV. Uprawnienia

7-11

Przeanalizujemy teraz sposób działania uprawnień w odniesieniu do katalogów. Prace rozpoczynamy od powrotu na konto użytkownika uczen1:


$ exit


Po opuszczeniu sesji użytkownika uczen2 tworzymy katalog prywatne i sprawdzamy jego uprawnienia:


mkdir prywatne
$ ls -l
7-12

Ustawiamy pełne prawa dostępu wyłącznie dla właściciela katalogu, odbierając wszelkie prawa grupie oraz pozostałym użytkownikom:


$ chmod 700 prywatne/
$ ls -l
7-13

Przechodzimy do katalogu prywatne i tworzymy w nim plik skrypt2.sh:


$ cd prywatne/
$ touch skrypt2.sh
$ ls -l
7-14

Cofamy się do katalogu /skrypty/, a następnie logujemy się na konto użytkownika uczen2:


$ cd ..
$ su uczen2


Próbujemy przejść do katalogu prywatne:


$ cd prywatne/
$ ls -l prywatne/

System wyświetla komunikat o braku uprawnień. Próba wyświetlenia zawartości tego katalogu poleceniem ls również kończy się błędem.

7-15

Przeprowadzimy teraz ćwiczenie praktyczne demonstrujące rolę poszczególnych praw w katalogach. Dla katalogu prywatne ustawimy wyłącznie prawo do odczytu dla właściciela. Wylogowujemy się z konta użytkownika uczen2, przechodzimy do katalogu /skrypty/ (jeśli po wyjściu z sesji pozostaliśmy w katalogu prywatne), zmieniamy uprawnienia i weryfikujemy je:


$ exit
$ cd ..
$ chmod 400 prywatne/
$ ls -l
7-16

Próbujemy wyświetlić zawartość katalogu, a następnie do niego przejść:


$ ls prywatne/
$ cd prywatne/


Możemy zauważyć, że polecenie ls wyświetliło nazwę znajdującego się wewnątrz pliku, lecz nie było w stanie pobrać szczegółowych informacji na jego temat. Próba przejścia do katalogu poleceniem cd zakończyła się błędem.

7-17

Ustawimy teraz dla katalogu wyłącznie prawo do wykonania dla właściciela:


$ chmod 100 prywatne/
$ ls -l
7-18

Ponownie testujemy wykonywanie obu czynności:


$ ls -l prywatne/
$ cd prywatne/
$ ls


Obserwujemy, że polecenie ls nie jest w stanie wylistować zawartości katalogu, jednak tym razem polecenie cd pozwoliło na pomyślne przejście do wnętrza katalogu.

7-19

Przywracamy pełne prawa dostępu dla właściciela oraz brak uprawnień dla pozostałych podmiotów:


$ chmod 700 prywatne/
$ ls -l

V. Zmiana właściciela

7-20

Na liście plików, bezpośrednio za kolumną z prawami dostępu, znajduje się nazwa użytkownika uczen1. Wpis ten wskazuje właściciela obiektu. Zauważamy, że nazwa uczen1 występuje na liście dwukrotnie – drugi wpis oznacza grupę właścicielską. Powtórzenie tej samej nazwy wynika z faktu, że podczas tworzenia nowego użytkownika w systemie Linux automatycznie generowana jest grupa podstawowa o identycznej nazwie.

7-21

Zmienimy teraz właściciela pliku skrypt1.sh na uczen2. Operacja ta wymaga uprawnień administratora, dlatego powracamy do konta z podwyższonymi uprawnieniami, przechodzimy do katalogu /skrypty/ i wykonujemy zmianę:


$ exit
$ cd /skrypty/
$ sudo chown uczen2 skrypt1.sh
$ ls -l


Widzimy, że właścicielem pliku stał się użytkownik uczen2, podczas gdy grupa właścicielska pozostała bez zmian (uczen1).

7-22

Możemy również zmienić jednocześnie właściciela oraz grupę właścicielską, podając nazwę grupy po dwukropku:


$ sudo chown uczen1:uczen1 skrypt1.sh
$ ls -l
7-23

Dotychczas jedynymi grupami dostępnymi w systemie były grupy prywatne utworzone automatycznie wraz z użytkownikami. Utworzymy nową grupę systemową o nazwie uczniowie, a następnie dodamy do niej naszych użytkowników:


$ sudo addgroup uczniowie
$ sudo adduser uczen1 uczniowie
$ sudo adduser uczen2 uczniowie
7-24

Do zmiany samej grupy właścicielskiej (bez modyfikacji właściciela) służy polecenie chgrp. Zmieniamy grupę właścicielską pliku skrypt1.sh na nowo utworzoną grupę uczniowie:


$ sudo chgrp uczniowie skrypt1.sh
7-25

Tworzymy teraz katalog udostępniony dla członków grupy uczniowie. Katalog nazwiemy uczniowie, przypiszemy do niego grupę uczniowie oraz ustawimy właściciela na nobody, tak aby żaden konkretny użytkownik nie był jego właścicielem:


$ sudo mkdir uczniowie
$ sudo chown nobody:uczniowie uczniowie
$ sudo chmod 770 uczniowie
$ ls -l


W komendzie chown kolorem pomarańczowym zaznaczono nazwy właściciela i grupy, natomiast kolor żółty oznacza nazwę tworzonego katalogu. Widzimy, że własność oraz uprawnienia zostały ustawione poprawnie.

7-26

Sprawdzimy praktyczne działanie utworzonego katalogu wspólnego. Logujemy się kolejno na konta uczen1 oraz uczen2 i tworzymy pliki wewnątrz katalogu uczniowie:


$ su uczen1
$ touch uczniowie/plik1.txt
$ exit


$ su uczen2
$ touch uczniowie/plik2.txt
$ exit


Próba bezpośredniego wyświetlenia zawartości katalogu uczniowie z poziomu konta zwykłego administratora zakończy się brakiem dostępu, ponieważ konto to nie należy do grupy uczniowie i nie posiada praw odczytu ani wykonania dla tego katalogu. Aby wyświetlić zawartość, używamy polecenia z uprawnieniami sudo:


$ sudo ls -l uczniowie/

VI. Lepki bit (Sticky bit)

W tej części omówimy działanie specjalnego uprawnienia o nazwie lepki bit (ang. sticky bit). Zabezpiecza on zawartość katalogu przed usunięciem lub zmianą nazwy plików przez użytkowników, którzy nie są ich właścicielami. Lepki bit można ustawić wyłącznie dla katalogów (nadany dla pojedynczego pliku nie wywołuje żadnego skutku). W zapisie numerycznym dodajemy cyfrę 1 przed trzycyfrowym zestawem uprawnień, natomiast w zapisie symbolicznym stosujemy oznaczenie +t.

7-27

Włączamy lepki bit dla katalogu uczniowie, stosując metodę numeryczną:


$ sudo chmod 1770 uczniowie
7-28

Sprawdzimy teraz, czy użytkownik uczen1 będzie w stanie usunąć plik należący do użytkownika uczen2, i odwrotnie:


$ su uczen1
$ rm uczniowie/plik2.txt
$ exit


$ su uczen2
$ rm uczniowie/plik1.txt


W obu przypadkach system wyświetla komunikat o braku uprawnień do usunięcia pliku, który należy do innego użytkownika.

7-29

Upewnimy się, że użytkownik wciąż może usuwać własne pliki. Będąc zalogowanymi jako uczen2, wykonujemy próbę usunięcia pliku plik2.txt:


$ rm uczniowie/plik2.txt
$ ls -l uczniowie/


Operacja kończy się pomyślnie.

7-31

W ostatnim kroku zdejmiemy lepki bit z katalogu uczniowie i ponownie sprawdzimy możliwość usunięcia cudzego pliku:


$ exit
$ sudo chmod -t uczniowie/
$ su uczen2
$ rm uczniowie/plik1.txt
$ ls -l uczniowie/


Po zdjęciu lepkiego bitu użytkownik uczen2 jest w stanie bez przeszkód usunąć plik plik1.txt należący do użytkownika uczen1.