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


65

Quando installiamo / rimuoviamo / aggiorniamo pacchetti o apportiamo modifiche che richiedono privilegi di amministratore, viene richiesta la password dell'utente amministratore che dispone dei sudoprivilegi, ciò avviene sia tramite GUI che tramite terminale.

prompt tramite gui

Tuttavia, se proviamo a spegnere e riavviare tramite terminale, ci 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.

menu della ruota dentata

Perché c'è questa discrepanza?


5
Bella domanda .. Sai cosa avrei fatto lo stesso. Il mio scenario era quello di spegnere Ubuntu con tasti di scelta rapida. io, e quando mai premo un tasto assegnato come ctrl + super + s esegue il comando sudo shutdown -h nowma il problema era che senza il permesso di accesso shutdownnon funziona mai .. Perché dove / come chiederà la password per entrare dopo aver premuto il tasto di scelta rapida .. Spero tu capisca la mia situazione .. :)
Saurav Kumar,


Risposte:


50

L'arresto sulla ruota dentata verifica 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 dbus-sendcomando. 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 demone in esecuzione in background con i privilegi di root che invoca il comando shutdown per te.

Quando si desidera poter arrestare la macchina "alla vecchia maniera" tramite la riga di comando ( shutdown, reboot, halt, ...), è necessario aggiungere il bit suid a tali comandi. Ma attenzione, tutti gli utenti del sistema che hanno accesso alla shell potrebbero quindi arrestare il computer.


14
Un'opzione leggermente più sicura sarebbe quella di consentire l'arresto senza password dei sudoers ecc. Ciò è facilmente realizzabile: entra sudo visudo, aggiungi %sudo ALL = NOPASSWD: /sbin/shutdown, /sbin/poweroff, /sbin/halt, /sbin/reboot, salva ed esci. In questo modo, sarà comunque necessario riavviare la riga di comando sudo reboot, ma non sarà necessario inserire la password.
Sebastian Thürrschmidt,

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 veniva eseguito su computer mainframe. Strutture informatiche centrali che servono dozzine o centinaia di utenti tramite terminali remoti. Poiché tutti gli utenti si basavano sulla disponibilità del mainframe, a nessun singolo utente era consentito emettere un comando di arresto. Un'idea fondamentale per l'architettura Unix: il kernel di sistema non inizializzerà mai un arresto a meno che la funzione corrispondente non sia chiamata da un processo superutente.

Nei sistemi desktop contemporanei gli sviluppatori hanno affrontato alcune difficoltà per rendere disponibile l'arresto al semplice utente desktop. Una tecnica comune è quella di consentire al gestore degli accessi, che di solito viene eseguito nel contesto di sicurezza dell'utente root, di gestire l'arresto e il riavvio. In questo caso la shell grafica invia una richiesta al gestore di accesso per arrestare il computer. Ciò implica l'utilizzo della comunicazione tra processi (IPC), generalmente 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 arresto) può verificare quali utenti sono autorizzati a causare l'arresto e attraverso il quale un amministratore può configurare tali autorizzazioni rispettivamente.

Alcuni ambienti desktop non utilizzano servizi basati su IPC ma piuttosto una serie di programmi di supporto per fornire le stesse o simili funzioni. Quei programmi di aiuto 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 muto programma di spegnimento tradizionale sulla shell non funziona in questo modo, richiede di vedere che viene eseguito in un contesto di superutente.


14

Perché Linux è comunemente usato come server o simile, e SSHing in un box 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 l'accesso in remoto utilizzandolo. Qualcuno con accesso alla GUI - beh, può spegnerlo da solo comunque con il pulsante di accensione fisico.

Inoltre, un utente connesso in remoto non sarà in grado di riattivarlo.


Non mi è venuto in mente quando ho posto questa domanda, ma suppongo che ci siano opzioni in Ubuntu per installare i pacchetti GUI in un server remoto e usare il server remoto tramite la GUI invece della riga di comando. (Simile a come funziona Windows Remote Desktop o Teamviewer). Ciò invaliderebbe il presupposto che qualcuno che utilizza Ubuntu tramite GUI possa arrestarsi con il pulsante di accensione fisico.
Aditya,

@aditya che ha bisogno che il server sia impostato in quel modo, cosa che l'amministratore deve decidere di fare
Manishearth,

Sì. Richiederebbe i privilegi di root per poter installare i pacchetti e configurarli come necessario. Ma questo scenario mi è venuto in mente mentre leggevo la tua risposta ieri e ho pensato di condividerla con te :-)
Aditya,

14

Quando riavvio tramite la GUI, posso farlo senza la mia sudopassword.

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

Perché? Cosa sta succedendo internamente al sistema Ubuntu lì?

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" dei protocolli di passaggio messaggi di basso livello come UDP. D'altra parte, trasporta i messaggi come elementi discreti, non flussi continui di dati.

D-Bus ha una visione strutturata dei dati che trasporta e tratta i dati in forma binaria; numeri integrali 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 shutdowncomando non controlla solo se qualcuno ha effettuato l'accesso? Sembra una caratteristica non commerciale per essere onesti. Immagino che a volte risparmierebbe tempo, ma spesso è preferibile una console coerente. Non voglio comandi a volte richiedono una password dopo l'esecuzione, a volte no.

I miei pronomi sono Lui / Lui


C'è anche una versione più breve tramite l'app qdbus
Sergiy Kolodyazhnyy

Quando si spegne / si disconnette da un DE (GNOME in questo caso) non viene richiesta la sudopassword di root / utente né con un altro utente connesso tramite GDM né con un altro utente connesso tramite tty.
kos

@kos hu, è strano. Quello screenshot è di Gnome 3, e ho effettuato l'accesso su gui e tty
Tim

Voglio dire, ricevo lo stesso messaggio, ma facendo clic su "Spegni" si procede e arresta il sistema. Ho anche chiesto a Fabby di testarlo e fa lo stesso anche per lui, non sono sicuro di cosa si tratti.
kos

@kos ohh. Hu aspetta.
Tim

9

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

Per un utente nella shell, potresti benissimo aver effettuato l'accesso in remoto, quindi il sistema richiede che tu abbia effettuato l'accesso come root per emettere un comando di spegnimento. Ciò impedisce a un utente normale connesso a un server di spegnerlo mentre altre persone lo utilizzano e che non c'è necessariamente nessuno fisicamente lì per avviare il backup del computer.

Il motivo per cui l'arresto non fornisce un prompt della GUI per la password del superutente è probabilmente semplicemente che non è possibile ottenere un'utilità reale lì - se ti trovi sulla console, dove apparirebbe il prompt, potresti semplicemente usare il cog- invece menu wheeel. Se si desidera avere un prompt della riga di comando per la password del superutente per l'arresto, è già disponibile con "sudo shutdown".


5

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

Idem anche i comandi Halt e PowerOff.


2
Grazie per la risposta, capisco che io come utente di una macchina utilizzata da dozzine non dovrei essere in grado di riavviare la macchina, ma cosa fa Ubuntu (o praticamente tutte le distro desktop) quando ho scelto di riavviare tramite il mouse invece della tastiera? Lo consentono senza privilegi.
asco,

3
Componenti come systemctl, loginctl, systemd, criteri di sistema, ecc. Consentono tutti all'utente attualmente connesso di accedere a determinate funzioni di root senza richiedere esplicitamente l'accesso di root per rendere l'esperienza desktop più user-friendly, ma questi non chiamano necessariamente la riga di comando comandi per eseguire tali compiti.
Jeff Sereno,
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.