Sudo geeft een systeembeheerder de mogelijkheid om bepaalde gebruikers – of groepen gebruikers – de bevoegdheid te geven om commando’s als root of een andere gebruiker uit te voeren, terwijl er een audit trail van de commando’s en hun argumenten wordt bijgehouden.
Sudo is een alternatief voor su om commando’s als root uit te voeren. In tegenstelling tot su, dat een root shell start die alle verdere commando’s root toegang geeft, geeft sudo in plaats daarvan tijdelijke privilege escalatie aan een enkel commando. Door alleen root privileges te geven wanneer dat nodig is, vermindert het gebruik van sudo de kans dat een typfout of een bug in een aangeroepen commando het systeem ruineert.
Sudo kan ook gebruikt worden om commando’s als andere gebruikers uit te voeren; bovendien logt sudo alle commando’s en mislukte toegangspogingen voor security auditing.
Installatie
Installeer het sudo pakket.
Gebruik
Om sudo
te gaan gebruiken als een niet-bevoorrechte gebruiker, moet het goed geconfigureerd zijn. Zie #Configuratie.
Om sudo te gebruiken, voorzie je een commando en zijn argumenten met sudo
en een spatie:
$ sudo cmd
Voorbeeld, om pacman te gebruiken:
$ sudo pacman -Syu
Zie sudo(8) voor meer informatie.
Configuratie
Dit artikel of deze sectie heeft uitbreiding nodig.
Defaults
wordt besproken, misschien met een tabel met een lijst van veelgebruikte instellingen (Bespreek in Talk:Sudo#)Defaults skelet
sudoers(5) § SUDOERS OPTIONS somt alle opties op die gebruikt kunnen worden met het Defaults
commando in het bestand.
Zie voor een lijst van opties (geparsed uit de versie 1.8.7 broncode) in een formaat geoptimaliseerd voor sudoers
.
Zie sudoers(5) voor meer informatie, zoals het configureren van de wachtwoord timeout.
Bekijk huidige instellingen
Run sudo -ll
om de huidige sudo configuratie uit te printen, of sudo -lU user
voor een specifieke gebruiker.
Gebruik visudo
Het configuratie bestand voor sudo is /etc/sudoers
. Het moet altijd bewerkt worden met het visudo(8) commando. visudo vergrendelt het sudoers
bestand, slaat bewerkingen op in een tijdelijk bestand, en controleert het op syntax fouten voordat het gekopieerd wordt naar /etc/sudoers
.
- Het is noodzakelijk dat
sudoers
vrij is van syntax fouten! Elke fout maakt sudo onbruikbaar. Bewerk het altijd met visudo om fouten te voorkomen. - visudo(8) waarschuwt dat het configureren van visudo om de gebruikers omgevingsvariabelen voor hun editor naar keuze te honoreren een veiligheidsgat kan zijn, omdat het de gebruiker met visudo privileges toestaat om willekeurige commando’s als root uit te voeren zonder te loggen, simpelweg door die variabele op iets anders te zetten.
De standaard editor voor visudo is vi. Het sudo pakket is gecompileerd met --with-env-editor
en eert het gebruik van de SUDO_EDITOR
VISUAL
en EDITOR
variabelen. EDITOR
wordt niet gebruikt wanneer VISUAL
is ingesteld.
Om nano als de visudo editor in te stellen voor de duur van de huidige shell sessie, exporteer EDITOR=nano
; om slechts eenmaal een andere editor te gebruiken, stel je eenvoudigweg de variabele in voordat je visudo aanroept:
# EDITOR=nano visudo
Als alternatief kunt u een kopie van het /etc/sudoers
bestand bewerken en het controleren met visudo -c -f /copy/of/sudoers
. Dit kan van pas komen in het geval u het vergrendelen van het bestand met visudo wilt omzeilen.
Om de editor permanent te wijzigen, zie Omgevingsvariabelen#Per gebruiker. Om de gewenste editor permanent systeembreed te wijzigen, alleen voor visudo, voeg je het volgende toe aan /etc/sudoers
(ervan uitgaande dat nano je voorkeurseditor is):
# 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
Voorbeeldingangen
Om een gebruiker toe te staan volledige root-privileges te krijgen wanneer hij een commando laat voorafgaan door sudo
, voegt u de volgende regel toe:
USER_NAME ALL=(ALL) ALL
Om een gebruiker toe te staan alle commando’s uit te voeren als een willekeurige gebruiker, maar alleen op de machine met hostnaam HOST_NAME
:
USER_NAME HOST_NAME=(ALL) ALL
Om leden van groep wheel
sudo toegang te geven:
%wheel ALL=(ALL) ALL
wheel
groep en de gebruiker daaraan toe te voegen, omdat Polkit standaard de leden van de wheel
groep behandelt als beheerders. Als de gebruiker geen lid is van wheel
, kan software die Polkit gebruikt vragen om te authenticeren met het root-wachtwoord in plaats van het gebruikerswachtwoord.Om het vragen om een wachtwoord voor gebruiker USER_NAME
uit te schakelen:
Defaults:USER_NAME !authenticate
Uitdrukkelijk gedefinieerde commando’s alleen inschakelen voor gebruiker USER_NAME
op host HOST_NAME
:
USER_NAME HOST_NAME=/usr/bin/halt,/usr/bin/poweroff,/usr/bin/reboot,/usr/bin/pacman -Syu
%wheel
moeten staan als uw gebruiker in deze groep zit.Sluit expliciet gedefinieerde commando’s alleen in voor gebruiker USER_NAME
op host HOST_NAME
zonder wachtwoord:
USER_NAME HOST_NAME= NOPASSWD: /usr/bin/halt,/usr/bin/poweroff,/usr/bin/reboot,/usr/bin/pacman -Syu
Een gedetailleerd sudoers
voorbeeld is beschikbaar op /usr/share/doc/sudo/examples/sudoers
. Zie anders sudoers(5) voor gedetailleerde informatie.
Sudoers standaard bestandspermissies
De eigenaar en groep voor het sudoers
bestand moeten beide 0 zijn. De bestandspermissies moeten ingesteld zijn op 0440. Deze permissies zijn standaard ingesteld, maar als je ze per ongeluk veranderd, moeten ze onmiddellijk terug veranderd worden of sudo zal falen.
# chown -c root:root /etc/sudoers# chmod -c 0440 /etc/sudoers
Tips en trucs
Wachtwoord prompt timeout uitschakelen
Een veel voorkomende ergernis is een lang lopend proces dat ergens op een achtergrond terminal draait die met normale permissies draait en alleen lift als het nodig is. Dit leidt tot een sudo wachtwoord prompt die onopgemerkt blijft en de timeout uitschakelt, op welk punt het proces sterft en het gedane werk verloren gaat of, in het beste geval, gecached wordt. Veel gebruikt advies is om sudo zonder wachtwoord in te schakelen, of de timeout van sudo die een wachtwoord onthoudt te verlengen. Beide hebben negatieve veiligheidsimplicaties. De prompt timeout kan ook uitgeschakeld worden en aangezien dat geen enkel redelijk veiligheids doel dient zou dat hier de oplossing moeten zijn:
Defaults passwd_timeout=0
Toevoegen terminal bel aan de wachtwoord prompt
Om de aandacht te vestigen op een sudo prompt in een achtergrond terminal, kunnen gebruikers het simpelweg een bel karakter laten echoën:
Defaults passprompt="^G password for %p: "
Noteer de ^G
is een letterlijk bel karakter. Bijv. in vim, invoegen met de sequentie Ctrl+v
Ctrl+g
, of in nano, Alt+v
Ctrl+g
.
Passeren van aliassen
Als je veel aliassen gebruikt, heb je misschien gemerkt dat ze niet overgaan naar de root account als je sudo gebruikt. Er is echter een makkelijke manier om ze te laten werken. Voeg gewoon het volgende toe aan je ~/.bashrc
of /etc/bash.bashrc
:
alias sudo='sudo '
Sudo per-terminal uitschakelen
Als je je ergert aan sudo’s standaards die vereisen dat je elke keer je wachtwoord moet invoeren als je een nieuwe terminal opent, stel dan timestamp_type
in op global
:
Defaults timestamp_type=global
Verminder het aantal keren dat u een wachtwoord moet intypen
Als u het vervelend vindt dat u uw wachtwoord elke 5 minuten opnieuw moet invoeren (standaard), kunt u dit veranderen door een langere waarde in te stellen voor timestamp_timeout
(in minuten):
Defaults timestamp_timeout=10
Als je veel sudo commando’s achter elkaar gebruikt, is het logischer om de timeout te verversen elke keer dat je sudo gebruikt dan timestamp_timeout
te verhogen. Het verversen van de timeout kan gedaan worden met sudo -v
(terwijl sudo -K
direct intrekt).
U zou dit kunnen automatiseren door het volgende aan uw .bashrc
toe te voegen:
alias sudo='sudo -v; sudo '
Het is ook mogelijk om een bash functie te gebruiken; voor meer details zie stackexchange.
Omgevingsvariabelen
Als je veel omgevingsvariabelen hebt, of je exporteert je proxy instellingen via export http_proxy="..."
, bij gebruik van sudo worden deze variabelen niet doorgegeven aan de root account tenzij je sudo uitvoert met de -E
optie.
$ sudo -E pacman -Syu
De aanbevolen manier om omgevingsvariabelen te behouden is om ze toe te voegen aan env_keep
:
/etc/sudoers
Defaults env_keep += "ftp_proxy http_proxy https_proxy no_proxy"
Root password
Gebruikers kunnen sudo configureren om het root wachtwoord te vragen in plaats van het gebruikerswachtwoord door targetpw
toe te voegen (doel gebruiker, standaard is dit root) of rootpw
aan de Defaults regel in /etc/sudoers
:
Defaults targetpw
Om te voorkomen dat uw root wachtwoord aan gebruikers wordt blootgesteld, kunt u dit beperken tot een specifieke groep:
Defaults:%wheel targetpw%wheel ALL=(ALL) ALL
Root login uitschakelen
Gebruikers willen misschien de root login uitschakelen. Zonder root moeten aanvallers eerst een gebruikersnaam raden die geconfigureerd is als sudoer, en ook het gebruikerswachtwoord. Zie bijvoorbeeld OpenSSH#Deny.
- Wees voorzichtig, je kan jezelf buitensluiten door root login uit te schakelen. Sudo wordt niet automatisch geïnstalleerd en de standaardconfiguratie staat noch wachtwoordloze root-toegang noch root-toegang met uw eigen wachtwoord toe. Zorg ervoor dat een gebruiker goed is geconfigureerd als sudoer voordat je het root account uitschakelt!
- Als je je sudoers bestand hebt veranderd om rootpw als standaard te gebruiken, schakel dan root login niet uit met een van de volgende commando’s!
- Als je al bent buitengesloten, zie Wachtwoord herstel voor hulp.
Het account kan worden geblokkeerd via passwd
:
# passwd -l root
Een soortgelijk commando ontgrendelt root.
$ sudo passwd -u root
Als alternatief, bewerk /etc/shadow
en vervang het gecodeerde wachtwoord van root door “!”:
root:!:12345::::::
Om root login weer mogelijk te maken:
$ sudo passwd root
sudo -i
.kdesu
kdesu kan onder KDE gebruikt worden om GUI applicaties met root privileges te starten. Het is mogelijk dat kdesu standaard su probeert te gebruiken, zelfs als de root account is uitgeschakeld. Gelukkig kan je kdesu vertellen om sudo te gebruiken in plaats van su. Maak/bewerk het bestand ~/.config/kdesurc
:
super-user-command=sudo
of gebruik het volgende commando:
$ kwriteconfig5 --file kdesurc --group super-user-command --key super-user-command sudo
Installeer als alternatief kdesudoAUR, dat het bijkomende voordeel heeft van tab-aanvulling voor het volgende commando.
Hard met sudo voorbeeld
Laten we zeggen dat je 3 gebruikers aanmaakt: admin, devel, en joe. De gebruiker “admin” wordt gebruikt voor journalctl, systemctl, mount, kill, en iptables; “devel” wordt gebruikt voor het installeren van packages, en het bewerken van config bestanden; en “joe” is de gebruiker waarmee je inlogt. Om “joe” te laten rebooten, afsluiten, en netctl te laten gebruiken zouden we het volgende doen:
Edit /etc/pam.d/su
en /etc/pam.d/su-l
Eis vereist dat de gebruiker in de wheel groep zit, maar zet er niemand in.
#%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
Limiteer SSH login tot de ‘ssh’ groep. Alleen “joe” zal deel uitmaken van deze groep.
groupadd -r sshgpasswd -a joe sshecho 'AllowGroups ssh' >> /etc/ssh/sshd_config
Start sshd.service
.
Voeg gebruikers toe aan andere groepen.
for g in power network ;do ;gpasswd -a joe $g ;donefor g in network power storage ;do ;gpasswd -a admin $g ;done
Stel permissies in op configs zodat devel ze kan bewerken.
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
Met deze setup hoef je bijna nooit in te loggen als de Root user.
“joe” kan verbinding maken met zijn WiFi thuis.
sudo netctl start homesudo poweroff
“joe” kan netctl niet gebruiken als een andere gebruiker.
sudo -u admin -- netctl start home
Wanneer “joe” journalctl moet gebruiken of een weggelopen proces moet doden, kan hij naar die gebruiker overschakelen.
sudo -i -u develsudo -i -u admin
Maar “joe” kan niet naar de root gebruiker overschakelen.
sudo -i -u root
Als “joe” een gnu-scherm sessie wil starten als admin kan hij dat als volgt doen:
sudo -i -u adminadmin% chown admin:tty `echo $TTY`admin% screen
Configureer sudo met behulp van drop-in bestanden in /etc/sudoers.d
sudo parseert bestanden die in de directory /etc/sudoers.d/
staan. Dit betekent dat in plaats van /etc/sudoers
te bewerken, u instellingen kunt wijzigen in standalone bestanden en deze in die directory kunt zetten. Dit heeft twee voordelen:
- Het is niet nodig om een
sudoers.pacnew
bestand te bewerken; - Als er een probleem is met een nieuwe invoer, kunt u het beledigende bestand verwijderen in plaats van
/etc/sudoers
te bewerken (maar zie de waarschuwing hieronder).
Het formaat voor items in deze drop-in bestanden is hetzelfde als voor /etc/sudoers
zelf. Om ze rechtstreeks te bewerken, gebruik visudo -f /etc/sudoers.d/somefile
. Zie sudoers(5) § Inclusief andere bestanden vanuit sudoers voor details.
De bestanden in /etc/sudoers.d/
directory worden in lexicografische volgorde geparst, bestandsnamen die .
of ~
bevatten worden overgeslagen. Om sorteerproblemen te voorkomen, moeten de bestandsnamen met twee cijfers beginnen, b.v. 01_foo
.
/etc/sudoers.d/
zijn net zo kwetsbaar als /etc/sudoers
zelf: elk onjuist geformatteerd bestand zal verhinderen dat sudo
werkt. Om dezelfde reden wordt het sterk aangeraden om visudo
Bestanden bewerken
sudo -e
of sudoedit
kunt u een bestand als een andere gebruiker bewerken terwijl u nog steeds de teksteditor als uw gebruiker gebruikt.
Dit is vooral handig om bestanden als root te bewerken zonder de rechten van je tekst editor te verhogen, voor meer details lees sudo(8) § e.
Merk op dat je de editor op elk programma kan zetten, dus je kan bijvoorbeeld meld gebruiken om pacnew bestanden te beheren:
$ SUDO_EDITOR=meld sudo -e /etc/file{,.pacnew}
Inschakelen insults
Users kunnen insults easter egg in sudo aanzetten door de volgende regel toe te voegen in sudoers bestand met visudo
.
Bij het invoeren van een foutief wachtwoord zal dit Sorry, try again.
bericht vervangen worden door humoristische beledigingen.
/etc/sudoers
Voorkeur beledigingen
Troubleshooting
SSH probleem zonder TTY
Dit artikel of onderdeel is een kandidaat om samengevoegd te worden met #Configuration.
SSH wijst standaard geen tty toe bij het uitvoeren van een commando op afstand. Zonder een toegewezen tty, kan sudo niet voorkomen dat het wachtwoord wordt weergegeven. Je kan ssh’s -t
optie gebruiken om het te dwingen een tty toe te wijzen.
De Defaults
optie requiretty
staat de gebruiker alleen toe om sudo te draaien als ze een tty hebben.
# 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
Dit artikel of deze sectie is een kandidaat om samengevoegd te worden met #Configuration.
Sudo zal de umask waarde van de gebruiker verbinden met zijn eigen umask (die standaard op 0022 staat). Dit voorkomt dat sudo bestanden aanmaakt met meer open permissies dan de umask van de gebruiker toestaat. Hoewel dit een verstandige standaard is als er geen aangepast umask in gebruik is, kan dit leiden tot situaties waar een programma uitgevoerd door sudo bestanden kan aanmaken met andere permissies dan wanneer het rechtstreeks door root zou uitgevoerd worden. Als hier fouten uit voortkomen, voorziet sudo een manier om de umask te herstellen, zelfs als de gewenste umask meer permissive is dan de umask die de gebruiker heeft opgegeven. Door dit toe te voegen (met visudo
) wordt sudo’s standaard gedrag overschreven:
Defaults umask = 0022Defaults umask_override
Dit stelt sudo’s umask in op root’s standaard umask (0022) en overschrijft het standaard gedrag, altijd de aangegeven umask gebruikend ongeacht welke umask de gebruiker heeft ingesteld.