Sudoers, nadawanie uprawnień zwykłym użytkownikom

Uprawnienia użytkowników są jednym z fundamentalnych paradygmatów w systemach Linux. Zwykli użytkownicy mają ograniczone uprawnienia, aby zredukować ich wpływ na działanie systemu i ograniczyć go do ich własnego środowiska, po którym mogą się poruszać.

Użytkownikiem specjalnym z punktu widzenia całego systemu jest super- użytkownik zwany root-em. Root może wykonywać wszystkie polecenia, chyba że charakter aplikacji na to nie pozwala (np. VLC), ponieważ mógłby zostać uszkodzony sprzęt.

Konto roota ma charakterystyczny uuid:
root@szymon:/home/szymon# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash

Poniżej kilka słów o tym, w jaki sposób można nadawać użytkownikom uprawnienia do wykonywania niektórych poleceń. Do tego używam systemu Ubuntu 14.04.

Aby zalogować się na konto roota wydajemy polecenie:

sudo su

Aby wyjść z konsoli roota i wrócić do naszego użytkownika wydajemy polecenie:

exit

Aby wykonywać polecenia z uprawnienieniami super-użytkownika, wydajemy polecenie:

sudo polecenie

Następnie zostaniemy poproszeni o hasło. Przez kolejne 5 minut będziemy mogli wykonywać polecenia na prawach roota bez podawania hasła. Aby uniknąć sytuacji, gdzie polecenie wymaga użycia uprawnień roota, możemy dodać nowego użytkownika i polecenie do pliku konfuguracyjnego.

Aby to zrobić, trzeba wyedytować plik /etc/sudoers. Należy to zrobić za pomocą polecenia:

sudo visudo

Dzięki temu unikniemy kłopotów związanych ze złą składnią, którą waliduje przed zapisem program visudo.

Po otwarciu pliku poleceniem visudo, pojawi nam się w systemie Ubuntu domyślny edytor tekstowy w terminalu nano. W innych systemach może otworzyć nam się plik w vi.

Aby zmienić edytor możemy wydać polecenie:

sudo update-alternatives --config editor

Będziemy wtedy mogli wybrać jeden z alternatywnych edytorów, znajdujących się w /usr/bin/nazwaEditora.

Są 3 dostępne alternatywy dla editor (dostarczające /usr/bin/editor):

Wybór Ścieżka Priorytet Status ------------------------------------------------------------ * 0 /bin/nano 40 tryb auto 1 /bin/ed -100 tryb ręczny 2 /bin/nano 40 tryb ręczny 3 /usr/bin/vim.tiny 10 tryb ręczny

W CentOS, możesz dokonać zmiany w pliku ~/.bashrc:
export EDITOR=/path/to/nazwaEditora

A następnie, wydając polecenie:

. ~/.bashrc

Po ustawieniu wygodnego dla nas edytora, możemy wydać polecenie:

sudo visudo

Domyślna konfiguracja znajdująca się w pliku sudoers wygląda w następujący sposób (bez komentarzy):

Defaults env_reset Defaults mail_badpass Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" root ALL=(ALL:ALL) ALL %admin ALL=(ALL) ALL %sudo ALL=(ALL:ALL) ALL # See sudoers(5) for more information on "#include" directives: #includedir /etc/sudoers.d

Pierwsza linijka „Defaults env_reset”, czyści wszystkie zmienne użytkownika, ze względów bezpieczeństwa, z sesji użytkownika sudo.

Następna linijka – rozpoczynająca się „Defaults secure_path=…” – ustawia ścieżkę, gdzie można odnaleźć aplikacje, które są używane w systemie przy wydawaniu polecenia sudo.

Następne liniki odnoszą się do uprawnień użytkowników:

szymon ALL=(ALL:ALL) ALL

Nazwa szymon odnosi się do użytkownika, którego reguły będą dotyczyć. Pierwsze ALL odnosi się do hosta, którego reguła dotyczy; następne „ALL” (pierwsze w nawiasie) odnosi się do możliwości wykonywania poleceń przez użytkownika i kolejne do grupy.
Ostatnie all odnosi się do poleceń – w tym przypadku użytkownik szymon może wszystko wykonywać bez użycia polecenia sudo. Nie jest to jednak zalecane.

Ostatnie dwie linijki są podobne do uprawnień użytkownika, odnoszą się jednak do grup użytkowników i są poprzedzone %.:

%admin ALL=(ALL) ALL

W przypadku powyższym grupa administatorów może wykonywać każde polecenie przez każdego użytkownika na każdym hoście.

Aby wygenerować aliasy użytkowników należących do grup, które ułatwią nam pisanie reguł, możemy je utworzyć w poniższy sposób. Należy pamiętać przy tym, że nazwy grup powinny zaczynać się wielkimi literami:

User_Alias GROUPONE = szymon, maria, marta User_Alias NINJA = enrike, szymon, marek

Aby umożliwić wykonywanie restartowania apache’a (usługi) określonej grupie możemy dopisać regułę dla grupy NINJA w następujący sposób:

NINJA ALL = /usr/bin/apache restart

Możemy również zezwolić użytkownikom na wykonywanie kilku poleceń, za pomocą aliasu dla poleceń.

Cmnd_Alias POWER = /sbin/shutdown, /sbin/halt, /sbin/reboot, /sbin/restart NINJA ALL = POWER

W poniższym poleceniu możemy umożliwić grupie pierwszej wykonywać polecenia jako użytkownik „www-data” lub „apache”:

Runas_Alias WEB = www-data, apache GROUPONE ALL = (WEB) ALL

Jeżeli chcemy, aby użytkownik mógł wykonać dane polecenie bez potrzeby wprowadzania przez niego hasła, możemy utworzyć następującą regułę:

GROUPONE ALL = NOPASSWD: /usr/bin/rm

NOPASSWD oznacza, że nie będzie wydawana prośba o podanie hasła. Jest to bardzo przydatne przy pisaniu skryptów, ponieważ nie przerywa ich wykonywania.
Antagonizmem do NOPASSWD jest PASSWD, które domyślnie wymusza podanie hasła.

GROUPTWO ALL = NOPASSWD: /usr/bin/updatedb, PASSWD: /bin/kill

Kolejnym ważnym poleceniem jest NOEXEC, które ochrania przed niebezpiecznym zachowaniem wykonania niektórych programów.

Np polecenie „less” może spowodować działanie innych programów:

szymon ALL = NOEXEC: /usr/bin/less

Jest jeszcze kilka interesujących poleceń, które można wykorzystać przy nadawaniu uprawnień grupom. Jeżeli mamy dodanego użytkownika lub grupę w pliku konfiguracyjnym, możemy – dodając flagę -u dla użytkownika lub -g dla grupy – wydać polecenie jako określony użytkownik/grupa:

sudo -u run_as_user polecenie sudo -g run_as_group polecenie

Dla wygody domyślnie sudo zapisuje uwierzytelnienie na pewien okres czasu, oznacza to, że nie trzeba podawać polecenia przez pewien okres czasu.

Należy o tym pamiętać i dla celów bezpieczeństwa możemy usunąć zegar opóźniający poleceniem:

sudo -k

Aby odłożyć zaś wymuszenie wpisania hasła możemy posłużyć się poleceniem:

sudo -v

By sprawdzić, jakie mamy uprawnienia w chwili obecnej, możemy wydać polecenie:

szymon@szymon:~$ sudo -l Pasujące wpisy Defaults dla szymon na szymon: env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin Użytkownik szymon może uruchamiać na szymon następujące polecenia: [cce_bash width="100%" no_cc="true"] (ALL : ALL) ALL

Dzięki poleceniu mamy wylistowane wszystkie reguły dla użytkownika z pliku /etc/sudoers. Dzięki temu będziesz mógł się dowiedzieć co możesz zrobić jako użytkownik, wydając polecenie sudo.

Niekiedy zdarza się, że wydajesz jedno i to samo polecenie polecenie, i zapominasz wpisać sudo. W takiej sytuacji, jeżeli używasz tego samego ostatniego polecenia, możesz użyć skrótu:

szymon@szymon:~$ sudo !! sudo sudo -l Pasujące wpisy Defaults dla root na szymon: env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin Użytkownik root może uruchamiać na szymon następujące polecenia: (ALL : ALL) ALL

Jeżeli chcesz dla zabawy, aby po każdym wpisaniu hasła były generowane śmieszne komunikaty, możesz dopisać w pliku następującą konfiguracje:

sudo visudo Defaults insults

This will cause sudo to return a silly insult when a user types in an incorrect password for sudo. We’ll use sudo -k to clear the previous sudo cached password to try it out:

szymon@szymon:~$ sudo -k szymon@szymon:~$ sudo ls szymon@szymon:~$ sudo su [sudo] hasło użytkownika szymon: I feel much better now. [sudo] hasło użytkownika szymon: I don't wish to know that.

Możemy też wymusić, aby dany użytkownik nigdy nie zapamiętał hasła użytkownika w pliku konfiguracyjnym:

Defaults:użytkownik timestamp_timeout=0

Na sam koniec należy wspomnieć, że ze względów bezpieczeństwa powinieneś się dwa razy zastanowić, jakie uprawnienia nadejesz użytkownikom, a także nie powinieneś nadawać zwykłym użytkownikom uprawnień administracyjnych.