Perché dobbiamo essere root nel terminale per l'arresto e il riavvio?

60

Quando installiamo / rimuoviamo / aggiorniamo pacchetti o apportiamo modifiche che richiedono privilegi amministrativi, viene richiesta la password dell'utente amministratore che ha i privilegi sudo - ciò avviene sia tramite GUI che con terminale.

Tuttavia, se proviamo a chiudere e riavviare tramite terminale, si lamenta che dobbiamo essere root :

$ reboot
reboot: Need to be root

$ shutdown now
shutdown: Need to be root

Ma non ci viene mai richiesta una password quando eseguiamo queste azioni tramite la ruota dentata in alto a destra.

Perché c'è questa discrepanza?

    
posta Aditya 19.10.2013 - 20:02

6 risposte

48

Lo spegnimento della ruota dentata controlla se è consentito arrestare la macchina. Questo viene fatto tramite PolicyKit. In caso di arresto questa istruzione nel file /usr/share/polkit-1/actions/org.freedesktop.consolekit.policy è selezionata:

<action id="org.freedesktop.consolekit.system.stop">
  <description>Stop the system</description>
  <message>System policy prevents stopping the system</message>
  <defaults>
    <allow_inactive>no</allow_inactive>
    <allow_active>yes</allow_active>
  </defaults>
</action>

PolicyKit attiva un comando dbus-send . In caso di spegnimento sarebbe:

dbus-send --system --print-reply --dest=org.freedesktop.Hal /org/freedesktop/Hal/devices/computer org.freedesktop.Hal.Device.SystemPowerManagement.Shutdown

C'è un daemon in esecuzione in background con privilegi di root che invoca il comando shutdown per te.

Quando vuoi essere in grado di spegnere la macchina "alla vecchia maniera" tramite la riga di comando ( shutdown, reboot, halt, ... ), allora devi aggiungere il bit suid a quei comandi. Ma sappi che chiunque nel tuo sistema, che ha accesso alla shell, potrebbe spegnere la tua macchina.

    
risposta data chaos 19.10.2013 - 20:46
27

Ubuntu è una distribuzione del Sistema Operativo GNU / Linux che a sua volta appartiene alla famiglia di sistemi Unix - un'architettura comune per un certo numero di moderni Sistemi Operativi.

Tradizionalmente Unix funzionava su computer mainframe. Strutture di calcolo centralizzate che servono decine o centinaia di utenti tramite terminali remoti. Poiché tutti gli utenti facevano affidamento sulla disponibilità del mainframe, a nessun utente era consentito emettere un comando shutdown. Un'idea fondamentale per l'architettura Unix: il kernel del sistema non inizializzerà mai uno spegnimento a meno che la funzione corrispondente non venga chiamata da un processo di superutente.

Nei moderni sistemi desktop gli sviluppatori hanno affrontato alcuni problemi per rendere l'arresto disponibile per il semplice utente desktop. Una tecnica comune è quella di consentire al gestore di login, che di solito viene eseguito nel contesto di sicurezza dell'utente root, gestire l'arresto e il riavvio. In questo caso la shell grafica invia una richiesta al gestore di login per arrestare il computer. Ciò implica l'utilizzo della comunicazione tra processi (IPC), in genere tramite il servizio dbus.

Il suddetto policykit estende questo processo fornendo un framework standardizzato attraverso il quale il gestore degli accessi (o qualunque programma fornisca il servizio di spegnimento) può verificare quali utenti sono autorizzati a causare un arresto e attraverso il quale un amministratore può configurare tali autorizzazioni rispettivamente .

Alcuni ambienti desktop non utilizzano servizi basati su IPC ma piuttosto un insieme di programmi di supporto per fornire le stesse funzioni o simili. Quei programmi di supporto sarebbero chiamati attraverso meccanismi, permettendo di cambiare nel contesto di superutente, come sudo, suid, o un meccanismo di policykit simile a sudo.

In ogni caso, il programma di spegnimento tradizionale stupido sulla shell non funziona in questo modo, richiede di vedere che viene eseguito in un contesto superuser.

    
risposta data Paul Hänsch 19.10.2013 - 21:29
14

Poiché Linux è comunemente usato come server o simile, e SSHing in una macchina Linux, anche un normale laptop Ubuntu, è abbastanza comune.

Il fatto è che potresti non volere che le persone con accesso SSH siano in grado di spegnerlo, specialmente quando potrebbero esserci altri utenti che hanno effettuato il login da remoto. Qualcuno con accesso alla GUI - beh, può spegnerlo da solo con il pulsante di accensione fisico.

Inoltre, un utente che ha effettuato il login da remoto non sarà in grado di riaccenderlo.

    
risposta data Manishearth 20.10.2013 - 02:43
14
  

Quando riavvio tramite la GUI, posso farlo senza la mia sudo password.

Solo se sei l'unico ad aver effettuato il login. Se ci sono altri utenti (inclusi gli utenti della console) potresti dover inserire una password di root. Questo è lo stesso su OS X e sulle versioni di Windows più recenti.

  

Perché è così? Cosa sta succedendo internamente al sistema Ubuntu?

Il seguente comando:

/usr/bin/dbus-send --system --print-reply --dest="org.freedesktop.ConsoleKit" /org/freedesktop/ConsoleKit/Manager org.freedesktop.ConsoleKit.Manager.Stop
  

D-Bus è un meccanismo IPC, un mezzo per la comunicazione locale tra processi in esecuzione sullo stesso host.

     

D-Bus è "più intelligente" rispetto ai protocolli di passaggio di messaggi di basso livello come UDP. D'altra parte, trasporta i messaggi come elementi discreti, non flussi di dati continui.

     

D-Bus ha una vista strutturata dei dati che trasporta e gestisce i dati in formato binario; numeri interi di varie larghezze, stringhe e così via. Poiché i dati non sono solo "byte grezzi" per D-Bus, i messaggi possono essere convalidati.

     

- Desktop gratuito

Perché il comando shutdown non controlla se qualcuno ha effettuato l'accesso? Sembra una caratteristica senza carriera essere onesti. Posso immaginare che potrebbe risparmiare tempo a volte, ma una console coerente è spesso preferita. Non voglio che i comandi a volte richiedano una password dopo averla eseguita, e talvolta no.

    
risposta data Tim 07.02.2016 - 02:58
9

Il motivo per cui non è necessario essere root per avviare un arresto dalla GUI è in gran parte una questione di convenienza per il tipico utente desktop. Il sistema sa che sei l'utente che ha effettuato l'accesso sulla console, quindi se spegni il computer per errore, puoi presumibilmente riaccenderlo.

Per un utente nella shell, potresti benissimo essere loggato in remoto, quindi il sistema richiede che tu abbia effettuato il login come root per emettere un comando shutdown. Ciò impedisce a un utente normale connesso a un server di spegnerlo mentre altri lo stanno utilizzando, e anche se non c'è necessariamente qualcuno fisicamente presente per avviare il backup del computer.

La ragione per cui shutdown non fornisce un prompt della GUI per la password di superutente è probabilmente semplicemente che non c'è una vera utilità da ottenere lì - se sei sulla console, dove apparirà il prompt, potresti semplicemente usare il menu cog-wheeel invece. Se si desidera avere un prompt della riga di comando per la password di superutente per lo spegnimento, è già disponibile con "sudo shutdown".

    
risposta data Mark Bessey 19.10.2013 - 21:35
5

In un sistema multiutente, l'ultima cosa che vuoi è che i tuoi utenti accedano e siano in grado di riavviare casualmente il server in qualsiasi momento, quindi la versione da riga di comando di Reboot è un comando solo per superuser, quindi devi essere root o avere i diritti sudo.

Idem anche i comandi Halt e PowerOff.

    
risposta data Jeff Sereno 07.02.2016 - 02:38

Leggi altre domande sui tag