Cyberbezpieczeństwo okiem programisty

Linux – przegląd lokalnych użytkowników

L

Zapisz się na newsletter, jeśli nie chcesz przegapić kolejnych publikacji.

Uwaga! W tym artykule pojęcia konto oraz użytkownik są używane zamiennie, ale pamiętajmy, że w systemie mogą być skonfigurowane m.in. konta usług (service accounts) lub systemowe, które nie są wykorzystywane przez człowieka w sposób interaktywny.

cat /etc/passwd

Lista lokalnych użytkowników, wraz z informacjami wykorzystywanymi podczas procesu logowania, znajduje się w pliku /etc/passwd. Ponieważ jest on wykorzystywany w wielu miejscach, każdy powinien mieć prawo do jego odczytu, ale możliwość zapisu musi być ograniczona jedynie do kont z uprawnieniami administratora.

Każda linia w pliku to poszczególne informacje o pojedynczym użytkowniku, odseparowane znakiem dwukropka (:):

<login>:x:<UID>:<GID>:<GECOS>:<home_dir>:<shell/command>

<login> – login użytkownika/nazwa konta.

x – w tym miejscu raczej nie spotkamy się z inną wartością niż x, która wskazuje na to, że odpowiednio wyliczony hash hasła użytkownika znajduje się w pliku /etc/shadow. Ciekawostka: kiedyś skróty haseł znajdowały się w pliku /etc/passwd, ale ze względu na ogólnodostępne prawa odczytu do tego pliku, przeniesiono skróty do chronionego pliku, do którego dostęp ma tylko administrator (przy obecnie dostępnej mocy obliczeniowej nietrudno jest złamać hasło posiadając hash).

<UID>User ID – każdy użytkownik musi mieć przypisany swój unikalny identyfikator.

  • 0 – identyfikator super-użytkownika root.
  • 0-99 – identyfikatory zarezerwowane dla użytkowników systemowych, które są przydzielone statycznie. Te konta zawsze będą miały ten sam ID, niezależnie od instalacji systemu czy dystrybucji (0 = root, 1 = daemon, 2 = bin itd.).
  • 100 - 499 – identyfikatory również zarezerwowane przez system dla kont systemowych/usługowych, ale alokowane dynamicznie (tzn. te same konta mogą mieć różne identyfikatory, na różnych instalacjach systemu). Niektóre dystrybucje (np. Debian) rezerwują sobie szerszy zakres: 100 - 999.

<GID>Group ID – identyfikator grupy podstawowej. Każdy użytkownik musi przynależeć do przynajmniej jednej grupy, zwanej grupą podstawową (primary group). Podobnie jak w przypadku wartości UID, system również rezerwuje sobie wybrane zakresy GID.

<GECOS> – opcjonalne pole wykorzystywane do przechowywania ogólnych informacji o koncie, takich jak opisowa nazwa użytkownika czy dane kontaktowe. Czasami nazywane jest też polem komentarza (comment field), choć w dokumentacji możemy spotkać się z enigmatycznym skrótem GECOS (General Electric Comprehensive Operating System).

Ciekawostka historyczna: GECOS/GCOS jest rodziną systemów operacyjnych stworzoną przez amerykańską firmę General Electric (po wykupieniu firmy przez Honeywell, przemianowano system na General Comprehensive Operating System).

W dawnych czasach, systemy UNIX wykorzystywane w Bell Labs, używały urządzeń działających pod kontrolą tego systemu m.in. do spoolingu (forma realizowania operacji wejścia/wyjścia polegająca na tym, że zawartość strumienia danych jest najpierw buforowana w całości i dopiero wtedy zostaje przesłana w miejsce docelowe) podczas operacji drukowania dokumentów.

Początkowo używano więc tego pola do przechowywania identyfikatora użytkownika korzystającego z tego systemu (GCOS ID). Później zaczęto umieszczać tam dodatkowe i opcjonalne informacje o użytkowniku, ale nazwa pozostała.

<home_dir> – ścieżka absolutna do katalogu domowego danego użytkownika. Zazwyczaj jest to: /home/<login>.

<shell/command> – przeważnie jest to ścieżka absolutna do domyślnej powłoki (ang. shell) danego użytkownika, jak na przykład /bin/bash, ale wartość może również wskazywać na ścieżkę do dowolnego polecenia, które wykona się podczas logowania.

Przykładowo: jeśli to pole, zamiast ścieżki do powłoki, będzie zawierało pełną ścieżkę do polecenia /usr/bin/whomai i spróbujemy zalogować się jako ten użytkownik przez su <login>, to otrzymamy na wyjściu jedynie nazwę użytkownika <login> jako wynik polecenia whoami i wrócimy do powłoki bieżącego użytkownika.

W niektórych rekordach możemy spotkać się z wartością /usr/bin/nologin (lub /bin/nologin) co jawnie wskazuje na to, że na dane konto nie można się zalogować.

cat /etc/passwd | grep -w "^LOGIN"
grep -w "^LOGIN" /etc/passwd

Gdy potrzebujemy wyświetlić rekord dla konkretnego użytkownika, wystarczy posłużyć się poleceniem grep. Można użyć parametru -w (skrót od --word-regexp), żeby zwrócić jedynie te linie, w których znaleziono dopasowanie całego słowa.

getent passwd

Polecenie, podobnie jak opisane wyżej cat /etc/passwd, zwróci listę lokalnych użytkowników wraz z podstawowymi informacjami (w identycznym formacie).

Samo polecenie getent (które można rozwinąć jako get entries) zwraca wpisy z baz danych przechowujących informacje konfiguracyjne, obsługiwanych przez interfejs Name Service Switch (NSS) biblioteki glibc (GNU C Library).

W systemach z rodziny Linux, dane konfiguracyjne są tradycyjnie przechowywane w plikach systemowych, takich jak /etc/passwd, /etc/group czy /etc/hosts. Jednakże z czasem pojawiła się również potrzeba pobierania danych z innych źródeł, jak usługi sieciowe typu DNS (Domain Name Service) lub NIS (Network Information Service).

Dlatego też do biblioteki glibc wprowadzono ujednolicony interfejs dostępu do różnych baz danych (pliki, usługi sieciowe), żeby uniknąć hardkodowania obsługi poszczególnych źródeł i jednocześnie ułatwić dodawanie kolejnych, bez konieczności wprowadzania zmian w samej bibliotece.

Lista obsługiwanych baz danych z ich nazwami, źródłami oraz kolejnością przeszukiwania, standardowo znajduje się w pliku /etc/nsswitch.conf.

getent passwd LOGIN
getent passwd LOGIN1 LOGIN2

Jeśli w bazie passwd szukamy konkretnego klucza, w tym przypadku użytkownika, to możemy podać login jako dodatkowy parametr. Polecenie umożliwia przekazanie wielu kluczy jednocześnie, co spowoduje zwrócenie rekordu dla każdego z nich (o ile taki istnieje).

Materiały źródłowe

O autorze

Łukasz Mieczkowski

Programista, który zainteresował się cyberbezpieczeństwem.

Dodaj komentarz

Cyberbezpieczeństwo okiem programisty

Łukasz Mieczkowski

Programista, który zainteresował się cyberbezpieczeństwem.

Kontakt

Zapraszam do kontaktu za pośrednictwem mediów społecznościowych.