===== Użytkownicy i grupy ===== W uniksopodobnych systemach istnieją użytkownicy i grupy. \\ Użytkownicy identyfikowani są po numerycznych identyfikatorach **uid** (//user identifier//), które są mapowane na nazwy użytkowników. \\ Podobnie grupy mają identyfikatory numeryczne o nazwie **gid** (//group identifier//), które też są mapowane na nazwy grup. Każdy użytkownik jest w jednej podstawowej grupie (nazywanej jego grupą podstawową, //primary group//) i może należeć do dowolnie wielu grup (nazywanych jego grupami dodatkowymi, //supplementary groups//). Lista dostępnych użytkowników i grup oraz powiązania uid/gid z nazwami zwykle są czytane z plików ''/etc/passwd'' i ''/etc/groups'', ale po odpowiedniej konfiguracji może być pobierana też z innych źródeł. \\ Np. można wykorzystać serwer LDAP, czy kontroler domeny AD za pośrednictwem programu ''winbindd''. Więcej informacji na [[https://en.wikipedia.org/wiki/Name_Service_Switch|tutaj]]. \\ Hasła lokalnych użytkowników i grup są przechowywane w ''/etc/shadow'' i ''/etc/gshadow'' W systemie plików zapisane są uidy i gidy (a nie nazwy użytkowników), stąd np. podłączenie dysku z jednego komputera do drugiego przypisze pliki innym nazwom użytkowników i grup jeżeli mapowania uid/gid na nazwy nie są identyczne na obu systemach. \\ To dotyczy również kontenerów (sic!). Dla procesów uniksopodobne systemy przechowują efektywny, zapisany i rzeczywisty uid (analogicznie gid). \\ Dla zwykłych procesów te identyfikatory są równe, dla procesów które zmieniały użytkownika mogą być różne. Więcej informacji na [[https://en.wikipedia.org/wiki/User_identifier|tutaj]]. \\ W tej chwili zakres uid'ów i gid'ów w Linuksie to 0÷(232-2) Użytkownik o uid równym **0** nazywany jest **superużytkownikiem** (//superuser//) i ma zwyczajowo nadaną nazwę **[[https://pl.wikipedia.org/wiki/Root|root]]**. Żeby sprawdzić swoją nazwę użytkownika, można skorzystać z komendy ''**whoami**''. \\ Do sprawdzenia listy grup służy komenda ''**groups** [//użytkownik//]''. Bez argumentów wyświetla grupy bieżącego użytkownika. ~~Zadanie.#~~ Przetestuj działanie komendy ''whoami''. ~~Zadanie.#~~ Sprawdź listę grup w której jesteś. Sprawdź listę grup w której jest użytkownik student. Komenda ''**id** [//użytkownik//]'' wyświetla nazwy i numery użytkownika, jego grupy podstawowej i grup dodatkowych. Informację o użytkowniku można wyciągnąć poleceniem ''getent passwd //użytkownik//'', o grupach – ''getent group //grupa//''. ~~Zadanie.#~~ Sprawdź jaki masz uid i gid, zarówno poleceniem ''id'' jak i ''getent''. Zmiana hasła użytkownika jest wykonywana przy pomocy komendy **''passwd''**. \\ Root może przy pomocy ''passwd //user//'' ustawić hasło każdego użytkownika, może też zmienić czas ważności hasła bądź zablokować konto. Podstawowe komendy administracyjne do zarządzania użytkownikami to: * dodawanie nowego użytkownika: ''useradd [-m] [-g //grupa//] //nazwa//'' * dodawanie nowej grupy: ''groupadd //nazwa//'' * dodanie użytkownika do grupy: ''gpasswd -a //użytkownik// //grupa//'' * zmiana/usunięcie użytkownika/grupy: ''usermod'' / ''userdel'' / ''groupmod'' / ''groupdel'' ===== Użytkownicy w systemie, historia logowania, komunikacja ===== Listę osób bieżąco używających systemu można wyświetlić komendą **''w -n''** oraz ''who''. Historię logowań można wyświetlić używając polecenia ''**last** [-n //ile_ostatnich//] [//username//]''. ~~Zadanie.#~~ Zaloguj się po ssh na polluksa. Sprawdź jacy inni użytkownicy są zalogowani. ~~Zadanie.#~~ Na polluksie sprawdź jacy trzej użytkownicy logowali się ostatnio. ~~Zadanie.#~~ Na polluksie sprawdź kiedy ostatnio logował się użytkownik root. ~~Zadanie.#~~ Sprawdź jacy użytkownicy byli zalogowaniu na polluksie w chwili ''2023-03-03 13:30'' Komendą ''**write** //użytkownik// [//terminal//]'' można wysłać tekst do wybranego użytkownika (kończąc wpisany tekst przez EOF, zwykle //Ctrl+d//). \\ Spowoduje to wyświetlenie mu podanego testu poprzedzonego komunikatem "message from…" w terminalu. \\ Otrzymywanie takich wiadomości można zablokować (bądź odblokować) komendą ''**mesg {n|y}**''. Można też wysłać wiadomość do wszystkich użytkowników komendą ''wall''. ~~Zadanie.#~~ Napisz do sąsiada wiadomość. Zobacz na własnym ekranie wiadomość wysłaną od kogoś. Istnieje też komenda ''[[https://en.wikipedia.org/wiki/Talk_(software)|talk]] //użytkownik//'' pozwalająca na rozmowę między dwoma użytkownikami. ===== Przełączenie się na innego użytkownika ===== Posiadając odpowiednie uprawnienia i/lub znając odpowiednie hasło (w zależności od ustawień systemu) można przełączyć się na innego użytkownika bądź wykonać komendę jako inny użytkownik. Komenda ''**su** [-] [//użytkownik//]'' po autoryzacji uruchamia domyślną powłokę dla podanego użytkownika (domyślnie roota). \\ Komenda ''su -c //komenda// [-] [//użytkownik//]'' po autoryzacji uruchamia w domyślnej powłoce dla podanego użytkownika (domyślnie roota) podaną komendę. \\ ''su'' jest dostępna w każdym uniksopodobnym systemie. W domyślnych ustawieniach Linuksa komenda ''su'' wymaga podania hasła użytkownika docelowego (i w niektórych dystrybucjach przynależności do odpowiedniej grupy, zwykle ''wheel''). Na wielu dystrybucjach instalowana jest też komenda ''sudo'' która ma na celu zezwolenie wybranym użytkownikom na wykonywanie wybranych komend z uprawnieniami wskazanych użytkowników. Do autoryzacji ''sudo'' wykorzystuje hasło bieżącego bądź docelowego użytkownika. W niektórych dystrybucjach komenda ''sudo'' jest nadużywana do zastąpienia komendy ''su''. ~~Zadanie.#~~ Zaloguj się na podany przez prowadzącego serwer przez ssh (prawdopodobnie ''ssh user//N//@fe80::1%br0''). Zmień użytkownika na ''root''. Zmień użytkownika na innego ''user//N//''. Do zmiany (w bieżącej sesji powłoki) grupy podstawowej można użyć komendy ''newgrp'' lub ''sg''. Komenda ''sg'' może też (podobnie jak ''su'') uruchomić wskazane polecenie ze zmienioną grupą podstawową. \\ Komenda ''newgrp'' jest [[https://pubs.opengroup.org/onlinepubs/9699919799/utilities/newgrp.html|w standardzie POSIX]], ale część systemów uniksopodobnych jej nie dostarcza. ''sg'' jest specyficzne dla Linuksa. \\ Po wykonaniu komendy ''newgrp'' / ''sg'' lista grup do których użytkownik należy zostaje bez zmian, więc efektywne prawa dostępu do plików są identyczne niezależnie od bieżącej grupy podstawowej. Zmiana grupy podstawowej ma wpływ m. inn. na to do jakiej grupy należą nowo tworzone pliki i procesy. Root może też korzystać z komend ''runuser'' i ''setpriv'' do uruchamiania komend z innym uid/gid/[[https://linux.die.net/man/7/capabilities|uprawnieniami]]. ===== Uprawnienia dostępu do plików ===== ==== Rodzaje i zapis uprawnień ==== W uniksopodobnych systemach dostęp do pliku określają trzy podstawowe uprawnienia: odczytu (__**r**__ead), zapisu (__**w**__rite) i wykonania (e__**x**__ecute). \\ Każde z tych uprawnień jest przyznawane osobno właścicielowi pliku (__**u**__ser), grupie pliku (__**g**__roup) i pozostałym użytkownikom (__**o**__thers). \\ Dodatkowo można ustawić trzy uprawnienia specjalne: set-user-id (suid, __**s**__), set-group-id (sgid, __**s**__) i sticky (__**t**__). Przy dostępie do pliku, jeżeli plik należy do bieżącego użytkownika, brane są pod uwagę tylko uprawnienia użytkownika.\\ Jeżeli plik nie należy do użytkownika, ale użytkownik należy do grupy pliku, brane są pod uwagę tylko uprawnienia grupy.\\ Jeżeli plik nie należy do użytkownika i użytkownik nie należy do grupy pliku, brane są pod uwagę tylko uprawnienia pozostałych.\\ Zauważ że jeśli plik ma ustawione prawo do odczytu dla grupy ale nie ma prawa odczytu dla użytkownika, to właściciel pliku nie może wyświetlić tego pliku nawet jeśli należy do grupy pliku. Prawo do wykonania dla pliku oznacza możliwość uruchomienia go (jako skrypt, program etc.), dla katalogu – wejścia do niego. Suid/sgid nadany zwykłym plikom oznacza, że po uruchomieniu proces będzie działać z efektywnym uid/gid właściciela pliku. \\ Zauważ że skrypt są interpretowane przez inny program, nie uruchamiane. Nadanie skryptowi suid/sgid nie ma wpływu na jego działanie. \\ Suid pozwala np. zwykłemu użytkownikowi zmienić hasło (czyli zmienić plik /etc/shadow do którego zwykły użytkownik nie ma dostępu). \\ Sgid pozwala np. zwykłemu użytkownikowi uruchamiać maszyny wirtualne w VirtualBoxie czy analizować pakiety sieciowe w Wiresharku. [[https://en.wikipedia.org/wiki/Sticky_bit|Sticky bit]] nadany katalogowi D oznacza, że plik X z katalogu D może usunąć tylko właściciel pliku X bądź katalogu D. \\ Sticky bit ustawiany jest w katalogu ''/tmp'' i innych, gdzie każdy użytkownik może tworzyć pliki o to, by tylko właściciel (bądź root) mogli usunąć pliki. Suid/sgid dla innych plików niż zwykłe i sticky bit dla innych plików niż katalogi nie mają spójnego znaczenia w uniksopodobnych systemach. Przy montowaniu systemu plików można ustawić opcję ''nosuid'' która wyłącza działanie suid/sgid Uprawnienia są przechowywane jako liczba, gdzie wartości kolejnych bitów oznaczają (od najstarszego bitu): prawa specjalne (w kolejności suid, sgid, sticky), i prawa dla użytkownika, grupy, innych (w kolejności odczyt, zapis, wykonanie). \\ Numerycznie uprawnienia zapisuje się w systemie ósemkowym, np: ''4751'' gdzie kolejne cyfry oznaczają uprawnienia specjalne (tutaj: suid), użytkownika (tutaj: wszystkie), grupy (tutaj: odczyt i wykonanie) i innych (tutaj: wykonanie). Tekstowo uprawnienia zapisuje się jako: ''rwxrwxrwx'', gdzie kolejne trójki to właśnie uprawnienia użytkownika, grupy i innych. \\ Brak danego uprawnienia zapisuje się przez **''-''**. \\ Zwykle przed tak zapisanymi uprawnieniami pojawia się dodatkowa litera określająca typ pliku. \\ Uprawnienia specjalne zapisuje się na pozycji uprawnień wykonania: suid i prawo do wykonanie to ''s'', suid i brak prawa do wykonania to ''S'' na pozycji użytkownika. Analogicznie prezentowany jest sgid na pozycji grupy, i sticky bit z literami ''t'' i ''T'' na pozycji pozostałych. \\ Przykładowo: ''rw-r--r--'' oznacza że użytkownik ma prawo zapisu i odczytu, a grupa i pozostali tylko do odczytu (równoważne ''644''), \\ a ''rwx--x--x'' pozwalają właścicielowi na odczyt, zapis i wykonanie pliku, a grupie i pozostałym tylko na wykonanie (''711''). Aby zobaczyć szczegółowe informacje o pliku, w tym uprawnienia, można wykonać ''**stat** //plik//''. \\ Uprawnienia są też wyświetlane w wynikach ''ls -l'' i ''tree -p''. \\ Wszystkie powyższe polecenia dodają na początek uprawnień literę określającą rodzaj pliku. ~~Zadanie.#~~ Sprawdź jakie uprawienia mają (na twoim komputerze): * twój katalog domowy * podkatalog ''.ssh'' w twoim katalogu domowym * plik ''.bash_history'' w twoim katalogu domowym * plik ''/etc/passwd'' i ''/etc/shadow'' * katalog ''/tmp'' * plik ''/usr/bin/passwd'' i ''/usr/bin/write'' ~~Zadanie.#~~ Sprawdź jakie mają uprawnienia i jakim są rodzajem plików: * ''/var/run'' * ''/dev/sda'' lub ''/dev/nvme0n1'' * ''/dev/null'' * ''/run/initctl'' * ''/run/rpcbind.sock'' ==== Zmiana uprawnień, grupy i użytkownika pliku ==== Domyślnie uprawnienia nadawane plikom i katalogom określa maska którą można odczytać poleceniem ''**umask**'' (i zmienić dla bieżącej powłoki poleceniem ''umask //oktalnie//''). Do zmiany uprawnień służy komenda ''**chmod** //uprawnienia// //plik//''. \\ ''chmod'' przyjmuje uprawnienia w postaci ósemkowej, np. ''chmod 644 plik'' lub w postaci symbolicznej. \\ Postać symboliczna to oddzielone przecinkami wyrażenia na które składa się: * litera ''u'', ''g'', ''o'' lub ''a'' (user, group, others lub __**a**__ll - wszyscy) * operacja ''+'', ''-'' lub ''='' (dodaj, usuń lub ustaw te prawa) * uprawnienia ''r'', ''w'', ''x'', ''s'' lub ''t''. Np. ''chown u+x,o= //plik//'' doda użytkownikowi prawo do zapisu i ustawi brak praw dla innych (a prawa grupy zostaną bez zmian). \\ Pominięcie litery ''[ugoa]'' przed operacją ma specjalne znaczenie, szczegóły w podręczniku systemowym. Uprawnienia dostępu może zmieniać tylko właściciel pliku (i root). Właściciel pliku będący w kliku grupach może użyć komendy ''**chgrp** //grupa// //plik//'' do zmiany grupy do której należy plik. Tylko root może zmienić właściciela (i grupę) pliku poleceniem ''**chown** [//właściciel//][:[//grupa//]] //plik//''. Zarówno ''chmod'', ''chgrp'' i ''chown'' przyjmują przełączniki ''-R'' (''--recursive'') dla rekursywnej zmiany i ''--reference=//plik//'' dla ustawienia uprawnień/grupy/właściciela identycznego jak we wskazanym pliku. //Ćwiczenia wykonuj na podanym przez prowadzącego serwerze. \\ Do tworzenia plików możesz wykorzystać np. komendę // ''fortune > //plik//''. ~~Zadanie.#~~ Stwórz plik. Ustaw takie prawa dostępu, żeby tylko właściciel mógł odczytać plik. \\ Sprawdź poprawność nadanych praw przełączając się na innych użytkowników. ~~Zadanie.#~~ Stwórz plik. Ustaw korzystając z ósemkowego zapisu takie prawa dostępu, żeby właściciel mógł zmodyfikować i odczytać plik, a grupa mogła tylko odczytać plik. Sprawdź poprawność nadanych praw. ~~Zadanie.#~~ Stwórz plik. Ustaw korzystając z symbolicznego zapisu takie prawa dostępu, żeby właściciel mógł zmodyfikować i odczytać plik, a grupa mogła tylko odczytać plik. ~~Zadanie.#~~ Zmień grupę pliku z poprzedniego zadania. ~~Zadanie.#~~ Stwórz plik. Ustaw takie prawa dostępu, żeby tylko właściciel i pozostali mogli odczytać plik. Sprawdź czy osoba należąca do grupy pliku może go odczytać. ~~Zadanie.#~~ Stwórz katalog ze zwykłym plikiem w środku. Odbierz prawo do wykonywania katalogu. Spróbuj wylistować katalog, wejść do katalogu i wyświetlić plik bez wchodzenia do katalogu. ~~Zadanie.#~~ Zmień prawa dostępu katalogu na ''u=rwx,go=rx''. Stwórz w tym katalogu zwykły plik. Wyświetl plik jako inny użytkownik. Wyświetl zawartość katalogu jako inny użytkownik. \\ Następnie zmień prawa do katalogu ''u=rwx,go=x''. Spróbuj ponownie wyświetlić plik i zawartość katalogu jako inny użytkownik. ~~Zadanie.#~~ Stwórz katalog z prawami dostępu ''777'' i stwórz w nim dwa pliki. Jednemu z nich ustaw prawa ''600''. Z innego użytkownika spróbuj usunąć oba pliki. ~~Zadanie.#~~ W katalogu użytkownika A z prawami dostępu ''777'' stwórz jako użytkownik B dwa katalogi: jeden pusty, jeden z plikiem w środku. Spróbuj usunąć te katalogi jako użytkownik A. ~~Zadanie.#~~ Czy możesz zmienić nazwę katalogu K który nie dał się usunąć w poprzednim zadaniu? Czy możesz przenieść katalog K do innego? Czy możesz przenieść katalog zawierający K do innego? ~~Zadanie.#~~ Stwórz plik i katalog z plikiem w środku i odbierz wszystkim trzem wszystkie uprawnienia. Zmień użytkownika na root i spróbuj wyświetlić oba pliki. ~~Zadanie.#~~ Z roota zmień właściciela wybranego pliku. Następnie zmień grupę innego pliku na ''www-data''. ===== Data utworzenia, modyfikacji, dostępu ===== Linuksowe system plików zwykle przechowują datę zmiany metadanych (//change//, ctime), zmiany treści (//modify//, mtime) i ostatniego dostępu (//access//, atime) dla każdego pliku. Niektóre systemy plików dodatkowo przechowują też czas utworzenia pliku. \\ Montując system plików często wyłącza się rejestrowanie czasu ostatniego dostępu podając opcję ''noatime'' lub ustawia zmianę tego czasu tylko w szczególnych przypadkach podając opcję ''relatime''. Komenda ''mnt'' i ''findmnt'' wyświetlają z jakimi opcjami zamontowano system plików. Polecenie ''**stat** //plik//'' pokazuje te czasy. Komenda ''**touch** //plik//'' ustawia czas dostępu i modyfikacji pliku, domyślnie na teraz. \\ Podając ''-d //data//'' lub ''--reference=//plik//'' można wybrać inną datę, a ''-a'', ''-c'' i ''-m'' wybierają który czas zmodyfikować. \\ Jeśli plik docelowy nie istnieje, domyślnie komenda ''touch'' go stworzy. Jest to często używane do tworzenia pustych plików. ~~Zadanie.#~~ Sprawdź daty dla pliku ''/var/log/wtmp'' ~~Zadanie.#~~ Zmień daty do swojego katalogu domowego. ~~Zadanie.#~~ Zmień datę zmiany zawartości wybranego pliku na ''13:30 PDT Saturday month ago''. ~~META: language = pl ~~