Linux – konto użytkownika, grupa
To, że z danego komputera może korzystać wiele osób nie jest żadną tajemnicą i stwierdzeniem tym nikogo nie zaskoczę. Oznacza to nie mniej, ni więcej, że dane urządzenie może służyć wielu osobom. Lecz aby takie rozwiązanie zdało egzamin (i nikt nikomu sobie nie przeszkadzał) należało opracować mechanizm ochrony zapisanych plików różnych użytkowników czy uruchomionych procesów tak by dany użytkownik nie skasował danych nie należących do niego czy nie przerwał zadań uruchomionych przez innego użytkownika. Tak więc w tym wpisie przedstawię zagadnienia związane z użytkownikiem tj. kontem użytkownika, hasłami czy przynależnością do danej grupy.
Pliki /etc/shadow oraz /etc/passwd
Na początku przyjrzymy się zawartości dwóch plików: /etc/shadow oraz /etc/passwd Czemu akurat te pliki? Ponieważ przechowują one informacje o kontach użytkowników systemu a opisywane narzędzia do nich będą się odwoływać.
Plik /etc/passwd jest plikiem tekstowym w którym przechowywana jest informacja na temat konta użytkownika. Zawartość tego pliku przedstawia się następująco.
Uważny Czytelnik na pewno zauważy, że każdy wiersz w pliku /etc/passwd reprezentuje jednego użytkownika a ten bardziej dociekliwy, że w wierszu tym znajduje się siedem pól oddzielonych od siebie dwukropkami (:). Każde z pól przechowuje konkretną informację o użytkowniku. Definicja pól obejmuje:
- nazwa użytkownika,
- hasło użytkownika – hasło w systemie Linux nie jest zapisywane w sposób jawny a jego lokalizacja to plik /etc/shadow Znak x widoczny w drugim polu pliku /etc/passwd oznacza, że hasła należy szukać we wspomnianym pliku. Przeglądając plik /etc/passwd możemy natknąć się również na znak * oznaczający niemożność zalogowania się do systemu zaś puste pole (dwa dwukropki obok siebie) oznacza brak zdefiniowanego hasła (logowanie bez hasła).
- identyfikator użytkownika (ang. user ID – czyli UID) – numer użytkownika w systemie. Możliwe jest, aby numer UID w systemie został powielony, ale może być to źródłem błędów, dlatego przyjmuje się niepowtarzalność identyfikatora UID.
- identyfikator grupy podstawowej (ang. group ID – czyli GID) – identyfikator określa przynależność do grupy o danym identyfikatorze. Powiązanie nazwy grupy z identyfikatorem znajduje się w pliku /etc/group,
- pole GECOS – prawdziwa nazwa użytkownika. W polu tym mogą być również zapisane inne informacje np. numer telefonu. Informacje od siebie oddzielane są przecinkiem,
- lokalizacja katalogu domowego użytkownika,
- powłoka użytkownika.
Analizując zrzut, na którym przedstawiono przykładowy plik /etc/passwd można wyróżnić szereg kont nie będących przypisanych do konkretnych osób, konta te należą do tzw. użytkowników specjalnych. Konta te przynależne są usługom a także użytkownikom, którzy wymagają specjalnych uprawnień. Np. superużytkownik (root) identyfikator UID oraz GID zawsze ma zdefiniowany na wartość 0 zaś użytkownik nobody jest kontem, któremu odebrano prawo do zapisu. W literaturze można spotkać się z określeniem nazywającym takie konta jako pseudoużytkownicy. Z reguły za pomocą takich kont nie można zalogować się do systemu, lecz sam system konta te może używać do uruchamiania procesów.
Plik /etc/shadow przechowuje informacje odpowiadające za uwierzytelnienie tj. dane na temat hasła i jego ważności. Przykładowy plik /etc/shadow pokazano na rysunku poniżej.
Poszczególne pola pliku i ich opis:
- nazwa użytkownika – nazwa ta jest tożsama z nazwą w pliku /etc/passwd Nazwa łączy wpis hasła z polem użytkownika.
- zahaszowane hasło – np. skrót funkcji MD5,
- data ostatniej zmiany hasła – czas ostatniej modyfikacji hasła, pole to jest wypełniane przez polecenie passwd.
- minimalna liczba dni między zmianami hasła – określa liczbę dni, które muszą upłynąć między zmianami hasła
- maksymalna liczba dni między zmianami hasła – określa maksymalną liczbę dozwolonych dni między zmianami hasła. Liczba ta jest sumą pól wartości tego pola i pola siódmego (tzw. okres łaski).
- liczba dni określającą komunikat o wygaśnięciu hasła,
- liczba dni definiowana od czasu wygaśnięcia hasła, po upływie których konto zostanie wyłączone,
- data ważności konta – dzień (liczony od 1 stycznia 1970 roku) wygaśnięcia konta użytkownika. Po przekroczeniu tej daty użytkownik traci możliwość logowania.
- pole zarezerwowane – do wykorzystania w przyszłości
Tworzenie konta
Aby utworzyć konto użytkownika należy posłużyć się poleceniem: useradd Ogólna składnia polecenia wygląda następująco: useradd <opcje> nazwa_użytkownika Poniżej na listingu przykład utworzenia konta dla użytkownika: jankow
- za pomocą polecenia: useradd jankow zostaje utworzone nowe konto,
- zmiana użytkownika,
- sprawdzenie za pomocą komendy: whoami nazwy aktualnego użytkownika.
Po utworzeniu nowego konta dobrze jest utworzyć hasło. Załóżmy, że administrator systemu zmianę hasła pozostawił użytkownikowi jankow. Tak więc użytkownik za pomocą polecenia: passwd próbuje ustalić hasło. Niestety po wydaniu polecenia napotykamy na nieoczekiwany problem a mianowicie system prosi nas o podanie aktualnego hasła. O jakie hasło chodzi? Przecież jedynie zostało utworzone tylko konto, hasło zaś nie było definiowane.
Tu musimy się zatrzymać i cofnąć. Bo nie we wszystkich wersjach systemu Ubuntu uda Ci się przełączyć na użytkownika, który nie posiada hasła. W momencie wydania komendy: su jankow zostaniesz poproszony o hasło. Nie jesteś w stanie go podać, gdyż nie zostało one jeszcze zdefiniowane.
Nieważne którą sytuację napotkasz, rozwiązanie obu problemów jest identyczne.
W pliku /etc/passwd w polu hasła znajduje się znak x.
Jak już wiesz znak x odsyła do pliku /etc/shadow, lecz pole hasła zawiera znak ! którego obecność skutecznie blokuje jego zmianę i możliwość wykonania logowania.
Aby użytkownik jankow mógł samemu zdefiniować hasło należy w pliku /etc/passwd w linii odpowiadającej danemu użytkownikowi w polu hasła wykasować znak x. Oczywiście zmianę tą musi wykonać użytkownik root.
Po przeprowadzonej modyfikacji i po ponownym wydaniu polecenia: passwd nie zostaniemy poproszeni o podanie aktualnego hasła, lecz będziemy mogli je utworzyć samemu.
Znacznie lepszym rozwiązaniem jest utworzenie konta i przypisanie nowo utworzonemu kontu hasła. Poniżej na przykładzie utworzenie konta dla użytkownika tadnow (punkt 1) oraz przypisanie hasła (punkt 2). Wszystkie operację wykonał użytkownik root.
Oczywiście polecenie useradd pozwala na skonfigurowanie szerszej gamy opcji związanych z tworzonym kontem. W zależności od potrzeb możemy zdefiniować np. czas, po którym konto zostanie wyłączone, do jakiej grupy podstawowej użytkownik ma należeć czy określić lokalizację katalogu domowego.
Poniżej przedstawiono przykład utworzenia konta użytkownika sonkie, przy czym dodatkowo za pomocą parametru -e zdefiniowano ważność konta tj. datę do kiedy konto jest aktywne.
Uruchomienie polecenia useradd z opcją -D, spowoduje wyświetlenie informacji o domyślnych ustawieniach. Ustawienia te są definiowane w pliku: /etc/default/useradd Modyfikacja i definicja tych parametrów pozwala nam na tworzenie kont z góry określonymi opcjami.
- GROUP – nazwa lub ID grupy domyślnej,
- HOME – katalog określający folder przechowywania katalogów domowych użytkowników,
- INACTIVE – parametr określa liczbę dni od daty wygaśnięcia hasła po której następuje blokada konta. Wartość: -1 – opcja nieaktywna, wartość: 0 – hasło wygasło, zablokowanie konta, wartość: dodatnia (liczba) – ilość dni.
- EXPIRE – data wyłączenia konta,
- SHELL – nazwa powłoki systemowej użytkownika,
- SKEL – lokalizacja katalogu, z którego zostaną skopiowane pliki i foldery do katalogu domowego nowo utworzonego użytkownika.
Innym narzędziem, którym możemy posłużyć się, aby utworzyć konto jest adduser. Wykonanie operacji utworzenia konta sprowadza się do wydania polecenia: adduser <nazwa_konta> i po udzieleniu odpowiedzi na postawione pytania konto użytkownika zostaje założone. Poniżej na rysunku przykład wykorzystania narzędzia adduser do utworzenia konta użytkownika tomwal.
Sprawdzenie integralność plików /etc/passwd oraz /etc/shadow jest możliwe za pomocą narzędzia: pwck Wydanie polecenia sprawi, że pliki zostaną sprawdzone pod kątem składni oraz zawartych w nich odwołań. Aby wyświetlić same informacje (tryb tylko do odczytu) należy posłużyć się flagą -r Wydanie samego polecenia pwck w razie wykrycie problemu wyświetli komunikat z zapytaniem o potwierdzenie wykonania danej operacji.
Zarządzanie hasłami
Wiesz już jak ustalić/zmienić hasło. Ale narzędzie passwd oprócz zmiany/ustalenia hasła pozwala jeszcze na wykonie kilku innych czynności. Ogólna składnia polecenia jest następująca: passwd <opcje> <konto_użytkownika> Bez zdefiniowania parametrów, poprzez wydanie samej komendy: passwd następuje zmiana hasła użytkownika w kontekście, którego polecenie zostało wydane.
Aby poznać parametry hasła należy posłużyć się poleceniem passwd z ustawioną flagą -S – passwd -S Po wydaniu polecenia uzyskamy informację o:
- login,
- status hasła – L – hasło jest zablokowane, NP – brak ustalonego hasła, P – hasło jest ustawione,
- data ostatniej zmiany hasła,
- minimalny czas życia hasła,
- maksymalny czas życia hasła,
- czas ostrzeżenia o zmianie hasła,
- liczba dni po której następuje blokada konta.
Użycie flagi -e wraz w połączeniu z nazwą konta spowoduje wymuszenie zmiany hasła.
Poniżej przedstawiono przykład wymuszenia zmiany hasła na koncie beatry (punkt 1). Po zmianie konta jesteśmy poinformowani o potrzebie natychmiastowej zmiany hasła (punkt 2). Użytkownik za pomocą narzędzia passwd dokonuje próby jego zmiany (punkt 3). W pierwszym podejściu hasła nie udaje się zmienić z powodu zdefiniowania zbyt prostego hasła – hasło: qwerty (punkt 4). Drugie podejście również kończy się niepowodzeniem – powód – zdefiniowane hasło jest identyczne z poprzednim (punkt 5). Dopiero trzecia próba kończy się sukcesem (do trzech razy sztuka – punkt 6).
Ustalenie minimalnego czasu życia hasła dokonujemy za pomocą przełącznika -n zaś wartość maksymalną możemy określić poprzez zastosowanie flagi -x. Użycie któregokolwiek z przełączników wymusza podanie ilości dni obowiązywania ustawienia.
Przełącznik -w pozwala ustalić czas ostrzeżenia informujący o potrzebie zmiany hasła.
Zaś hasło skasujemy z wykorzystaniem flagi -d.
Użycie polecenia usermod pozwala na modyfikację parametrów hasła kont.
Poniżej przykład wykorzystania komendy usermod do odblokowania konta, które wygasło.
Po zmianie konta użytkownika na beatry uzyskujemy komunikat o wygaśnięciu konta (punkt 1). Aby konto znów stało się aktywne należy ustalić nową datę wygaśnięcia konta. Nowa data zostaje ustalona z wykorzystaniem komendy usermod oraz flagi -e (punkt 2 – data wygaśnięcie konta zostaje ustalona na 3 marca 2016). Po ponownej zmianie konta na beatry (punkt 3) jesteśmy poinformowani o zbliżającym się terminie wygaśnięcia hasła, tak więc za pomocą już omówionego polecenia: passwd ustalamy nowe hasło.
Polecenie: usermod posiada przełącznik, który możemy wykorzystać do zablokowania dostępu do konta (brak możliwości zalogowania). Aby dane konto stało się nie aktywne wykorzystujemy do tego flagę: -L (po uaktywnieniu próba zalogowania się kończy się komunikatem o nieprawidłowym haśle).Poniżej na przykładzie wyłączenie konta alebin. Aby konto, znów działało należy wykorzystać opcję: -U.
Usunięcie konta
Polecenie userdel kasuje konto. Na zrzucie poniżej przykład usunięcia konta użytkownika tomwal.
Wydanie polecenia kasowania konta usunie konto z systemu, ale w katalogu domowym użytkownika pozostaną jego pliki. Aby usunąć również pliki do polecenia userdel należy dodać parametr -r.
Z zasady użytkownicy swoje pliki powinni trzymać w swoim katalogu domowym, lecz często zdarza się, że pliki są zapisywane w różnych lokalizacjach. Aby system po użytkowniku dokładnie posprzątać warto wyszukać i usunąć wszystkie pliki przynależne kasowanemu użytkownikowi. Aby odszukać takowe pliki należy skorzystać z polecenia: find / -user <nazwa_użytkownika>
Grupy w systemie Linux
Jednym z poleceń, które pozwoli na wyświetlenie listy grup, których jesteśmy członkami jest: id Przyglądnijmy się więc wynikom uzyskanym po wydaniu polecenia. Wydanie komendy pozwala poznać numer UID (ang. user ID) oraz GID (ang. primary group ID). Numery te nadawane są kontu użytkownika w trakcie procesu tworzenia. Na zrzucie poniżej identyfikatory konta root oraz luk.
Przeglądając wyniki stwierdzamy, że użytkownik root ma przypisaną wartość 0 dla identyfikatora UID oraz GID natomiast użytkownik luk wartość 1000 (w systemie Ubuntu numerowanie kont użytkowników rozpoczyna się od 1000 w innych dystrybucjach wartość ta może być inna np. w Fedora numeracja rozpoczyna się od 500). Dodanie kolejnego użytkownika z reguły prowadzi do zwiększenia wartości identyfikatorów UID oraz GID o jeden. Utwórzmy nowe konto: tadnow Jak widzimy wartości UID oraz GID wynoszą 1001 (wartości te pokazywane są podczas procesu tworzenia konta oraz dzięki poleceniu id).
Dla naszej wygody, szczególnie ma to znaczenie w przypadku, gdy zarządzamy dużą grupą użytkowników (ciężko jest te numery spamiętać) wartości UID i GID są mapowane na nazwę użytkownika bądź nazwę grupy. Informacje o mapowaniu dotyczące użytkownika pobierane są z opisanego już pliku /etc/passwd natomiast grupy – z pliku /etc/group. Poniżej na zrzucie zawartość pliku /etc/group
Celowość tworzenia grup i przypisywania do nich użytkowników jest związana z nadawaniem uprawnień. Ze względu na to, że grupa jest traktowana jako jednostka przypisane uprawnienia do grupy np. dostęp do określonego zasobu spowoduje nadanie uprawnienia wszystkim użytkownikom grupy.
W systemie Linux do zarządzania grupami można wykorzystać jedno z kilku poleceń a do najczęściej wykorzystywanych należy komenda: groupadd (analogicznie jak useradd) odpowiedzialna za utworzenie grupy. Składnia polecenia: groupadd <nazwa_grupy>
Poniżej przykład utworzenia dwóch grup: marketing oraz finanse Jak można zauważyć fakt utworzenia grup ma swoje odzwierciedlenie w pliku: /etc/group
Aby samemu określić identyfikator grupy GID należy do tego celu wykorzystać przełącznik -g.
Stan przynależności do grupy poszczególnego użytkownika można sprawdzić z wykorzystaniem polecenia: groups. Wydanie samego polecenia spowoduje wyświetlenie członkostwa w grupach użytkownika w kontekście, którego zostało wydane polecenie. Dołączenie nazwy użytkownika spowoduje wyświetlenie członkostwa zdefiniowanego użytkownika.
Zmianę członkostwa w grupie dokonamy za pomocą polecenia: usermod z parametrem -g bądź -G Dołączenie parametru -g i zdefiniowanie po nim nazwy grupy spowoduje zastąpienie początkowej grupy (taka sytuacja ma miejsce w Ubuntu w innych dystrybucjach nastąpi dopisanie użytkownika do zdefiniowanej w poleceniu grupy). Poniżej użytkownik tadnow zmienia członkostwo z grupy domyślnej tadnow na grupę finanse. Definicja grupy może nastąpić z wykorzystaniem identyfikatora GID (użycie w definicji identyfikatora powoduje dodanie użytkownika do danej grupy, bez zastąpienia) oraz co ważne definiowane grupy muszą istnieć.
Natomiast wybranie flagi -G spowoduje dodanie użytkownika do określnych grup. Poniżej przykład dodania użytkownika tadnow do grupy finanse oraz marketing. Po wydaniu polecenia użytkownik tadnow nadal jest członkiem domyślnej grupy tadnow.
Do modyfikacji parametrów grupy służy polecenie: groupmod Za pomocą komendy można dokonać modyfikacji nazwy grupy bądź jej identyfikatora GID. Niżej przykład zmiany nazwy grupy finanse na biznes. Jak widać po dokonanej zmianie automatycznie zmienia się członkostwo użytkownika tadnow. Aby dokonać zmiany nazwy należy w poleceniu groupmod użyć przełącznik -n natomiast gdy dokonujemy modyfikacji identyfikatora GID używamy flagi -g.
Aby usunąć grupę należy skorzystać z polecenia: groupdel Składnia polecenia jest następująca: groupdel <nazwa_grupy>
Przed skasowaniem grupy tak jak to miało miejsce w przypadku konta użytkownika warto zapoznać się z plikami, które do danej grupy należą, wyświetlenie plików przynależnych danej grupie uzyskamy za pomocą polecenia: find / -group <nazwa_grupy> -print Poniżej przykład z wykorzystaniem polecenia celem odnalezienia plików należących do grupy luk.
Podobnie działającym skryptem do przedstawionego już pwck, lecz tym razem sprawdzającym integralność pliku /etc/group jest grpck. Wywołanie skryptu spowoduje wykonanie sprawdzenia składni informacji zawartych w pliku.