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
Ten artykuł lub dział wymaga rozwinięcia.
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
.
- 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_EDITOR
VISUAL
i EDITOR
EDITOR
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
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
:
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
%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+v
Ctrl+g
, lub w nano, Alt+v
Ctrl+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
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.
- 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
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-l
Require 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
.
/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
Ten artykuł lub sekcja jest kandydatem do połączenia z #Configuration.
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 Defaults
requiretty
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
Ten artykuł lub sekcja jest kandydatem do połączenia z #Configuration.
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.