Zarządzanie użytkownikami

Wprowadzenie

Użytkownicy i grupy

Użytkownicy i grupy mogą być w Linuksie lokalni i domenowi. Chociaż mają ze sobą wiele wspólnego, na razie zajmiemy się tylko tymi lokalnymi — domeny oparte o LDAP będą w dalszej części kursu.

Każdy użytkownik i każda grupa ma w systemie swówj identyfikator: w przypadku użytkowników to UID (ang. User ID), a w przypadku grup — GID (ang. Group ID). Ważną własnością każdego użytkownika jest to, że musi on mależeć do co najmniej jednej grupy, tzw. grupy podstawowej. Kolejna kwestia to konto administratora systemu. W Linuksie rolę tą pełni konto użytkownika root i filozofia dotycząca tego konta jest nieco odmienna od takowej w systemie Windows. Mamy dwie główne różnice:

  • Administratorem w Linuksie może byc tylko użytkownik root. Oczywiście można delegować uprawnienia administracyjne na wybranych użytkowników, jednak pozostają oni nadal zwykłymi użytkownikami.
  • Administrator w Linuksie ma pełne prawa i nikt mu ich nie może odebrać. Jest to zdecydowanie odmienna filozofia od tej w Windows — tam zwykły użytkownik może całkowicie odebrać administratorowi dostęp do swoich plików (oczywiście administrator może przejąć je na własność i zrobić porządek, jednak zmienia się wtedy stan systemu i nie może to pozostać niezauważone). Nie chcę pisać, że jedno rozwiązanie jest lepsze od drugiego: każde z nich ma swoje wady i zalety.

Katalogi domowe

Każdy użytkownik może mieć swój katalog domowy (profil). Domyślnie profile tworzone są w katalogu /home i nazwą jest nazwa użytkownika, np. /home/pawel, jednak nie ma żadnych ograniczeń, żeby katalogi domowe były w dowolnej lokalizacji i miały dowolną nazwę. Wyjątkiem jest tutaj użytkownik root, który katalog domowy ma w folderze /root. Zwyczajowo zalecane jest, aby katalogi domowe znajdowały się na osobnej partycji, na której uruchomiony jest system quota, czyli mechanizm sterowania przydziałem miejsca na dysku dla poszczególnych użytkoników i grup. Warto wiedzieć, że katalog domowy aktualnie zalogowanego użytkownika jest oznaczany przez znak tyldy (~), czyli np. jeśli zalogowany jest pawel posiadający katalog domowy /home/pawel, to wydanie polecenia cd ~ spowoduje przejście do właśnie tego katalogu.

Hasła

Hasła są newralgicznym elementem każdego systemu informatycznego. Podobnie jest także z Linuksem, dlatego też są one odpowiednio chronione przed nieuprawnionym dostępem. Obecnie w Linuksie mamy dwa istotne fakty związane z hasłami:
  • Hasła są obecnie przechowywane w postaci funkcji skrótu MD5 lub SHA1. Własnością funkcji skrótu jest brak możliwości odzyskania z „szyfrogramu” oryginalnego tekstu (czyli w tym kontekście hasła), stąd też funkcje skrótu są także nazywane jednokierunkowymi.
  • Hasła są przechowywane w pliku /etc/shadow, który jest dostępny tylko dla użytkownika root.
Sam system nie wystarczy, jeśli użytkownicy poprzez swoją niefrasobliwość doprowadzą do wycieku hasła do osób wrogich i złych. Dlatego też warto przypomnieć kilka podstawowych (i zwykle oczywistych) zasad postępowania z hasłami.
  • Hasła powinno być odpowiednio skomplikowane i długie, tj. obecnie przyjmuje się długość co najmniej 8 znaków z różnych kategorii (małe, wielki litery, cyfry, kilka znaków specjalnych, interpunkcyjnych). Na szczęście system można skonfigurować tak, żeby odpowiednią złożoność hasła wymuszał.
  • W przypadku konieczności zapisania hasła, odpowiednio je chronimy, np. portfel, sejf. Przyklejanie kartki pod klawiaturą, z racji powszechności stosowania nie jest dobrym pomysłem. Dobrym zwyczajem jest przechowywanie hasła w odpowiednio „zalakowanej” kopercie w sejfie, do którego dostęp mają osoby z dyrekcji lub zarządu. Bardzo niedobrym zwyczajem jest z kolei, żeby hasło znała tylko jedna osoba — jeśli coś ją rozjedzie, firma czy instytucja może mieć niepotrzebne komplikacje.
  • Jeśli hasło musi zostać przekazane osobom nieuprawnionym (czasami jest to konieczność, np. administrator jest niedostępny, a pilnie trzeba wykonać jakąś czynność administracyjną), hasło powinno zostać zmienione przez odpowiednią osobę najszybciej, kiedy to tylko możliwe.
  • Hasła trzeba co pewien czas zmieniać. I tutaj warto wykazać się rozsądkiem: jeśli sieć jest za dobrze skonfigurowanym firewallem z maskaradą, osoby w sieci darzą się dużym zaufaniem, nie ma potrzeby stosować bardzo restrykcyjnej polityki haseł — zmiana raz w roku powinna wystarczyć, złożoność haseł też nie musi być na bardzo wysokim poziomie. Analogicznie, jeśli mamy do czynienia z przypadkiem przeciwnym, gdzie sieć integruje np. 350 oddziałów w Europie i siłą rzeczy ludzie się nie znają, gdzie jest powszechnie stosowany zdalny dostęp, wtedy niezbędne jest zastosowanie bardziej restrykcyjnej polityki haseł.

Powłoka

Powłoka to program, który będzie domyślnie dostępny po uruchomieniu wiersza poleceń. W szczególności, jeśli nie korzystamy z systemu graficznego, będzie to program wiersza poleceń dostępny po zalogowaniu. Najczęściej spotykaną powłoką jest bash, inne to np. tcsh, csh, sh.

Pliki poczty

W systemie domyślnie instalowane jest oprogramowanie do lokalnego dostarczania poczty. Skrzynki pocztowe są wtedy najczęściej zlokalizowane z katalogu /var/mail, a w niektórych dystrybucjach w katalogu /var/spool/mail. W sytuacji, gdy użytkownik korzysta z programu pocztowego, w którym tworzy własne skrzynki pocztowe, są one wtedy zwykle umieszczane w określonym katalogu w profilu użytkownika, np. ~/Mail.

Pliki konfiguracyjne

W systemie Linux mamy trzy główne pliki konfiguracyjne, które stanowią bazę użytkowników i grup. Pliki te to:
  • /etc/passwd — zawiera podstawowe dane użytkowników,
  • /etc/shadow — zawiera informacje o hasłach,
  • /etc/group — zawiera informacje o grupach.
Format tych plików jest następujący. Każdy wiersz dotyczy pojedynczego użytkownika, hasła lub grupy, natomiast wiersze składają z kolumn rozdzieloncyh znakiem dwukropka. Znaczenie poszczególnych kolumn omówimy w dalszej części.

Plik /etc/passwd

Tutaj sytuacja jest bardzo prosta. Schemat jednego wiersza w pliku:
  • konto — nazwa użytkownika, zgodnie z konwencją bez wielkich liter,
  • hasło — kiedyś było tu hasło, obecnie jest znak x,
  • UID — ID użytkownika,
  • GID — ID grupy podstawowej,
  • opis — tzw. pole GECOS, informacje o koncie ustawiane przez polecenie chfn; zwykle w formacie listy przecinkowej zawierającej imię i nazwisko, nr pokoju, telefon służbowy, telefon domowy, inne,
  • katalog — ścieżka do katalogu domowego,
  • powłoka — domyślny program wiersza poleceń.
Przykładowy fragment pliku:
dhcpd:x:103:65534:DHCP server daemon:/var/lib/dhcp:/bin/false
ftp:x:40:49:FTP account:/srv/ftp:/bin/bash
games:x:12:100:Games account:/var/games:/bin/bash
gdm:x:50:105:Gnome Display Manager daemon:/var/lib/gdm:/bin/false
haldaemon:x:101:102:User for haldaemon:/var/run/hal:/bin/false
ldap:x:76:70:User for OpenLDAP:/var/lib/ldap:/bin/bash
ntp:x:74:103:NTP daemon:/var/lib/ntp:/bin/false
postfix:x:51:51:Postfix Daemon:/var/spool/postfix:/bin/false
root:x:0:0:root:/root:/bin/bash
wwwrun:x:30:8:WWW daemon apache:/var/lib/wwwrun:/bin/false
pawel:x:1001:100:Paweł Rajba,340,71333,71444,Brak:/home/pawel:/bin/bash

Od razu zauważamy, że coś tu nie gra! Co to za dziwne konta? Otóż są to konta usług. Jak się można domyślić są one utworzone ze względów bezpieczeństwa. Weźmy dla przykładu DHCPD. Usługa DHCP do swojego działania potrzebuje bardzo niewielu danych. Jeśli byśmy serwer DHCP uruchamiali na tożsamości użytkownika root, to w przypadku włamania wróg ma potencjalnie dostęp do tego, do czego ma dostęp root, czyli do wszystkiego. Natomiast w przypadku, gdy usługa działa na tożsamości użytkownika dhcpd, to po włamaniu wróg przejmuje to co ma użytkownik dhcpd, czyli bardzo niewiele.

Plik /etc/shadow

Jak wyżej wspomniano, plik ten zawiera informacje o hasłach użytkowników. Schemat pojedynczego wiersza pliku:
  • nazwa użytkownika,
  • zakodowane hasło, zwykle poprzez funkcję SHA1 lub MD5,
  • liczba dni od 1.1.1970 do daty ostatniej zmiany hasła,
  • liczba dni od ostatniej zmiany hasła, podczas których nie można hasła zmienić (okres min),
  • liczba dni od ostatniej zmiany hasła, po których zmiana hasła jest wymagana; inaczej: okres ważności hasła) (okres max),
  • liczba dni przed wygaśnięciem hasła, podczas których użytkownik będzie informowany o konieczności zmiany hasła (okres warn),
  • liczba dni licząc od ostatniego dnia kiedy można było zmienić hasło, podczas których użytkownik może jeszcze zmienić hasło; inaczej: hasło straciło już ważność, czyli nie można się za jego pomocą zalogować, ale można za jego pomocą zmienić je na nowe hasło (okres inactive)
    • po tych dniach konto zostanie zablokowane,
    • po zablokowaniu niezbędny jest kontakt z administratorem systemu,
  • liczba dni od 1.1.1970 do momentu (dnia), którym konto zostało/zostanie zablokowane,
  • zarezerwowane.

Aby lepiej zrozumieć powyższe zależności, warto zerknąć na poniższą ilustrację. Są na niej umieszczone wartości kolumn 3–7.

Ilustracja pliku /etc/shadow

Warto w tym miejscu odnotować następujące spostrzeżenie. Otóż należy pamiętać, że zawartość pliku /etc/shadow jest czymś statycznym. To co się zmienia w całym układzie to upływający czas i to, jak system zareaguje zależy właśnie od bieżacej chwili, czyli od tego gdzie chwila bieżąca „wpadnie” na powyższym wykresie.

Zastanawiałem się też kiedyś, po co tak naprawdę jest wartość min. I oświeciło mnie, gdy dowiedziałem się jak w jednej z firm pracownicy radzą sobie z koniecznością cyklicznej zmiany hasła. W każdej firmie jest zwykle tak, że hasło trzeba zmieniać co pewien okres czasu (np. 3 miesiące) i trzeba się przy tym stosować do pewnych reguł. Jedną z tych reguł jest zwykle to, że hasło musi być różne od powiedzmy 6 ostatnich haseł. No i jak sobie radzą pracownicy? Otóż zmieniają hasło 7 razy, przy czym ostatnia zmiana jest na hasło sprzed zmiany, gdyż system pomięta tylko 6 ostatnich haseł. Oczywiście reguła historii haseł traci sens. Chyba, że... Chyba, że określimy okres min, wtedy już powyższy numer nie przejdzie.

Plik /etc/group

Ostatnim plikiem jest plik /etc/group, który zawiera informacje o grupach. Schemat pojedynczego wiersza:
  • nazwa grupy
  • hasło grupy
  • GID
  • lista użytkowników w grupie (np. bea, pawel)
Należy zwrócić uwagę, że użytkownicy z danej grupie określani są poprzez nazwy, a nie identyfikatory. W niektórych dystrybucjach można się spotkać z rozwiązaniem, w którym zamiast pliku group są dwa pliki group i gshadow. Ich rola jest wtedy analogiczna do roli plików passwd i shadow.

Narzędzie do obsługi kont

Omówimy następujące polecenia konsolowe:

useradd

Polecenie to służy do dodania użytkownika do systemu, ewentualnie także do zmiany domyślnych parametrów, według których nowi użytkownicy będą utworzeni.

Składnie użycia tego polecenia. Pierwsza składnia pozwala na dodanie użytkownika, druga wyświetla wartości domyślnych parametrów, a trzecia pozwala na ustawienie tych parametrów domyślnych, które to parametry są przechoywane w pliku /etc/default/useradd.

useradd [-c komentarz] [-d katalog] [-m] [-g gid] [-G grupa,...]
        [-e yyyy-mm-dd] [-f liczba] [-s powłoka] [-u uid] nazwauzytkownika
useradd --show-defaults
useradd --save-defaults [-d katalog] [-f liczba] [-g gid] [-G grupa,...] [-s powłoka]

Znaczenie parametrów.

  • -c tekst — wprowadza opis użytkownika, czyli wartość pola GECOS w pliku passwd.
  • -d katalog — określa katalog domowy na potencjalnie inny niż domyślny. Zwracam uwagę, że jest to TYLKO określenie wpisu w pliku passwd, tzn. że jeśli chcemy, aby ten katalog został utworzony należy użyć dodatkowej opcji -m.
  • -m — określa, czy katalog domowy ma zostać utworzony (zgodnie z lokalizację określoną parametrach domyślnych lub poprzez opcję -d). Przy tworzeniu katalogu kopiowana jest zawartość katalogu /etc/skel, chociaż można poprzez dodatkową opcję (-k) określić inny katalog „źródłowy”, dzięki czemu możemy mieć kilka schematów początkowej konfiguracji dla różnego typu użytkowników.
  • -f liczba — określa liczbę dni „nieaktynowści” (wartość pola inactive z pliku shadwo)
  • -g gid — określa grupę podstawową dla użytkownika
  • -G grupa,... — określa grupy dodatkowe
  • -e yyyy-mm-dd — określa, kiedy konto zostanie/zostało zablokowane; ważne jest wprowadzenie daty w przedstawionym formacie
  • -s powłoka — określa powłokę
  • -u uid — pozwala jawnie podać identyfikator użytkownika

userdel

Polecenie do usunięcia użytkownika. Ma tylko jeden opcjonalny parametr -r, który określa, czy usunąć także katalog domowy wraz z zawartością. Składnia:

userdel [-r] nazwauzytkownika

usermod

Polecenie to służy do modyfikacji konto użytkownika. Składnia:

usermod [-c komentarz] [-d katalog [-m]] [-f liczba] [-g gid] [-G grupa,...]
        [-s powłoka] [-u uid] [-l login] nazwa_uzytkownika

Chociaż większość opcji jest taka sama jak w przypadku polecenie useradd, warto zwrócić uwagę na dwie a nich:

  • -d katalog [-m] — sama opcja -d zmienia wpis w pliku passwd, jednak w połączniu w opcją -m tworzony jest nowy katalog domowy i przenoszona jest zawartość poprzedniego katalogu domowego do nowej lokalizacji (poprzednia lokalizacja jest usuwana)
  • -l login — określa nową nazwę użytkownika; warto zauważyć, że nie jest to tylko wymiana nazwy w pliku passwd, np. w pliku grup nazwa również aktualizowana

groupadd

Polecenie do utworzenia grupy. Składnia:
groupadd [-g gid] nazwa
Opcja -g pozwala na jawne wskazanie identyfikatora nowotworzonej grupy.

groupdel

Polecenie do usuwania grupy. Składnia i zarazem jedyne użycie:
groupdel nazwagrupy

groupmod

Polecenie do modyfikacji konta grupy. Składnia:
groupadd [-g gid] [-n nowanazwa] nazwa
Podanie opcji -g pozwala na zmianę identyfikatora, a podanie opcji -n pozwala na zmianę nazwy grupy.

passwd

Polecenie ma dosyć sporo różnych zastosowań. Dalej omówimy większość z nich.
  1. Ustawienie hasła dla konta użytkownika
    Składnia polecenia:
    passwd [nazwauzytkownika]
    

    Dla zwykłego użytkownika dostępna jest składnia bez parametru, która pozwala na zmianę hasła aktualnie zalogowane użytkownika. Użytkownik root może dodatkowo podać jako parametr użytkownika, którego chce ustawić hasła. Jeszcze jedną różnicą jest to, że zwykły użytkownik musi w procesie zmiany hasła wykazać się znajomością dotychczasowego hasła, natomiast użytkownik root po prostu ustawia hasło bez konieczności podawania dotychczasowego.

  2. Ustawienie informacji o użytkowniku
    Składnia polecenia:
    passwd -f [nazwaużytkownika]
    
    Polecenie pozwala na ustawienie wartości pola GECOS w pliku passwd. Dostępność opcji nazwauzytkownika jest analogiczna jak w poprzednim użyciu. Format danych jest z kolei taki jak omówiony przy okazji struktury pliku /etc/passwd. Ten sam efekt co powyższym poleceniem można także uzyskać poleceniem chfn
  3. Sterowanie dostępnością konta
    Składnia polecenia:
    passwd {-l | -u | -d | -e} nazwauzytkownika
    
    Znaczenie opcji:
    • -l — blokowanie konta,
    • -u — odblokowanie konta,
    • -d — usunięcie hasła,
    • -e — ustawienie konta tak, żeby użytkownik musiał zmienić hasło przy kolejnym logowaniu.
    Jak można się domyślić, ta składnia jest dostępna tylko dla administratora. W tym miejscu warto dodać, że polecenie operuje na pliku shadow i wykonanie polecenia z każdą opcją powoduje pewną modyfikację tego pliku. Zachęcam do zbadania, jakie zmiany mają miejsce w przypadku kolejnych opcji.
  4. Konfiguracja parametrów hasła
    Składnia polecenia:
    passwd [-n min] [-x max] [-w warn] [-i inactive] nazwauzytkownika
    
    Znaczenie opcji jest takie samo, jak to umówione w kontekście pliku shadow. Proszę zwrócić uwagę, że te opcje dokładnie odpowiadają poszczególnym kolumnom pliku shadow, stąd zrozumienie struktury tego pliku sprawia, że czytelnik bez problemu poradzi sobie z użyciem tego polecenia.
  5. Pobieranie informacji o kontach
    Składnia polecenia:
    passwd -S [-a | nazwauzytkownika]
    
    Znaczenie opcji
    • nazwauzytkownika — wyświetlenie informacji o koncie użytkownika nazwauzytkownika
    • -a — wyświetlenie informacji o wszystkich kontach

    Dla zwykłego użytkownika dostępne jest polecenie tylko z opcją -S, które wydrukuje informacje o aktualnie zalogowanym użytkowniku, natomiast pozostałe opcje są, oczywiście, dostępne dla użytkownika root.

    Ponieważ wynik działania tego polecenia może nie być oczywisty, krótko go umówimy. Przykładowy wydruk:

    $ passwd -S gucio
    gucio PS 10/19/2008 0 99999 7 -1
    
    Pierwsza kolumna to oczywiście nazwa konta. Kolejna to stan konta. Mamy następujące wartości:
    • PS — użytkownik ma hasło i może się logować
    • LK — konto jest zablokowane
    • NP — użytkownik nie ma hasła
    Dalsze kolumny ponownie odpowiadają kolumnom z pliku shadow: data ostatniej zmiany hasła i okresy min, max, warn oraz inactive.

gpasswd

Polecenie pozwalające utworzyć lub usunąć hasło dla konta grupy. Składnia:
gpasswd [-r] grupa
Podanie opcji -r spowoduje usunięcie hasła, wywołanie polecenia bez tej opcji – ustawienie hasła. Na pytanie do czego może służyć hasło dla grupy odpowiemy sobie przy okazji systemu plików, ponieważ, jak się można domyślać, będzie ono pozwalało na sterowanie dostępem do zasobów.

su

Polecenie to służy do zmiany identyfikatora użytkownika i grupy w konsoli, czyli inaczej mówiąc umożliwia „przelogowanie” w konsoli tekstowej. Tak naprawdę w biężącej konsoli uruchamiana jest nowa konsola, w której funkcjonujemy na nowej tożsamości. Po wylogowaniu wracamy do poprzedniej konsoli, w tym także tożsamości. Składnia:
su [-c polecenie] [-] [uzytkownik]
Znaczenie opcji:
  • - — sprawia, że powłoka będzie powłoką logowania, czyli np. zostaną przywrócone zmienne środowisko; inaczej mówiąc konsola będzie wyglądać tak, jakby użytkownik się w niej zalogował, a nie wykonał su,
  • -c polecenie — zamiast przełączyć się na użytkownika, wykonamy jako ten użytkownik polecenie, dokładniej: zostanie uruchomiona nowa konsola z nową tożsamością, w tej konsoli zostanie wykonane polecenie, po czym po wykonaniu polecenia, ta nowa konsola zostanie zamknięta i powrócimy do poprzedniej konsoli (tożsamości).

Jak zauważamy, parametr użytkownik jest opcjonalny. Otóż nie podanie tego parametru oznacza próbą przelogowania się na użytkownika root. Warto też odnotować, że użytkownik root może się „przełączać” na dowolnego użytkownika bez konieczności podawania hasła (pamiętamy, że root może wszystko).

sudo

Jest to polecenie, za pomocą którego możemy delegować uprawnienia administracyjne na innych użytkowników. Polecenie to jednak jest ogólniejsze: służy do tego, że wykonywać polecenia na innej tożsamości (część funkcjonalności tego polecenia oferuje polecenie su). Polecenie to ma kilka składni:
sudo [-u użytkownik] polecenie
sudoedit [-u użytkownik] ścieżka-do-pliku
sudo { -v | -k | -l }

Pierwsza składnia służy do uruchomienia danego polecenia na innej tożsamości. Ponownie, nie podanie użytkownika oznacza próbę wykonania polecenia na tożsamości użytkownika root.

Druga składnia służy do edycji plików na innej tożsamości, przy czym scenariusz jest następujący:

  • Plik do edycji jest kopiowany (ewentualnie tworzony, jeśli nie istnieje) do katalogu tymczasowego (zwykle /var/tmp), przy czym jego właścicielem i grupą jest tożsamość, na której ma być dokonana edycja.
  • Następnie uruchamiany jest edytor do edycji tego tymczasowego pliku (brany jest edytor ze zmiennych EDITOR lub VISUAL, a jeśli zmienne nie są ustawione, z listy edytorów określonych w pliku konfiguracyjnym sudoers).
  • Po zakończeniu edycji oryginalny plik jest zastępowany tym zmodyfikowanym. Jeśli ta zamiana jest niemożliwa, zmodyfikowany plik pozostaje w katalogu tymczasowym, a użytkownik dostaje stosowne ostrzeżenie.

No dobrze, poza różnymi szczegółami, czym to się tak naprawdę różni od odpalenia polecenia sudo z poleceniem edycji? W pliku konfiguracyjnym określamy co, kto i na czym może uruchomić, w szczególności, jeśli ktoś chciałby edytować za pomocą edytora vi musielibyśmy dać mu takie uprawnienie. A co, jeśli ktoś panicznie boi się edytora vi? No właśnie, żeby wszystkim dogodzić musielibyśmy każdemu dać prawa do każdego edytora. Korzystając z sudoedit jest to prostsze, ponieważ w konfiguracji dajemy prawa do sudoedit, a to który edytor będzie uruchomiony zależy od zmiennej EDITOR, co już może sobie użytkownik ustawić wedle uznania.

Zanim przejdziemy do omówienia trzeciej składni, należy napisać o pewnym aspekcie działania polecenia sudo. Przypuśmy, że jesteśmy zalogowani jako pawel. W momencie, gdy chcemy wykonać useradd jako root, zostaniemy poproszoni o podanie hasła. Jednak gdy zaraz potem wykonamy useradd ponownie, o podanie hasła nie zostaniemy poproszoni. Stanie sie tak, ponieważ po wykonaniu sudo po raz pierwszy, system zapamięta, że miało to miejsce i przez pewien czas (domyślnie 5 minut) nie będzie ponownie żądał hasła. Co więcej, jeśli w okreśie tych 5 minut wykonamy useradd ponownie, te 5 minut będą się liczyć na nowo (od momentu tego drugiego wykonania useradd). Generalnie kolejnym poleceniem nie musi być useradd — istotnym jest, żeby kolejne polecenia było wykonane na tożsamości użytkownika root.

W trzeciej mamy następujące znaczenie opcji:

  • -v — powoduje przedłużenie zapamiętania hasła dla użytkownika root (podbicie timestampu), czyli jakby udaje wykonanie polecenia sudo na koncie root (dotyczy tylko konta root),
  • -k — powoduje natychmiastowe „zapomnienie” hasła (bardzo przydatne, gdy musimy okazjonalnie wykonać polecenie na cudzym komputerze, po czym chcemy przejść do innego komputera — nie wykonanie sudo -k może zachęcić użytkownika wykonania poleceń na tożsamości użytkownika root (dotyczy tylko konta root.
  • -l — podanie tej spowoduje wyświetlenie uprawnień danego użytkownika (dostępne po podaniu hasła konta użytkownika root).
Plikiem konfiguracyjnym polecenia sudo jest plik /etc/sudoers. Plik ten ma bardzo rozbudowaną składnię i spore możliwości. Poniżej kilka przykładów przybliżających, co można tam wstawić:
  • Aliasy. Przykłady:
    User_Alias WEBMASTERS = pawel, michal
    Host_Alias SERVERS = dc, www, ftp, mail, ns
    Host_Alias LAB31 = 10.2.31.0/24
    Cmnd_Alias KILL = /usr/bin/kill
    Cmnd_Alias HALT = /usr/sbin/halt
    Cmnd_Alias PRINTING = /usr/sbin/lpc, /usr/bin/lprm
    Cmnd_Alias USERCMNDS = /usr/sbin/useradd, /usr/sbin/userdel, (itd.)
    
  • Wartości domyślne. Trzy poziomy określania:
    Defaults
    Defaults:użytkownik
    Defaluts@Host
    
    Przykłady:
    Defaults syslog=auth
    Defaults passprompt="Witaj %u - podaj swoje hasło:"
    Defaults:pawel timestamp_timeout=-1
    Defaults:enemy timestamp_timeout=0
    Defaults targetpw (bardzo ważna opcja)
    
  • Nadawanie uprawnień. Ogólna składnia:
    kto komputer=(jakokto) polecenia
    
    Przykłady
    root ALL=(ALL) ALL
    pawel localhost=(root) NOPASSWD: KILL
    pawel cassiopeia=(root) NOPASSWD: /usr/sbin/useradd
    pawel cassiopeia=(root) PASSWD: /usr/sbin/userdel
    pawel cassiopeia=(ala,basia) NOPASSWD: /bin/ls
    

Więcej można się dowiedzieć w manualu: man sudoers.

sg, newgrp

Służy do zmiany identikatora bieżącego identyfikatora grupy (GID). Składnia:
sg [-l | -c command] group
Działanie i znaczenie opcji jest takie samo jak w przypadku polecenia su, natomiast należu zwrócić uwagę na jakie grupy możemy się „przełączać”. Pamiętamy, że użytkownik ma grupę podstawową i grupy dodatkowe. Przełączać się możemy na wszystkie grupy dodatkowe, do których użytkownik należy (bez podawania hasła). Dodatkowo, jeśli jakaś grupa ma ustawione hasło i podczas przełączania to hasło podamy, to również będziemy mogli zmienić tożsamość grupy.

users

Wyświetla listę zalogowanych użytkowników na komputerze. Składnia i użycie zarazem:
users

groups

Wyświetla listę grup, do których należy użytkownik. Składnia:
groups [nazwauzytkownika]
Podanie nazwy użytkownika spowoduje wyświetlenie listy group konta użytkownika (czyli zostaną pobrane wartości z pliku konfiguracyjnego), natomiast nie podanie nazwy użytkownika spowoduje wyświetlenie list grup aktualnie zalogowanego użytkownika. Mały przykład (zalogowany jest pawel):
1  $ groups
2  users
3  $ groups pawel
4  pawel : users
5  $ sg root
6  Hasło:
7  $ groups pawel
8  pawel : users
9  $ groups
10 root users
Polecenie robi to samo co id -Gn.

id

Wyświetla informacje o kontach użytkowników. Składnia:
id [-u | -g | -G] [-n] [nazwa]

Podobnie jak w przypadku polecenia groups, podanie nazwy użytkownika spowoduje wyświetlenie informacji o koncie użytkownika (wartości zostaną pobrane z pliku konfiguracyjnego), nie podanie nazwy użytkownika — informacje będą dotyczyły zalogowanego użytkownika).

Znaczenie opcji:

  • -u — wyświetla ID/nazwę użytkownika
  • -g — wyświetla ID/nazwę grupy podstawowej użytkownika
  • -G — wyświetla ID/nazwy wszystkich grup, do których należy użytkownik (łącznie z grupą podstawową)
  • -n — decyduje, czy będą wyświetlane nazwy czy identyfikatory

last

Wyświetla historię logowań. Składnia:
last [-liczba | -num liczba] [-a] [uzytkownik]
Znaczenie opcji:
  • -liczba, -num liczba — liczba wyświetlanych wierszy
  • -a — nazwa hosta będzie ostatnią kolumną
  • podanie nazwy użytkownika filtruje wpisy i zostawia tylko te dotyczące podanego użytkownika
Pliki, w których dane są przechowywane to /var/log/wtmp i /var/log/btmp, przy czym, żeby rejestrowanie historii logowań miało miejsce, te pliki muszą istnieć (w razie potrzeby należy je utworzyć poleceniem touch).

finger

Program do monitorowania aktywności użytkowników w systemie. Składnia:
finger [-l] [użytkownik]

Podanie nazwy użytkownika spowoduje wyświetlenie informacji o podanym użytkowniku, brak nazwy użytkownika — wyświetlenie informacji o wszystkich zalogowanych użytkownikach. Opcja -l określa rodzaj wydruku (pełny lub skrócony) i zmienia zawartość wydruku. Zachęcam poeksperymentować z opcją -l i zobaczyć, jakie wydruki będziemy otrzymywać w różnych kombinacja parametrów.

Z poleceniem finger związany jest jeszcze mechanizm obsługi plików .project i .plan. Otóż w momencie, gdy utworzymy jeden z (lub oba) wymienionych plików, ich zawartość będzie się pojawiać w długim opisie dotyczącym użytkownika. Jest to ciekawy sposób takiego „rozgłoszenia informacji na żądanie” wśród innych użytkowników systemu.

who

Polecenie podobne do polecenia finger, ma kilka różnych składni:
who [-HT]
who -q
who -r

Pierwsza składnia drukuje listę aktualnia zalogowanych użytkowników. Znaczenie opcji:

  • -H — dołącza nagłówek do listy
  • -T — dołącza do listy informację, czy do użytkownika można wysyłać komunikaty:
    • + : można
    • - : nie można
    • ? : nie znaleziono terminala

Druga składnia wyświetla informacje o aktualnie zalogowanych użytkownikach w trochę innej formie:

  • w pierwszym wierszu drukuję listę zalogowanych użytkowników (oddzielonych znakiem spacji)
  • w drugim wierszu podaje liczbę zalogowanych użytkowników

Trzecia składnia podaje bieżący poziom pracy (o tym co to jest będzie się można dowiedzieć z dalszej części kursu).

Łamanie haseł

Zagadnienie łamania haseł jest dla niektórych osób najbardziej elektryzującym tematem z całego działu dotyczącego zarządzania użytkownikami. Programów do łamania haseł jest bardzo wiele, natomiast nasze rozważania przeprowadzimy używając program John the Ripper. Strona domowa programu to http://www.openwall.com/john/, natomiast źródła w polecanej wersji są dostępne pod adresem http://www.openwall.com/john/f/john-1.7.2.tar.gz. A zatem zaczynamy! Poniżej przedstawiam krótki scenariusz, dzięki któremu można będzie rozpocząć łamanie haseł:

  • Logujemy się do systemu jako użytkownik root.
  • Pobieramy źródła:
    # wget http://www.openwall.com/john/f/john-1.7.2.tar.gz
    
  • Przenosimy je do katalogu /usr/src
    # mv john-1.7.2.tar.gz /usr/src/
    
  • Przechodzimy do katalogu /usr/src (cd /usr/src)
  • Rozpakowujemy archiwum ze źródłami:
    # tar -zxf john-1.7.2.tar.gz
    
  • i przechodzimy do katalogu ze źródłami
    # cd john-1.7.2/
    
  • Kompilujemy źródła poleceniem:
    # make clean linux-x86-sse2
    
    W przypadku, gdy nie wiemy jaki mamy procesor (lub system), wydajemy polecenie
    # make clean generic
    
    chociaż bardziej precyzyjne wskazanie architektury może przespieszyć działanie programu.
  • Przechodzimy z powrotem do katalogu /usr/src i przenosimy cały folder do katalogu root.
    # cd /usr/src
    # mv john-1.7.2 /root
    
  • Przechodzimy do katalogu z programami john-a
    # cd /root/john-1.7.2/run/
    
    W podkatalogu doc (zamiast podkatalogu run) mamy dokumentację.
  • Poleceniem unshadow przygotowujemy plik do łamania
    # ./unshadow /etc/passwd /etc/shadow > /root/mypasswd
    
    Warto sobie oglądnąć plik /root/mypasswd.
  • Łamanie rozpoczynamy poleceniem
    # ./john /root/mypasswd
    
Polecenie john ma sporo możliwości, którymi można sterować poprzez opcje, na początek jednak warto odnotować tylko kilka podstawowych:
  • --wordlist — jeśli chcemy podać słownik inny niż domyślny
  • --users — jeśli chcemy łamać hasła wybranych użytkowników
  • --show — jeśli chcemy zobaczyć dotychczas złamane hasła

Inne przykłady:

# ./john --users=juzer,user1 /root/mypasswd
# ./john --users=juzer --wordlist=/root/dict.txt /root/mypasswd
# ./john --show /root/mypasswd