Sudo

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

Tango-view-fullscreen.pngDit artikel of deze sectie heeft uitbreiding nodig.Tango-view-fullscreen.png

Reden: Maak een intro waarin 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.

Waarschuwing:

  • 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_EDITORVISUAL 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
Tip: Bij het aanmaken van nieuwe beheerders is het vaak wenselijk om sudo toegang in te schakelen voor de 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:

Waarschuwing: Hierdoor zal elk proces dat draait met uw gebruikersnaam sudo kunnen gebruiken zonder toestemming te vragen.
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
Opmerking: De meest aangepaste optie moet aan het eind van het bestand komen, omdat de latere regels de vorige overschrijven. In het bijzonder zou zo’n regel na de regel %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+vCtrl+g, of in nano, Alt+vCtrl+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

Waarschuwing: Dit zal elk proces je sudo sessie laten gebruiken.

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.

Waarschuwing:

  • 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
Tip: Om naar een interactieve root prompt te gaan, zelfs na het uitschakelen van de root account, gebruik 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-lEis 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.

Opmerking: De volgorde van de vermeldingen in de drop-in bestanden is belangrijk: zorg ervoor dat de vermeldingen zichzelf niet overschrijven.
Waarschuwing: De bestanden in /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

Merge-arrows-2.pngDit artikel of onderdeel is een kandidaat om samengevoegd te worden met #Configuration.Merge-arrows-2.png

Opmerkingen: gebruik het tweede argument van het sjabloon om meer gedetailleerde aanwijzingen te geven. (Bespreek dit in Talk:Sudo#)

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

Merge-arrows-2.pngDit artikel of deze sectie is een kandidaat om samengevoegd te worden met #Configuration.Merge-arrows-2.png

Noten: gebruik het tweede argument van het sjabloon om meer gedetailleerde aanwijzingen te geven. (Bespreek dit in Talk:Sudo#)

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.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *