Sudo (Polski)

Sudo pozwala administratorowi systemu delegować uprawnienia, aby dać pewnym użytkownikom – lub grupom użytkowników – możliwość uruchamiania poleceń jako root lub inny użytkownik, zapewniając jednocześnie ścieżkę audytu poleceń i ich argumentów.

Sudo jest alternatywą dla su do uruchamiania poleceń jako root. W przeciwieństwie do su, które uruchamia powłokę roota, która pozwala wszystkim dalszym poleceniom na dostęp roota, sudo zamiast tego przyznaje tymczasową eskalację przywilejów pojedynczemu poleceniu. Poprzez umożliwienie dostępu do uprawnień roota tylko wtedy, gdy jest to potrzebne, użycie sudo zmniejsza prawdopodobieństwo, że literówka lub błąd w wywołanym poleceniu zrujnuje system.

Sudo może być również używane do uruchamiania poleceń jako inny użytkownik; dodatkowo, sudo rejestruje wszystkie polecenia i nieudane próby dostępu w celu audytu bezpieczeństwa.

Instalacja

Zainstaluj pakiet sudo.

Użytkowanie

Aby zacząć używać sudo jako nieuprzywilejowanego użytkownika, musi on być odpowiednio skonfigurowany. Zobacz #Konfiguracja.

Aby użyć sudo, po prostu przedrostek polecenia i jego argumenty z sudo i spacją:

$ sudo cmd

Na przykład, aby użyć pacman:

$ sudo pacman -Syu

Zobacz sudo(8) po więcej informacji.

Konfiguracja

Tango-view-fullscreen.pngTen artykuł lub dział wymaga rozwinięcia.Tango-view-fullscreen.png

Powód: Utwórz intro omawiające Defaults, być może z tabelą, która wymienia wspólne ustawienia (Omów w Talk:Sudo#)

Szkielet ustawień domyślnych

sudoers(5) § SUDOERS OPTIONS wymienia wszystkie opcje, które mogą być użyte z poleceniem Defaults w pliku /etc/sudoers.

Zobacz listę opcji (parsowaną z wersji 1.8.7) w formacie zoptymalizowanym dla sudoers.

Zobacz sudoers(5) po więcej informacji, takich jak konfiguracja limitu czasu hasła.

Widok bieżących ustawień

Uruchom sudo -ll aby wydrukować bieżącą konfigurację sudo, lub sudo -lU user dla konkretnego użytkownika.

Używanie visudo

Plikiem konfiguracyjnym dla sudo jest /etc/sudoers. Powinien on być zawsze edytowany za pomocą polecenia visudo(8). visudo blokuje plik sudoers, zapisuje edycje do pliku tymczasowego i sprawdza go pod kątem błędów składniowych przed skopiowaniem do /etc/sudoers.

Ostrzeżenie:

  • Niezbędne jest, aby sudoers był wolny od błędów składni! Każdy błąd sprawia, że sudo jest bezużyteczne. Zawsze edytuj go za pomocą visudo aby zapobiec błędom.
  • visudo(8) ostrzega, że konfiguracja visudo do honorowania zmiennych środowiskowych użytkownika dla wybranego edytora może być dziurą w bezpieczeństwie, ponieważ pozwala użytkownikowi z uprawnieniami visudo na uruchamianie dowolnych komend jako root bez logowania po prostu przez ustawienie tej zmiennej na coś innego.

Domyślnym edytorem dla visudo jest vi. Pakiet sudo jest skompilowany z --with-env-editor i honoruje użycie zmiennych SUDO_EDITORVISUAL i EDITOREDITOR nie jest używany, gdy VISUAL jest ustawiony.

Aby ustawić nano jako edytor visudo na czas trwania bieżącej sesji powłoki, wyeksportuj EDITOR=nano; aby użyć innego edytora tylko raz, po prostu ustaw zmienną przed wywołaniem visudo:

# EDITOR=nano visudo

Alternatywnie możesz edytować kopię pliku /etc/sudoers i sprawdzić go za pomocą visudo -c -f /copy/of/sudoers. Może się to przydać w przypadku, gdy chcemy obejść blokadę pliku za pomocą visudo.

Aby zmienić edytor na stałe, zobacz Zmienne środowiskowe#Per user. Aby zmienić edytor na stałe w całym systemie tylko dla visudo, dodaj poniższe do /etc/sudoers (zakładając, że nano jest twoim preferowanym edytorem):

# Reset environment by defaultDefaults env_reset# Set default EDITOR to nano, and do not allow visudo to use EDITOR/VISUAL.Defaults editor=/usr/bin/nano, !env_editor

Przykładowe wpisy

Aby umożliwić użytkownikowi uzyskanie pełnych przywilejów roota, gdy poprzedzi on polecenie znakiem sudo, dodaj następującą linię:

USER_NAME ALL=(ALL) ALL

Aby pozwolić użytkownikowi na uruchamianie wszystkich poleceń jako dowolny użytkownik, ale tylko na maszynie o nazwie hosta HOST_NAME:

USER_NAME HOST_NAME=(ALL) ALL

Aby zezwolić członkom grupy wheel na dostęp sudo:

%wheel ALL=(ALL) ALL
Porada: Podczas tworzenia nowych administratorów, często pożądane jest włączenie dostępu sudo dla grupy wheel i dodanie do niej użytkownika, ponieważ domyślnie Polkit traktuje członków grupy wheel jako administratorów. Jeśli użytkownik nie jest członkiem wheel, oprogramowanie używające Polkit może poprosić o uwierzytelnienie przy użyciu hasła roota zamiast hasła użytkownika.

Aby wyłączyć pytanie o hasło dla użytkownika USER_NAME:

Ostrzeżenie: Pozwoli to każdemu procesowi uruchomionemu z twoją nazwą użytkownika na użycie sudo bez pytania o pozwolenie.
Defaults:USER_NAME !authenticate

Wyłącz jawnie zdefiniowane polecenia tylko dla użytkownika USER_NAME na hoście HOST_NAME:

USER_NAME HOST_NAME=/usr/bin/halt,/usr/bin/poweroff,/usr/bin/reboot,/usr/bin/pacman -Syu
Uwaga: Najbardziej niestandardowa opcja powinna znaleźć się na końcu pliku, ponieważ późniejsze linie nadpisują poprzednie. W szczególności taka linia powinna znajdować się po linii %wheel jeśli użytkownik jest w tej grupie.

Wykonywanie jawnie zdefiniowanych poleceń tylko dla użytkownika USER_NAME na hoście HOST_NAME bez hasła:

USER_NAME HOST_NAME= NOPASSWD: /usr/bin/halt,/usr/bin/poweroff,/usr/bin/reboot,/usr/bin/pacman -Syu

Szczegółowy sudoers przykład jest dostępny pod adresem /usr/share/doc/sudo/examples/sudoers. W przeciwnym razie, zobacz sudoers(5) po szczegółowe informacje.

Domyślne uprawnienia do plików

Właściciel i grupa dla pliku sudoers muszą mieć wartość 0. Uprawnienia do pliku muszą być ustawione na 0440. Te uprawnienia są ustawione domyślnie, ale jeśli przypadkowo je zmienisz, powinny być natychmiast zmienione z powrotem lub sudo nie powiedzie się.

# chown -c root:root /etc/sudoers# chmod -c 0440 /etc/sudoers

Wskazówki i sztuczki

Disable password prompt timeout

Częstą irytacją jest długo działający proces, który działa w terminalu w tle, gdzieś, gdzie działa z normalnymi uprawnieniami i podnosi się tylko w razie potrzeby. Prowadzi to do monitu o hasło sudo, który pozostaje niezauważony i wygasa, w którym to momencie proces umiera, a wykonana praca zostaje utracona lub, w najlepszym wypadku, zbuforowana. Powszechną radą jest włączenie bezhasłowego sudo, lub wydłużenie czasu pamiętania hasła przez sudo. Oba te rozwiązania mają negatywny wpływ na bezpieczeństwo. Limit czasu zachęty może być również wyłączony, a ponieważ nie służy to żadnemu rozsądnemu celowi bezpieczeństwa, powinno być rozwiązaniem tutaj:

Defaults passwd_timeout=0

Dodaj dzwonek terminala do monitu o hasło

Aby zwrócić uwagę na monit sudo w terminalu w tle, użytkownicy mogą po prostu sprawić, że będzie on echem znaku dzwonka:

Defaults passprompt="^G password for %p: "

Zauważ, że ^G jest dosłownym znakiem dzwonka. Np. w vimie wstawiamy używając sekwencji Ctrl+vCtrl+g, lub w nano, Alt+vCtrl+g.

Przekazywanie aliasów

Jeśli używasz wielu aliasów, mogłeś zauważyć, że nie są one przenoszone na konto roota, gdy używasz sudo. Istnieje jednak prosty sposób, aby sprawić, by działały. Po prostu dodaj następujące elementy do swoich ~/.bashrc lub /etc/bash.bashrc:

alias sudo='sudo '

Disable per-terminal sudo

Ostrzeżenie: Pozwoli to dowolnemu procesowi użyć twojej sesji sudo.

Jeśli denerwują cię domyślne ustawienia sudo, które wymagają podawania hasła za każdym razem, gdy otwierasz nowy terminal, ustaw timestamp_type na global:

Defaults timestamp_type=global

Zmniejsz liczbę razy, kiedy musisz wpisywać hasło

Jeśli denerwuje Cię, że musisz ponownie wpisywać hasło co 5 minut (domyślnie), możesz to zmienić, ustawiając dłuższą wartość dla timestamp_timeout (w minutach):

Defaults timestamp_timeout=10

Jeśli używasz wielu poleceń sudo pod rząd, bardziej logiczne jest odświeżanie limitu czasu za każdym razem, gdy używasz sudo, niż zwiększanie timestamp_timeout. Odświeżanie limitu czasu można wykonać za pomocą sudo -v (podczas gdy sudo -K odwołuje natychmiast).

Możesz chcieć to zautomatyzować, dodając następujące elementy do swojego .bashrc:

alias sudo='sudo -v; sudo '

Możliwe jest również użycie funkcji bash; aby uzyskać więcej szczegółów, zobacz stackexchange.

Zmienne środowiskowe

Jeśli masz dużo zmiennych środowiskowych, lub eksportujesz swoje ustawienia proxy przez export http_proxy="...", podczas używania sudo te zmienne nie są przekazywane do konta root, chyba że uruchomisz sudo z opcją -E.

$ sudo -E pacman -Syu

Zalecanym sposobem zachowania zmiennych środowiskowych jest dołączenie ich do env_keep:

/etc/sudoers
Defaults env_keep += "ftp_proxy http_proxy https_proxy no_proxy"

Root. password

Użytkownicy mogą skonfigurować sudo, aby pytał o hasło roota zamiast hasła użytkownika, dodając targetpw (docelowy użytkownik, defaults to root) lub rootpw do linii Defaults w /etc/sudoers:

Defaults targetpw

Aby zapobiec ujawnieniu hasła roota użytkownikom, możesz ograniczyć to do określonej grupy:

Defaults:%wheel targetpw%wheel ALL=(ALL) ALL

Disable root login

Użytkownicy mogą chcieć wyłączyć logowanie roota. Bez roota atakujący muszą najpierw odgadnąć nazwę użytkownika skonfigurowanego jako sudoer, a także hasło użytkownika. Zobacz na przykład OpenSSH#Deny.

Ostrzeżenie:

  • Bądź ostrożny, możesz zablokować się przez wyłączenie logowania roota. Sudo nie jest instalowane automatycznie, a jego domyślna konfiguracja nie pozwala ani na dostęp bez hasła do roota, ani na dostęp z własnym hasłem. Upewnij się, że użytkownik jest prawidłowo skonfigurowany jako sudoer przed wyłączeniem konta roota!
  • Jeśli zmieniłeś swój plik sudoers, aby używać rootpw jako domyślnego, to nie wyłączaj logowania roota za pomocą żadnego z poniższych poleceń!
  • Jeśli jesteś już zablokowany, zobacz Odzyskiwanie hasła, aby uzyskać pomoc.

Konto może być zablokowane przez passwd:

# passwd -l root

Podobne polecenie odblokowuje roota.

$ sudo passwd -u root

Alternatywnie, edytuj /etc/shadow i zamień zaszyfrowane hasło roota na „!”:

root:!:12345::::::

Aby umożliwić ponowne logowanie roota:

$ sudo passwd root
Podpowiedź: Aby dostać się do interaktywnego monitu roota, nawet po wyłączeniu konta roota, użyj sudo -i

kdesu

kdesu może być używany pod KDE do uruchamiania aplikacji GUI z uprawnieniami roota. Jest możliwe, że domyślnie kdesu będzie próbował użyć su, nawet jeśli konto roota jest wyłączone. Na szczęście można powiedzieć kdesu, aby używał sudo zamiast su. Utwórz/edytuj plik ~/.config/kdesurc:

super-user-command=sudo

albo użyj następującego polecenia:

$ kwriteconfig5 --file kdesurc --group super-user-command --key super-user-command sudo

Alternatywnie zainstaluj kdesudoAUR, który ma dodatkową zaletę w postaci uzupełniania tabulatorów w następujących poleceniach.

Harden with sudo example

Powiedzmy, że tworzysz 3 użytkowników: admin, devel, i joe. Użytkownik „admin” jest używany do journalctl, systemctl, mount, kill, i iptables; „devel” jest używany do instalowania pakietów i edycji plików konfiguracyjnych; a „joe” jest użytkownikiem, z którym się logujesz. Aby pozwolić „joe” na restartowanie, zamykanie i używanie netctl, wykonalibyśmy następujące czynności:

Edit /etc/pam.d/su i /etc/pam.d/su-lRequire user be in the wheel group, but do not put anyone in it.

#%PAM-1.0auth sufficient pam_rootok.so# Uncomment the following line to implicitly trust users in the "wheel" group.#auth sufficient pam_wheel.so trust use_uid# Uncomment the following line to require a user to be in the "wheel" group.auth required pam_wheel.so use_uidauth required pam_unix.soaccount required pam_unix.sosession required pam_unix.so

Limit SSH login to the 'ssh' group. Tylko „joe” będzie należał do tej grupy.

groupadd -r sshgpasswd -a joe sshecho 'AllowGroups ssh' >> /etc/ssh/sshd_config

Restart sshd.service.

Dodaj użytkowników do innych grup.

for g in power network ;do ;gpasswd -a joe $g ;donefor g in network power storage ;do ;gpasswd -a admin $g ;done

Ustaw uprawnienia na configach, aby devel mógł je edytować.

chown -R devel:root /etc/{http,openvpn,cups,zsh,vim,screenrc}
Cmnd_Alias POWER = /usr/bin/shutdown -h now, /usr/bin/halt, /usr/bin/poweroff, /usr/bin/rebootCmnd_Alias STORAGE = /usr/bin/mount -o nosuid\,nodev\,noexec, /usr/bin/umountCmnd_Alias SYSTEMD = /usr/bin/journalctl, /usr/bin/systemctlCmnd_Alias KILL = /usr/bin/kill, /usr/bin/killallCmnd_Alias PKGMAN = /usr/bin/pacmanCmnd_Alias NETWORK = /usr/bin/netctlCmnd_Alias FIREWALL = /usr/bin/iptables, /usr/bin/ip6tablesCmnd_Alias SHELL = /usr/bin/zsh, /usr/bin/bash%power ALL = (root) NOPASSWD: POWER%network ALL = (root) NETWORK%storage ALL = (root) STORAGEroot ALL = (ALL) ALLadmin ALL = (root) SYSTEMD, KILL, FIREWALLdevel ALL = (root) PKGMANjoe ALL = (devel) SHELL, (admin) SHELL 

Przy takiej konfiguracji, prawie nigdy nie będziesz musiał logować się jako użytkownik Root.

„joe” może połączyć się ze swoim domowym WiFi.

sudo netctl start homesudo poweroff

„joe” nie może używać netctl jak każdy inny użytkownik.

sudo -u admin -- netctl start home

Kiedy „joe” potrzebuje użyć journalctl lub zabić uciekający proces, może przełączyć się na tego użytkownika.

sudo -i -u develsudo -i -u admin

Ale „joe” nie może przełączyć się na użytkownika root.

sudo -i -u root

Jeśli „joe” chce rozpocząć sesję gnu-screen jako admin, może to zrobić w ten sposób:

sudo -i -u adminadmin% chown admin:tty `echo $TTY`admin% screen

Konfiguruje sudo używając plików drop-in w /etc/sudoers.d

sudo parsuje pliki znajdujące się w katalogu /etc/sudoers.d/. Oznacza to, że zamiast edytować /etc/sudoers, możesz zmienić ustawienia w samodzielnych plikach i upuścić je w tym katalogu. Ma to dwie zalety:

  • Nie ma potrzeby edytowania pliku sudoers.pacnew;
  • Jeśli jest problem z nowym wpisem, możesz usunąć obraźliwy plik zamiast edytować /etc/sudoers (ale zobacz ostrzeżenie poniżej).

Format dla wpisów w tych plikach drop-in jest taki sam jak dla samego /etc/sudoers. Aby edytować je bezpośrednio, użyj visudo -f /etc/sudoers.d/somefile. Zobacz sudoers(5) § Including other files from within sudoers by poznać szczegóły.

Pliki w katalogu /etc/sudoers.d/ są parsowane w porządku leksykograficznym, nazwy plików zawierające . lub ~ są pomijane. Aby uniknąć problemów z sortowaniem, nazwy plików powinny zaczynać się od dwóch cyfr, np. 01_foo.

Uwaga: Kolejność wpisów w plikach drop-in jest ważna: upewnij się, że oświadczenia nie nadpisują się same.
Ostrzeżenie: Pliki w /etc/sudoers.d/ są tak samo kruche jak sam /etc/sudoers: każdy niewłaściwie sformatowany plik uniemożliwi działanie sudo. Stąd, z tego samego powodu, zdecydowanie zaleca się używanie visudo

Edycja plików

sudo -e lub sudoedit pozwala edytować plik jako inny użytkownik, podczas gdy nadal uruchamiamy edytor tekstu jako użytkownik.

Jest to szczególnie przydatne do edycji plików jako root bez podnoszenia przywilejów edytora tekstu, po więcej szczegółów przeczytaj sudo(8) § e.

Zauważ, że możesz ustawić edytor na dowolny program, więc na przykład można użyć meld do zarządzania plikami pacnew:

$ SUDO_EDITOR=meld sudo -e /etc/file{,.pacnew}

Włącz obelgi

Użytkownicy mogą włączyć insults easter egg w sudo przez dodanie następującej linii w pliku sudoers z visudo.

Po wprowadzeniu nieprawidłowego hasła spowoduje to zastąpienie wiadomości Sorry, try again. humorystycznymi obelgami.

/etc/sudoers
Defaults insults

Rozwiązywanie problemów

Problem z SSH bez TTY

Merge-arrows-2.pngTen artykuł lub sekcja jest kandydatem do połączenia z #Configuration.Merge-arrows-2.png

Uwagi: proszę użyć drugiego argumentu szablonu, aby podać bardziej szczegółowe wskazówki. (Omów w Talk:Sudo#)

SSH nie przydziela domyślnie tty podczas uruchamiania zdalnego polecenia. Bez przydzielonego tty, sudo nie może zapobiec wyświetlaniu hasła. Możesz użyć opcji ssh’a -t, aby zmusić go do przydzielenia tty.

Opcja Defaultsrequiretty pozwala użytkownikowi uruchomić sudo tylko wtedy, gdy ma tty.

# Disable "ssh hostname sudo <cmd>", because it will show the password in clear text. You have to run "ssh -t hostname sudo <cmd>".##Defaults requiretty

Permissive umask

Merge-arrows-2.pngTen artykuł lub sekcja jest kandydatem do połączenia z #Configuration.Merge-arrows-2.png

Uwagi: proszę użyć drugiego argumentu szablonu, aby podać bardziej szczegółowe wskazówki. (Omów w Talk:Sudo#)

Sudo połączy wartość umask użytkownika z własną umask (która domyślnie wynosi 0022). Zapobiega to tworzeniu przez sudo plików z bardziej otwartymi uprawnieniami niż pozwala na to umask użytkownika. Choć jest to rozsądne domyślne rozwiązanie, jeśli nie używamy niestandardowej umaski, może to prowadzić do sytuacji, w których narzędzie uruchamiane przez sudo może tworzyć pliki z innymi uprawnieniami niż gdyby było uruchamiane bezpośrednio przez roota. Jeśli z tego powodu pojawią się błędy, sudo zapewnia środki do naprawienia umaski, nawet jeśli pożądana umaska jest bardziej permisywna niż umaska, którą określił użytkownik. Dodanie tego (używając visudo) nadpisze domyślne zachowanie sudo:

Defaults umask = 0022Defaults umask_override

To ustawia umask sudo na domyślną umask roota (0022) i nadpisuje domyślne zachowanie, zawsze używając wskazanej umask niezależnie od tego, jaką umask ustawił użytkownik.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *