Perché il comando sudo non necessita della password di root?


48

Sto usando Linux da un po 'di tempo e ogni volta che ho digitato sudoho pensato di passare all'utente root per un comando.

Apparentemente questo non è vero perché tutto ciò di cui ho bisogno è la password del mio account utente. Sto indovinando dal momento che non ho lavorato con più utenti, non l'ho davvero notato nel mondo reale.

Non sono sicuro di come Ubuntu abbia configurato il mio primo account. C'è un utente root? Sono root? Immagino di aver appena creato un nuovo utente al momento dell'installazione ma mi ha dato i privilegi di root? Solo un po 'confuso qui ...

Quindi perché posso eseguire i comandi di root con la password del mio utente?


Usi quale utente hai bisogno della password e in quale no? Quale comando stai eseguendo? Ricorda che sudo memorizza la tua password per un po 'di tempo prima di doverla digitare nuovamente.
Braiam,

11
sudoha il bit "setuid" impostato. Quindi funziona come l'utente che lo possiede (che è root su tutti i sistemi standard se non sbaglio), non l'utente che lo avvia. sudoquindi carica il /etc/sudoersfile e verifica ciò che è consentito in base a chi lo ha avviato.
LawrenceC,


1
Mi dispiace se sto ripetendo qualcosa che qualcun altro ha detto, ma non sono riuscito a trovarlo. La risposta è: è una decisione politica. La mia migliore ipotesi sulla motivazione è che, in una grande installazione in cui hai molte persone con sudoprivilegio, magari lavorando in posizioni geograficamente distribuite e su turni 24 × 7, vuoi essere in grado di revocare immediatamente l'accesso privilegiato di una persona (ad esempio, se sospetti la sua integrità). Se tutti usano la sola e unica password di root e la si modifica senza un precedente coordinamento, potrebbe derivarne il caos. ...
G-Man dice "Reinstate Monica" il

1
@HagenvonEitzen So che sono in ritardo di un paio di giorni, ma in che modo questo non è un inganno della nostra domanda?
Strugee,

Risposte:


65

Nel dettaglio funziona nel modo seguente:

  1. /usr/bin/sudoil file eseguibile ha setuid bit impostato, quindi anche se eseguito da un altro utente, viene eseguito con l'ID utente del proprietario del file (root in quel caso).

  2. sudocontrolla nel /etc/sudoersfile quali privilegi hai e se ti è permesso eseguire il comando che stai invocando. Detto semplicemente, /etc/sudoersè un file che definisce quali utenti possono eseguire quali comandi usando il sudomeccanismo.

    Ecco come appare quel file sul mio Ubuntu:

    # User privilege specification
    root    ALL=(ALL:ALL) ALL
    
    # Members of the admin group may gain root privileges
    %admin ALL=(ALL) ALL
    
    # Allow members of group sudo to execute any command
    %sudo   ALL=(ALL:ALL) ALL
    

    La terza linea è ciò che presumibilmente ti interessa. Permette a chiunque nel gruppo "sudo" di eseguire qualsiasi comando come qualsiasi utente.

    Quando Ubuntu imposta il primo account durante l'installazione, aggiunge tale account al gruppo "sudo". Puoi controllare a quali gruppi appartengono gli utenti con il groupcomando.

  3. sudoti chiede una password. Per quanto riguarda il fatto che necessita della password dell'utente, non di quella root, questo è un estratto dal manuale di sudoers :

    Autenticazione e registrazione

    La politica di sicurezza di sudoers richiede che la maggior parte degli utenti esegua l'autenticazione prima di poter utilizzare sudo. Non è richiesta una password se l'utente che effettua il richiamo è root, se l'utente di destinazione è uguale all'utente che effettua il richiamo o se il criterio ha disabilitato l'autenticazione per l'utente o il comando. A differenza di su (1), quando i sudoer richiedono l'autenticazione, convalida le credenziali dell'utente che invoca, non quelle dell'utente di destinazione (o della radice). Questo può essere modificato tramite i flag rootpw, targetpw e runaspw, descritti in seguito.

    Tuttavia, in realtà, sudonon è necessaria la password dell'utente per nulla. Lo richiede solo per assicurarti di essere davvero te stesso e per fornirti una sorta di avvertimento (o possibilità di fermarti) prima di invocare un comando potenzialmente pericoloso. Se si desidera disattivare la richiesta della password, modificare la voce sudoers in:

    %sudo   ALL=(ALL:ALL) NOPASSWD: ALL
    
  4. Dopo l'autenticazione viene sudogenerato il processo figlio che esegue il comando invocato. Il figlio eredita l'id utente root dal suo genitore: il sudoprocesso.


Quindi, rispondendo esattamente alle tue domande:

Pensavo di passare all'utente root per un comando.

Avevi ragione. Ogni comando preceduto da sudoviene eseguito con l'id utente root.

C'è un utente root?

Sì, esiste un account utente root, separato dall'account utente creato durante l'installazione del sistema. Tuttavia, per impostazione predefinita in Ubuntu non è consentito accedere al terminale interattivo come utente root.

Sono root?

No, non sei un root. Hai solo il privilegio di eseguire singoli comandi come root , usando il sudomeccanismo sopra descritto.

Quindi perché posso eseguire i comandi di root con la password del mio utente?

Devi inserire la password dell'utente solo a causa del sudomeccanismo di sicurezza interno. Può essere facilmente spento. Ottieni i tuoi poteri di root a causa del bit setuid di /usr/bin/sudo, non a causa di eventuali password inserite.


6
La risposta dovrebbe davvero iniziare con la parte setuid, perché questa è la ragione per cui è effettivamente possibile. / etc / sudoers è solo il motivo della flessibilità del comando sudo.
Daniel Kullmann,

Interessante. Non sapevo che avresti potuto specificare che sudopoteva essere eseguito senza inserire la mia password. Bella risposta!
jwir3,

1
Si noti che sudo può essere configurato per richiedere la password di root con il rootpwflag in sudoers.
Ripristina Monica - M. Schröder il

2
È possibile , infatti, effettuare il login come utente root: sudo su - rootfarà proprio questo e vi darò un terminale di root. Tuttavia, non è possibile accedere facilmente a una sessione desktop come root.
jmiserez,

1
Fondamentalmente sudoha il privilegio di root da solo, e decide se impartirglielo in base a un file di configurazione.
Siyuan Ren,

15
  • Il punto sudoè di concederti i privilegi di qualcun altro (di solito root) senza chiedere la password di questo altro account (a differenza su).

  • sudo chiede qui la password solo per assicurarsi che un passante non utilizzi in modo improprio il terminale sbloccato.

  • Ubuntu e molti altri sistemi operativi Linux e Unix concedono a un account iniziale creato al momento dell'installazione il diritto di eseguire qualsiasi comando come root.

  • Mentre rootè ancora un account su Linux, gli rootaccessi diretti sono disabilitati per impostazione predefinita per una migliore sicurezza e tracciabilità.


7
Sebbene l'accesso diretto alla radice sia effettivamente disabilitato per impostazione predefinita, c'è ancora un account radice con Ubuntu. Non è più un account su almeno Solaris in cui è di default un ruolo.
jlliagre,

Grazie mille: mi sono sempre chiesto come funzionasse, e ora ha molto più senso.
Mikeserv,

5

Piotr ha dato un'ottima spiegazione di come sudofunziona. Tuttavia, non ha davvero motivato il motivo per cui funziona in questo modo, quindi proverò ad aggiungerlo qui.

Prima che il sudocomando fosse creato, avevamo il sucomando. Questo comando consente a un utente di eseguire comandi come un altro utente, di solito root(come con sudo, questo è l'utente di destinazione predefinito). Era del tutto indiscriminato, puoi eseguire qualsiasi comando. Dal momento che poteva essere utilizzato da qualsiasi utente, equivaleva effettivamente all'accesso come tale utente, richiedeva la conoscenza della password dell'utente di destinazione.

Ad un certo punto, è stato aggiunto un po 'più di controllo dell'accesso: per usare su, dovevi essere un membro del wheelgruppo. Ma dato che potevi ancora eseguire qualsiasi comando, aveva ancora senso chiederti di conoscere la loro password.

Tuttavia, richiedere agli utenti di conoscersi a vicenda o del superutente non era molto sicuro. Spesso vuoi solo dare ad alcuni utenti un accesso limitato ad altri account (questo fa parte di un concetto di sicurezza chiamato principio del privilegio minimo ). Inoltre rende difficile la responsabilità: se più persone conoscono la password di un account e quell'account è coinvolto in un errore o un abuso, non si può dire quale di loro lo abbia effettivamente fatto.

Così è sudostato creato. Invece di consentire agli utenti di eseguire qualsiasi comando, ha un file di configurazione elaborato, brevemente toccato nella risposta di Piotr, che specifica con precisione a chi può utilizzarlo, a quali utenti possono passare e a quali comandi possono eseguire. Con questo controllo approfondito su chi può fare cosa per chi, non è più necessario fornire agli utenti la password dell'account di destinazione; se lo facessimo, potrebbero facilmente bypassare tutti i controlli nel file di configurazione accedendo come quell'utente. Invece, normalmente chiediamo solo loro di dimostrare che sono le persone con cui hanno effettuato l'accesso, inserendo la propria password: ciò ha lo scopo di impedire a qualcuno di sfruttare un account se il terminale viene lasciato incustodito.

Questo requisito non è previsto per il superutente: questo account può fare praticamente qualsiasi cosa al sistema senza utilizzarlo sudo, quindi è stato ritenuto superfluo. È anche possibile specificare nel file di configurazione che gli utenti non devono affatto inserire una password: alcune organizzazioni la usano quando ritengono che la sicurezza fisica del proprio ambiente di lavoro sia sufficiente per prevenire abusi.


Non l'ho esplorato, ma capisco che una delle funzionalità di sudo che su non ha è che (è in grado di?) Tenere un registro di quali comandi sono stati eseguiti da quale utente per rendere più facile rintracciare i problemi su le loro fonti. Ho appena guardato il mio sistema Kubuntu e non vedo un tale registro, quindi forse questo non è un comportamento predefinito.
Joe,

Ho appena trovato la registrazione sudo in /var/log/auth.log - insieme a molte altre cose tra cui alcuni IP dalla Cina che cercano di ottenere l'accesso root ssh al mio sistema - quindi, se vuoi solo vedere sudo, devi filtrare attraverso grep o simili.
Joe,

Corretta. suregistra anche, ma poiché avvia appena una nuova shell, registra solo il fatto che qualcuno l'ha eseguita.
Barmar,

Non è possibile fare affidamento sui registri, chiunque può ottenere il root può modificare i registri (a meno che non si acceda a un altro computer e si assicuri di non dare accesso fino al completamento della transazione di registrazione). Tuttavia sudo, consente di revocare i privilegi, senza dover emettere nuovamente la password di root per tutti coloro che ne hanno bisogno.
ctrl-alt-delor

1
@richard Poiché sudoti consente di limitare i comandi che un utente può eseguire, puoi provare ad assicurarti di non dare loro accesso ai comandi che sovrascriverebbero il registro.
Barmar,

3

La risposta alla tua domanda è:

Quando si esegue un comando con sudo , si esegue il comando con privilegi elevati , ovvero i privilegi di root . Devi solo digitare la tua normale password utente perché tu (l'utente) sei stato aggiunto al file sudoers che ti dà i privilegi di root .


2
Tranne che sudo non implica privilegi elevati, ma solo privilegi diversi per l'utente corrente. Ad esempio, è possibile eseguire un programma come un normale utente che non ha una shell. Inoltre, essere nel file sudoers non dà root.
James Tocknell,

1
@aragilar yes sudonon dà sempre privilegi elevati, ma funziona con privilegi elevati, dopo aver fatto le sue cose (controllando l'autenticazione, potrebbe rilasciare privilegi). Ha bisogno di questi privilegi elevati per poter cambiare utente.
ctrl-alt-delor

1
Certo, sudousa privilegi elevati (ma non è univoco per sudo, ad esempio mount lo fa anche), ma il comando che chiami cioè commandin sudo commandpotrebbe non (a seconda di cosa è impostato in /etc/sudoers).
James Tocknell,

1

Innanzitutto, la disabilitazione di un account viene generalmente eseguita impostando la password crittografata su *, che non è il valore crittografato di alcuna stringa. Non posso controllare ora, ma credo che sia quello che fa Ubuntu anche per il root. Quindi tecnicamente, non esiste una password di root su Ubuntu.

Ma sudo precede Ubuntu; è stato progettato per sistemi in cui c'erano sicuramente password di root. Quindi perché non richiede la password di root? Fondamentalmente, sudo è progettato per autorizzare l'esecuzione di comandi specifici a determinati utenti, ad esempio consentire a uno sviluppatore di accedere come root per riavviare l'applicazione Web, ma non per avviare server arbitrari. Conoscere la password di root, invece, ti dà accesso illimitato; puoi usare login o su per aprire una shell di root ed eseguire comandi arbitrari. Poiché sudo deve funzionare per le persone senza quel livello di accesso, non può richiedere l'esecuzione della password di root.


Permette anche di revocare i privilegi di root di un utente senza dover cambiare la password di root.
Ian D. Scott,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.