sudo

Från Wiki.linux.se
Version från den 25 augusti 2024 kl. 14.09 av Admin (diskussion | bidrag) (→‎SE ÄVEN)
(skillnad) ← Äldre version | Nuvarande version (skillnad) | Nyare version → (skillnad)
Hoppa till navigering Hoppa till sök

SUDO(8)

Systemadministratörens handbok

NAMN

sudo, sudoedit — kör ett kommando som en annan användare

SAMMANFATTNING

sudo -h | -K | -k | -V sudo -v [-ABkNnS] [-g grupp] [-h värd] [-p prompt] [-u användare] sudo -l [-ABkNnS] [-g grupp] [-h värd] [-p prompt] [-U användare] [-u användare] [kommando [arg ...]] sudo [-ABbEHnPS] [-C nummer] [-D katalog] [-g grupp] [-h värd] [-p prompt] [-R katalog] [-T timeout] [-u användare] [VAR=värde] [-i | -s] [kommando [arg ...]] sudoedit [-ABkNnS] [-C nummer] [-D katalog] [-g grupp] [-h värd] [-p prompt] [-R katalog] [-T timeout] [-u användare] fil ...

BESKRIVNING

sudo tillåter en behörig användare att köra ett kommando som superanvändare eller en annan användare, enligt säkerhetspolicyn. Den verkliga (inte effektiva) användar-ID:n för den anropande användaren används för att bestämma användarnamnet som används för att fråga om säkerhetspolicyn.

sudo stödjer en plugin-arkitektur för säkerhetspolicyer, revision och loggning av in- och utdata. Tredje parter kan utveckla och distribuera egna plugins som fungerar sömlöst med sudo-fronten. Standard säkerhetspolicyn är sudoers, som konfigureras via filen `/etc/sudoers` eller via LDAP. Se avsnittet “Plugins” för mer information.

Säkerhetspolicyn bestämmer vilka privilegier en användare har för att köra sudo. Policyn kan kräva att användare autentiserar sig med ett lösenord eller en annan autentiseringsmekanism. Om autentisering krävs kommer sudo att avsluta om användarens lösenord inte anges inom en konfigurerbar tidsgräns. Denna gräns är specifik för policyn; standardtiden för lösenordsuppmaning för sudoers säkerhetspolicy är 5 minuter.

Säkerhetspolicyer kan stödja cachelagring av autentiseringsuppgifter för att tillåta användaren att köra sudo igen under en viss tid utan att kräva autentisering. Som standard lagrar sudoers-policyn autentiseringsuppgifter per terminal under 5 minuter. Se alternativen timestamp_type och timestamp_timeout i sudoers(5) för mer information. Genom att köra sudo med alternativet -v, kan en användare uppdatera de cachelagrade autentiseringsuppgifterna utan att köra ett kommando.

På system där sudo är den primära metoden för att få superanvändarprivilegier är det viktigt att undvika syntaxfel i säkerhetspolicyns konfigurationsfiler. För standard säkerhetspolicyn, sudoers(5), bör ändringar i konfigurationsfilerna göras med verktyget visudo(8), som säkerställer att inga syntaxfel introduceras.

När det anropas som sudoedit, är -e-alternativet (beskrivet nedan) underförstått.

Säkerhetspolicyer och revisionsplugins kan logga framgångsrika och misslyckade försök att köra sudo. Om ett in-/utdataplugin är konfigurerat kan det körande kommandots in- och utdata loggas också.

KOMMANDOKÖRNING

När sudo kör ett kommando, specificerar säkerhetspolicyn exekveringsmiljön för kommandot. Vanligtvis ställs den verkliga och effektiva användar- och grupp-ID:n in för att matcha dem för målanvändaren, som specificeras i lösenordsdatabasen, och gruppvektorn initieras baserat på gruppdatabasen (om inte -P-alternativet har angetts).

Följande parametrar kan specificeras av säkerhetspolicyn:

  • Verklig och effektiv användar-ID
  • Verklig och effektiv grupp-ID
  • Tilläggsgrupp-ID:n
  • Miljövariabler
  • Nuvarande arbetskatalog
  • Filskapande mask (umask)
  • Schemaläggningsprioritet (kallas även nice-värde)

PROCESSMODELL

Det finns två distinkta sätt som sudo kan köra ett kommando.

Om ett in-/utdataplugin är konfigurerat för att logga terminal-I/O, eller om säkerhetspolicyn uttryckligen begär det, allokeras en ny pseudo-terminal (”pty”) och fork(2) används för att skapa en andra sudo-process, kallad monitorn. Monitorn skapar en ny terminalsession med sig själv som ledare och pty:n som dess styrande terminal, anropar fork(2) igen, ställer in exekveringsmiljön som beskrivits ovan och använder sedan systemanropet execve(2) för att köra kommandot i barnprocessen. Monitorn finns för att reläa jobbkontrollsignaler mellan användarens terminal och pty:n där kommandot körs. Detta gör det möjligt att avbryta och återuppta kommandot normalt. Utan monitorn skulle kommandot vara i vad POSIX kallar en ”föräldralös processgrupp” och det skulle inte ta emot några jobbkontrollsignaler från kärnan. När kommandot avslutas eller avslutas av en signal, skickar monitorn kommandots utgångsstatus till huvudprocessen sudo och avslutas. Efter att ha mottagit kommandots utgångsstatus skickar huvudprocessen sudo utgångsstatus till säkerhetspolicyns stängningsfunktion, samt till stängningsfunktionen för eventuella konfigurerade revisionsplugins, och avslutar sedan. Detta läge är standard för sudo versioner 1.9.14 och senare när sudoers-policyn används.

Om ingen pty används, anropar sudo fork(2), ställer in exekveringsmiljön som beskrivits ovan och använder systemanropet execve(2) för att köra kommandot i barnprocessen. Huvudprocessen sudo väntar tills kommandot har slutförts, skickar sedan kommandots utgångsstatus till säkerhetspolicyns stängningsfunktion, samt till stängningsfunktionen för eventuella konfigurerade revisionsplugins, och avslutar sedan. Som ett specialfall, om policypluginet inte definierar en stängningsfunktion, kommer sudo att exekvera kommandot direkt istället för att först anropa fork(2). sudoers-policypluginet kommer endast att definiera en stängningsfunktion när I/O-loggning är aktiverad, en pty krävs, en SELinux-roll är specificerad, kommandot har en associerad timeout eller pam_session eller pam_setcred-alternativen är aktiverade. Både pam_session och pam_setcred är aktiverade som standard på system som använder PAM. Detta läge är standard för sudo versioner före 1.9.14 när sudoers-policyn används.

På system som använder PAM är säkerhetspolicyns stängningsfunktion ansvarig för att stänga PAM-sessionen. Den kan också logga kommandots utgångsstatus.

SIGNALHANTERING

När kommandot körs som en barnprocess till sudo, kommer sudo att vidarebefordra signaler det tar emot till kommandot. Signalerna SIGINT och SIGQUIT vidarebefordras endast när kommandot körs i en ny pty eller när signalen skickades av en användarprocess, inte kärnan. Detta förhindrar att kommandot tar emot SIGINT två gånger varje gång användaren trycker på Ctrl-C. Vissa signaler, såsom SIGSTOP och SIGKILL, kan inte fångas och kommer därför inte att vidarebefordras till kommandot. Som en allmän regel bör SIGTSTP användas istället för SIGSTOP när du vill avbryta ett kommando som körs av sudo.

Som ett specialfall kommer sudo inte att vidarebefordra signaler som skickades av kommandot det kör. Detta förhindrar att kommandot oavsiktligt dödar sig självt. På vissa system skickar verktyget reboot(8) signalen SIGTERM till alla icke-systemprocesser utom sig självt innan systemet startas om. Detta förhindrar att sudo vidarebefordrar signalen SIGTERM den tar emot tillbaka till reboot(8), vilket annars skulle kunna avsluta reboot(8) innan systemet faktiskt startades om, och lämna det i ett halvdött tillstånd liknande enanvändarläge. Observera dock att denna kontroll endast gäller kommandot som körs av sudo, och inte några andra processer som kommandot kan skapa. Som ett resultat kan körning av ett skript som anropar reboot(8) eller shutdown(8) via sudo orsaka att systemet hamnar i detta odefinierade tillstånd om inte reboot(8) eller shutdown(8) körs med hjälp av exec()-familjen av funktioner istället för system() (som placerar ett skal mellan kommandot och den anropande processen).

PLUGINS

Plugins kan specificeras via Plugin-direktiv i filen sudo.conf(5). De kan laddas som dynamiskt delade objekt (på system som stöder dem), eller kompileras direkt in i sudo-binären. Om ingen sudo.conf(5)-fil finns, eller om den inte innehåller några Plugin-rader, kommer sudo att använda sudoers(5) för policy, revision och I/O-loggning. Se manualen sudo.conf(5) för detaljer om filen /etc/sudo.conf och manualen sudo_plugin(5) för mer information om sudo-pluginarkitekturen.

UTGÅNGSVÄRDE

Vid framgångsrik exekvering av ett kommando kommer utgångsstatus från sudo att vara utgångsstatus för det program som exekverades. Om kommandot avslutades på grund av en mottagen signal kommer sudo att skicka sig själv samma signal som avslutade kommandot.

Om alternativet -l angavs utan ett kommando, kommer sudo att avsluta med ett värde på 0 om användaren har rätt att köra sudo och autentiserades framgångsrikt (enligt säkerhetspolicyn). Om ett kommando specificeras med alternativet -l kommer utgångsvärdet endast att vara 0 om kommandot tillåts av säkerhetspolicyn, annars blir det 1.

Om det uppstår ett autentiseringsfel, ett konfigurations-/behörighetsproblem, eller om det givna kommandot inte kan exekveras, avslutar sudo med ett värde på 1. I det senare fallet skrivs felsträngen ut till standardfel. Om sudo inte kan stat(2) en eller flera poster i användarens PATH, skrivs ett fel ut till standardfel. (Om katalogen inte finns eller om den inte verkligen är en katalog ignoreras posten och inget fel skrivs ut.) Detta borde inte hända under normala omständigheter. Den vanligaste orsaken till att stat(2) returnerar ”åtkomst nekad” är om du kör en automounter och en av katalogerna i din PATH finns på en maskin som för närvarande inte är nåbar.

SÄKERHETSNOTER

sudo försöker vara säker när den exekverar externa kommandon.

För att förhindra kommandospoofing kontrollerar sudo ”.” och ”” (båda som betecknar nuvarande katalog) sist när den söker efter ett kommando i användarens PATH (om en eller båda finns i PATH). Beroende på säkerhetspolicyn kan användarens PATH-miljövariabel modifieras, ersättas eller skickas oförändrad till programmet som sudo exekverar.

Användare bör aldrig beviljas sudo-privilegier för att exekvera filer som är skrivbara av användaren eller som finns i en katalog som är skrivbar av användaren. Om användaren kan modifiera eller ersätta kommandot finns det inget sätt att begränsa vilka ytterligare kommandon de kan köra.

Som standard kommer sudo endast logga det kommando det uttryckligen kör. Om en användare kör ett kommando som `sudo su` eller `sudo sh`, är efterföljande kommandon som körs från det skalet inte föremål för sudo:s säkerhetspolicy. Detsamma gäller för kommandon som erbjuder skalutbrott (inklusive de flesta textredigerare). Om I/O-loggning är aktiverad, kommer efterföljande kommandon att få sin inmatning och/eller utmatning loggad, men det kommer inte finnas traditionella loggar för dessa kommandon. På grund av detta måste man vara försiktig när man ger användare tillgång till kommandon via sudo, för att verifiera att kommandot inte av misstag ger användaren ett effektivt root-skal. För information om sätt att hantera detta, se avsnittet "Förhindra skalutbrott" i sudoers(5).

För att förhindra avslöjande av potentiellt känslig information, inaktiverar sudo kärndumpar som standard medan det exekveras (de återaktiveras för det körda kommandot). Denna historiska praxis härstammar från en tid när de flesta operativsystem tillät set-user-ID-processer att dumpa kärnan som standard. För att underlätta felsökning av sudo-krascher kan du vilja återaktivera kärndumpar genom att ställa in "disable_coredump" till falskt i filen sudo.conf(5) enligt följande:

Set disable_coredump false

Se manualen sudo.conf(5) för mer information.

MILJÖ

sudo använder följande miljövariabler. Säkerhetspolicyn har kontroll över det faktiska innehållet i kommandots miljö.

  • EDITOR - Standardredigerare som används i -e (sudoedit)-läge om varken SUDO_EDITOR eller VISUAL är inställda.
  • MAIL - Ställs in till målanvändarens e-post när -i-alternativet är specificerat eller när env_reset är aktiverat i sudoers (såvida inte MAIL finns med i env_keep-listan).
  • HOME - Ställs in till målanvändarens hemkatalog när -i eller -H-alternativen är specificerade, när -s-alternativet är specificerat och set_home är inställt i sudoers, när always_set_home är aktiverat i sudoers, eller när env_reset är aktiverat i sudoers och HOME inte finns med i env_keep-listan.
  • LOGNAME - Ställs in till målanvändarens inloggningsnamn när -i-alternativet är specificerat, när set_logname-alternativet är aktiverat i sudoers, eller när env_reset-alternativet är aktiverat i sudoers (såvida inte LOGNAME finns med i env_keep-listan).
  • PATH - Kan åsidosättas av säkerhetspolicyn.
  • SHELL - Används för att bestämma skalet som ska köras med -s-alternativet.
  • SUDO_ASKPASS - Anger sökvägen till ett hjälpprogram som används för att läsa lösenordet om ingen terminal är tillgänglig eller om -A-alternativet är specificerat.
  • SUDO_COMMAND - Ställs in till kommandot som körs av sudo, inklusive eventuella argument. Argumenten avkortas till 4096 tecken för att förhindra ett potentiellt exekveringsfel.
  • SUDO_EDITOR - Standardredigerare som används i -e (sudoedit)-läge.
  • SUDO_GID - Ställs in till grupp-ID för användaren som anropade sudo.
  • SUDO_HOME - Ställs in till hemkatalogen för användaren som anropade sudo.
  • SUDO_PROMPT - Används som standard lösenordsuppmaning om inte -p-alternativet var specificerat.
  • SUDO_PS1 - Om inställt, kommer PS1 att ställas in till dess värde för det program som körs.
  • SUDO_UID - Ställs in till användar-ID för användaren som anropade sudo.
  • SUDO_USER - Ställs in till inloggningsnamnet för användaren som anropade sudo.
  • USER - Ställs in till samma värde som LOGNAME, beskrivet ovan.
  • VISUAL - Standardredigerare som används i -e (sudoedit)-läge om SUDO_EDITOR inte är inställt.

FILER

  • /etc/sudo.conf - sudo-frontens konfiguration

EXEMPEL

Följande exempel förutsätter en korrekt konfigurerad säkerhetspolicy.

  • För att få en filförteckning över en oåtkomlig katalog:
$ sudo ls /usr/local/protected
  • För att lista hemkatalogen för användaren yaz på en maskin där filsystemet som håller ~yaz inte exporteras som root:
$ sudo -u yaz ls ~yaz
  • För att redigera filen index.html som användare www:
$ sudoedit -u www ~www/htdocs/index.html
  • För att visa systemloggar som endast är åtkomliga för root och användare i gruppen adm:
$ sudo -g adm more /var/log/syslog
  • För att köra en redigerare som jim med en annan primärgrupp:
$ sudoedit -u jim -g audio ~jim/sound.txt
  • För att stänga av en maskin:
$ sudo shutdown -r +15 "quick reboot"
  • För att göra en användningslista över katalogerna i /home-partitionen. Kommandona körs i en underskal för att tillåta ‘cd’-kommandot och filomdirigering att fungera.
$ sudo sh -c "cd /home ; du -s * | sort -rn > USAGE"

DIAGNOSTIK

Felmeddelanden som produceras av sudo inkluderar:

  • editing files in a writable directory is not permitted - Som standard tillåter sudoedit inte redigering av en fil när någon av de överordnade katalogerna är skrivbara av den anropande användaren. Detta undviker en kapplöpning som skulle kunna tillåta användaren att skriva över en godtycklig fil. Se sudoedit_checkdir-alternativet i sudoers(5) för mer information.
  • editing symbolic links is not permitted - Som standard följer sudoedit inte symboliska länkar när de öppnar filer. Se sudoedit_follow-alternativet i sudoers(5) för mer information.
  • effective uid is not 0, is sudo installed setuid root? - sudo kördes inte med root-privilegier. sudo-binären måste ägas av root-användaren och ha set-user-ID-bit inställd. Den får inte heller vara belägen på ett filsystem monterat med ‘nosuid’-alternativet eller på ett NFS-filsystem som mappar uid 0 till en icke-privilegierad uid.
  • effective uid is not 0, is sudo on a file system with the 'nosuid' option set or an NFS file system without root privileges? - sudo kördes inte med root-privilegier. sudo-binären har rätt ägare och behörigheter men kördes fortfarande inte med root-privilegier. Den vanligaste orsaken till detta är att filsystemet som sudo-binären finns på är monterat med ‘nosuid’-alternativet eller att det är ett NFS-filsystem som mappar uid 0 till en icke-privilegierad uid.
  • fatal error, unable to load plugins - Ett fel inträffade när plugins som specificerats i sudo.conf(5) laddades eller initialiserades.
  • invalid environment variable name - Ett eller flera miljövariabelnamn som specificerades via -E-alternativet innehöll ett lika med-tecken (‘=’). Argumenten till -E-alternativet bör vara miljövariabelnamn utan ett associerat värde.
  • no password was provided - När sudo försökte läsa lösenordet tog det inte emot några tecken. Detta kan hända om ingen terminal är tillgänglig (eller om -S-alternativet är specificerat) och standardinmatningen har omdirigerats från /dev/null.
  • a terminal is required to read the password - sudo behöver läsa lösenordet men det finns ingen mekanism tillgänglig för att göra det. En terminal finns inte för att läsa lösenordet från, sudo har inte konfigurerats för att läsa från standardinmatningen, -S-alternativet användes inte och inget askpass-hjälpprogram har specificerats vare sig via sudo.conf(5)-filen eller miljövariabeln SUDO_ASKPASS.
  • no writable temporary directory found - sudoedit kunde inte hitta en användbar temporär katalog för att lagra sina mellanliggande filer.
  • The “no new privileges” flag is set, which prevents sudo from running as root. - sudo kördes av en process som har Linux-flaggan “no new privileges” satt. Detta gör att set-user-ID-bit ignoreras när ett körbart program körs, vilket förhindrar sudo från att fungera. Den troligaste orsaken till detta är att sudo körs inom en container som har denna flagga inställd. Kontrollera dokumentationen för att se om det är möjligt att konfigurera containern så att flaggan inte är inställd.
  • sudo must be owned by uid 0 and have the setuid bit set - sudo kördes inte med root-privilegier. sudo-binären har inte rätt ägare eller behörigheter. Den måste ägas av root-användaren och ha set-user-ID-bit inställd.
  • sudoedit is not supported on this platform - Det är bara möjligt att köra sudoedit på system som stöder att ställa in den effektiva användar-ID:n.
  • timed out reading password - Användaren angav inte ett lösenord innan lösenordstidsgränsen (5 minuter som standard) gick ut.
  • you do not exist in the passwd database - Ditt användar-ID finns inte i systemets passwd-databas.
  • you may not specify environment variables in edit mode - Det är bara möjligt att specificera miljövariabler när man kör ett kommando. När man redigerar en fil körs redigeraren med användarens miljö oförändrad.

SE ÄVEN

HISTORIK

Se filen HISTORY.md i sudo-distributionen (https://www.sudo.ws/about/history/) för en kort historik över sudo.

FÖRFATTARE

Många personer har arbetat på sudo genom åren; denna version består huvudsakligen av kod skriven av:

  • Todd C. Miller

Se filen CONTRIBUTORS.md i sudo-distributionen (https://www.sudo.ws/about/contributors/) för en uttömmande lista över personer som har bidragit till sudo.

BEGRÄNSNINGAR

Det finns inget enkelt sätt att förhindra en användare från att få ett root-skal om den användaren har rätt att köra godtyckliga kommandon via sudo. Många program (som textredigerare) tillåter också användaren att köra kommandon via skalutbrott, och därmed undvika sudo:s kontroller. Det är dock på de flesta system möjligt att förhindra skalutbrott med sudoers(5)-pluginets noexec-funktionalitet.

Det är inte meningsfullt att köra kommandot ‘cd’ direkt via sudo, t.ex.

$ sudo cd /usr/local/protected

eftersom när kommandot avslutas kommer överordnade processen (ditt skal) fortfarande vara densamma. -D-alternativet kan användas för att köra ett kommando i en specifik katalog.

Att köra shell-skript via sudo kan exponera samma kärnbuggar som gör set-user-ID shell-skript osäkra på vissa operativsystem (om ditt OS har en /dev/fd/-katalog, är set-user-ID shell-skript generellt säkra).

BUGGAR

Om du tror att du har hittat en bugg i sudo kan du antingen lämna in en felrapport i sudo-bugdatabasen, https://bugzilla.sudo.ws/, eller öppna ett ärende på https://github.com/sudo-project/sudo/issues. Om du föredrar att använda e-post kan du skicka meddelanden till sudo-workers-mailinglistan, https://www.sudo.ws/mailman/listinfo/sudo-workers (offentlig) eller <sudo@sudo.ws> (privat).

Anmäl inte säkerhetssårbarheter via offentliga GitHub-ärenden, Bugzilla eller mailinglistor. Rapportera dem istället via e-post till <Todd.Miller@sudo.ws>. Du kan kryptera ditt meddelande med PGP om du vill, med nyckeln som finns på https://www.sudo.ws/dist/PGPKEYS.

SUPPORT

Begränsad gratis support finns via sudo-users mailinglistan, se https://www.sudo.ws/mailman/listinfo/sudo-users för att prenumerera eller söka i arkiven.

ANSVARSFRISKRIVNING

sudo tillhandahålls “SOM DET ÄR” och alla uttryckliga eller underförstådda garantier, inklusive men inte begränsat till underförstådda garantier för säljbarhet och lämplighet för ett visst ändamål, avsägs. Se filen LICENSE.md som distribueras med sudo, eller https://www.sudo.ws/about/license/ för fullständiga detaljer.

KOLLOFON

Denna sida är en del av sudo (kör ett kommando som en annan användare)-projektet. Information om projektet finns på https://www.sudo.ws/. Om du har en felrapport för denna manual, se ⟨https://bugzilla.sudo.ws/⟩. Denna sida hämtades från projektets uppströms Git-repository ⟨https://github.com/sudo-project/sudo⟩ den 2024-06-14. (Vid den tidpunkten var datumet för den senaste commit som hittades i repositoryn 2024-06-08.) Om du upptäcker några problem med rendering i denna HTML-version av sidan, eller om du tror att det finns en bättre eller mer uppdaterad källa för sidan, eller om du har korrigeringar eller förbättringar av informationen i denna KOLLOFON (som inte är en del av den ursprungliga manualsidan), skicka ett mail till man-pages@man7.org.

Sidslut


Det här är en maskinöversättning av linux kommando manualen till svenska. Om du hittar fel är vi tacksamma om du rapporterar dem via formuläret som finns på https://www.linux.se/kontaka-linux-se/

Tack till Datorhjälp som har sponsrat Linux.se med webserver.