Jak kontrolować dostęp do sudo w systemie Linux

Polecenie sudo pozwala na wykonywanie zadań w systemie Linux z uprawnieniami innych użytkowników, w tym superużytkownika, czyli roota. Dzięki sudo można precyzyjnie kontrolować, którzy użytkownicy mają dostęp do tych podwyższonych uprawnień, przyznając im pełen dostęp lub ograniczając jedynie do wybranych poleceń. W tym artykule pokażemy, jak to skonfigurować.

Rola sudo i uprawnienia roota

W Linuksie istnieje powszechne przekonanie, że „wszystko jest plikiem”. Choć nie jest to dosłowne, wiele elementów systemu operacyjnego, takich jak procesy, pliki, katalogi czy gniazda, komunikuje się z jądrem przez tzw. deskryptory plików. Ta zasada leży u podstaw projektowania systemów Linux i podobnych do Unix.

Koncept „wszystko jest plikiem” ma istotne znaczenie w kontekście uprawnień. Uprawnienia plików w Linuksie są kluczowe dla przydzielania praw użytkowników. Jako właściciel pliku lub katalogu możesz go edytować, zmieniać nazwę, przenosić lub usuwać. Możesz również ustalać uprawnienia, które pozwalają innym użytkownikom lub grupom na odczyt, modyfikację lub wykonywanie danego pliku. Wszyscy użytkownicy muszą przestrzegać tych reguł.

Natomiast superużytkownik, znany jako root, ma nieograniczone uprawnienia w systemie operacyjnym. Może wykonywać dowolne czynności w dowolnym momencie.

Wszyscy, którzy mają dostęp do hasła roota, mogą również korzystać z tych uprawnień, co stwarza ryzyko. Użytkownik root, nawet przypadkowo, może wprowadzić poważne zmiany w systemie. Dlatego najlepszą praktyką jest unikanie logowania się jako root. Zamiast tego lepiej zalogować się na standardowe konto użytkownika i korzystać z sudo do tymczasowego podnoszenia uprawnień, gdy zajdzie taka potrzeba, często ograniczając się do jednego polecenia.

Lista sudoers

Na komputerach z systemem Ubuntu 18.04.3, Manjaro 18.1.0 oraz Fedora 31, które były używane do napisania tego artykułu, sudo było już zainstalowane. To nic zaskakującego, ponieważ sudo funkcjonuje od lat 80. XX wieku i stało się standardowym narzędziem dla administratorów w niemal wszystkich dystrybucjach.

Podczas instalacji nowoczesnej dystrybucji, użytkownik tworzony w trakcie procesu instalacji zostaje dodany do listy sudoers. To są użytkownicy, którzy mają prawo używać komendy sudo. Jako posiadacz uprawnień sudo możesz dodawać innych użytkowników do tej listy.

Oczywiście, nadawanie pełnych uprawnień superużytkownika osobom, które ich nie potrzebują, jest nieodpowiedzialne. Lista sudoers pozwala na precyzyjne określenie, które polecenia mogą być wykonywane przez różnych użytkowników. Dzięki temu możesz umożliwić im wykonanie niezbędnych zadań bez nadawania nieograniczonego dostępu.

Wykonywanie polecenia jako inny użytkownik

W przeszłości sudo było znane jako „superużytkownik”, ponieważ pozwalało na wykonywanie różnych zadań. Obecnie jego funkcjonalność została rozszerzona, a sudo umożliwia również wykonywanie poleceń w imieniu innych użytkowników. Dlatego zmieniono nazwę na „użytkownik zastępczy”.

Aby użyć sudo do uruchomienia polecenia jako inny użytkownik, należy skorzystać z opcji -u (użytkownik). Przykład poniżej uruchamia polecenie whoami jako użytkownik mary. Użycie sudo bez opcji -u spowoduje, że polecenie zostanie wykonane jako root.

sudo -u mary whoami

Odpowiedź z polecenia whoami poinformuje nas, że aktualnie działasz jako użytkownik mary.

Dzięki sudo możesz zalogować się jako inny użytkownik, nie znając jego hasła. Będziesz musiał podać swoje hasło. W tym celu używamy opcji -i (login).

sudo -i -u mary
pwd
whoami
ls -hl
exit

Teraz jesteś zalogowany jako mary. Pliki konfiguracyjne konta użytkownika mary, takie jak „.bashrc”, „.bash_aliases” i „.profile”, są przetwarzane tak, jakby mary zalogowała się na swoje konto. Wiersz poleceń zmienia się, aby odzwierciedlić, że jesteś w sesji użytkownika mary. Polecenie pwd ponownie informuje, że znajdujesz się w katalogu domowym mary. Polecenie whoami potwierdza, że jesteś zalogowany jako mary. Pliki w katalogu należą do mary. Komenda exit zakończy sesję i powróci do normalnego konta użytkownika.

Edycja pliku sudoers

Aby dodać użytkowników do listy sudoers, konieczne jest edytowanie pliku sudoers. Ważne jest, aby robić to wyłącznie za pomocą polecenia visudo. Umożliwia to edytowanie pliku przez jednego użytkownika w danym czasie oraz przeprowadza automatyczne sprawdzanie składni podczas zapisywania zmian.

Jeśli wprowadzone zmiany nie będą poprawne, plik nie zostanie zapisany. Masz możliwość anulowania zmian, ponownego ich edytowania lub przymusowego zapisania, co jest bardzo ryzykowne. Nie powinieneś się na to decydować, ponieważ może to zablokować dostęp do sudo dla wszystkich użytkowników.

Chociaż edytujesz plik przy pomocy visudo, należy pamiętać, że nie jest to samodzielny edytor. Wywołuje on jeden z dostępnych edytorów do edytowania plików. Na systemach Manjaro i Ubuntu visudo uruchamia edytor nano, natomiast w Fedorze może to być edytor vim, który jest bardziej zaawansowany, ale mniej intuicyjny.

Jeśli wolisz używać nano w Fedorze, możesz to łatwo skonfigurować, instalując go za pomocą:

sudo dnf install nano

A potem za pomocą visudo można wywołać polecenie:

sudo EDITOR=nano visudo

To może być dobry pomysł na alias. Edytor nano otworzy plik sudoers do edycji.

Dodawanie użytkowników do grupy sudo

Po otwarciu pliku sudoers za pomocą visudo, przesuń się w dół, aż znajdziesz definicję grupy %sudo.

Linia ta powinna wyglądać tak:

%sudo ALL=(ALL:ALL) ALL

Znak procentu oznacza, że jest to definicja grupy, a nie użytkownika. W niektórych dystrybucjach linia ta może być skomentowana znakiem #. W takim przypadku usuń ten znak i zapisz plik.

Definicja grupy %sudo oznacza, że członkowie tej grupy mogą wykonywać wszystkie polecenia jako wszyscy użytkownicy i grupy na wszystkich hostach.

Aby przyznać komuś uprawnienia roota, wystarczy dodać go do grupy sudo.

Poznajmy Tomka i Marysię, którzy mają konta użytkowników tom i mary. Dodamy konto użytkownika tom do grupy sudo za pomocą polecenia usermod. Opcja -G wskazuje grupę, do której dodajemy użytkownika, a -a oznacza dodanie do istniejącej listy grup.

sudo usermod -a -G sudo tom

Polecenie groups pozwala sprawdzić, w jakich grupach znajduje się Mary.

groups

Konto użytkownika mary należy tylko do grupy mary.

Sprawdźmy teraz konto Tomka:

groups

Konto użytkownika tom znajduje się w grupach tom oraz sudo.

Spróbujmy wykonać polecenie wymagające uprawnień sudo na koncie Mary:

sudo less /etc/shadow

Mary nie ma uprawnień do przeglądania pliku /etc/shadow i otrzymuje ostrzeżenie o próbie użycia sudo bez pozwolenia. Sprawdźmy, jak poradzi sobie Tomek:

sudo less /etc/shadow

Po wprowadzeniu hasła, Tomek ma dostęp do pliku /etc/shadow.

Dzięki dodaniu go do grupy sudo, Tomek ma pełne prawa do używania sudo.

Ograniczanie uprawnień sudo dla użytkowników

Tomek ma pełne prawa do sudo, co oznacza, że może wykonywać wszystkie polecenia, które ma prawo wykonywać root. Może to być więcej, niż byśmy chcieli. Czasami istnieje potrzeba, aby użytkownik miał dostęp do określonych funkcji wymagających uprawnień roota, ale nie powinien mieć pełnego dostępu. Można to osiągnąć, dodając ich do pliku sudoers z ograniczonym zestawem poleceń.

Poznajmy Harry’ego, który nie ma jeszcze żadnych przywilejów sudo.

groups

Harry potrzebuje możliwości instalacji oprogramowania, ale nie chcemy przyznawać mu pełnych uprawnień. Uruchommy więc visudo:

sudo visudo

W pliku sudoers dodajemy wpis dla Harry’ego. Ponieważ jest to definicja użytkownika, nie musimy zaczynać od znaku procentu.

Wpis powinien wyglądać tak:

harry    ALL=/usr/bin/apt-get

Zwróć uwagę, że między „harry” a „ALL=” musi być tabulator.

To oznacza, że Harry może używać polecenia /usr/bin/apt-get na wszystkich hostach. Możemy przyznać mu dostęp do innych poleceń, dodając je po przecinku w tej samej linii.

Po dodaniu linii do pliku sudoers, użyj opcji sprawdzającej składnię:

sudo visudo -c

Jeśli wszystko jest w porządku, Harry powinien móc zainstalować oprogramowanie za pomocą apt-get, ale nie będzie miał dostępu do innych poleceń wymagających sudo.

sudo apt-get install finger

Harry zyskał odpowiednie uprawnienia sudo i może instalować oprogramowanie.

Co się stanie, jeśli Harry spróbuje użyć innego polecenia wymagającego sudo?

sudo shutdown now

Harry nie może wykonać tego polecenia. W ten sposób przyznaliśmy mu ograniczony dostęp. Może korzystać tylko z polecenia, które mu przydzieliliśmy.

Wykorzystanie aliasów użytkowników w sudoers

Aby przyznać Mary te same uprawnienia, możemy dodać wpis w pliku sudoers dla konta użytkownika mary, tak jak zrobiliśmy to dla Harry’ego. Możemy również użyć User_Alias, co jest bardziej eleganckim rozwiązaniem.

W pliku sudoers, alias użytkownika User_Alias zawiera listę nazw kont. Takie aliasy można później wykorzystać w definicjach, aby reprezentować grupę użytkowników. Dzięki temu, aby zmienić uprawnienia, wystarczy edytować tylko jedną linię.

Dodajmy alias użytkownika i użyjmy go w pliku sudoers.

sudo visudo

Scroll down in the file until you come to the User_Alias specification line.

Dodaj alias użytkownika:

User_Alias INSTALLERS = harry, mary

Każdy element jest oddzielony spacją. Logika wygląda następująco:

User_Alias: Informuje visudo, że będziemy definiować alias użytkownika.
INSTALLERS: To jest nazwa aliasu.
= harry, mary: Lista użytkowników, którzy mają być objęci tym aliasem.

Następnie edytujemy linię dodaną wcześniej dla konta użytkownika Harry:

harry    ALL=/usr/bin/apt-get

Zmień ją na:

INSTALLERS    ALL=/usr/bin/apt-get

To oznacza, że wszyscy użytkownicy definiowani przez alias INSTALLERS mogą uruchamiać polecenie apt-get. Przetestujmy to z Mary, która powinna móc zainstalować oprogramowanie.

sudo apt-get install colordiff

Mary zyskała możliwość instalacji oprogramowania, ponieważ należy do aliasu INSTALLERS, który ma odpowiednie uprawnienia.

Trzy szybkie sztuczki sudo

Jeśli zdarzy Ci się zapomnieć dodać sudo do polecenia, wpisz:

sudo !!

To powtórzy ostatnie polecenie, dodając sudo na początku.

Po użyciu sudo i podaniu hasła, nie musisz ponownie wprowadzać hasła przez następne 15 minut. Jeśli chcesz natychmiast „zapomnieć” o uwierzytelnieniu, użyj:

sudo -k

Ciekawi Cię, gdzie możesz zobaczyć nieudane próby użycia sudo? Wszystkie informacje zapisywane są w pliku /var/log/auth.log. Możesz go przeglądać za pomocą:

less /var/log/auth.log

Możesz zobaczyć wpisy dotyczące konta użytkownika Mary, która próbowała uruchomić polecenie shutdown jako root.

Z wielką mocą…

… Przyjdzie możliwość delegowania jej części innym użytkownikom. Teraz wiesz, jak selektywnie przyznawać uprawnienia innym.


newsblog.pl