Perché non riesco ad eseguire l'arresto quando l'autorizzazione è rwxr-xr-x?


34

Sono dentro /sbine vedo che shutdownha i permessi rwxr-xr-x. Questo non significa che chiunque può eseguirlo?


1
qual è il comando che hai eseguito e qual è l'errore che ricevi?
slayedbylucifer

Penso che stia parlando del shutdowncomando.
Vinz,

Ho eseguito ./shutdown +30. Ottengo "arresto: è necessario essere root". Tuttavia, se le autorizzazioni dicono che chiunque può eseguire, perché devo essere root?
Korgan Rivera,

Immagino che chiunque possa spegnere la macchina. Proprio come in una GUI, chiunque può anche spegnerlo. Ma se stai dicendo che devi essere root, allora non lo so. Buona domanda però.
Kevdog777,

4
@ Kevdog777: su un GUI PolicyKit gestisce questo. È un demone con privilegi di root che controllerà se ti è permesso usare shutdown.
Vinz,

Risposte:


76

Chiunque può eseguire shutdown, ma l'attivazione di un arresto del sistema richiede i privilegi di root. Ma shutdownnon è setuid, quindi solo root può eseguirlo correttamente . Il shutdownprogramma è abbastanza carino da controllare i tuoi privilegi e farti sapere se c'è un problema, ma anche se provasse ingenuamente un arresto del sistema, non accadrebbe nulla.

GLENDOWER: Posso chiamare spiriti dal vasto profondo.
HOTSPUR: Perché, anche io, così posso fare qualsiasi uomo; Ma verranno quando li chiamerai?
(da Enrico IV)

shutdownnon è diverso da /bin/rm. Tutti possono eseguirlo, ma un utente normale non può rimuovere /etco la home directory di un altro utente.

In particolare: solo un processo in esecuzione con privilegi di root (UID 0 effettivo) può indirizzare il sistema init per arrestare i servizi di sistema, terminare tutti i processi dell'utente ed emettere la chiamata di sistema che arresta effettivamente la macchina. (Se shutdownfosse setuid, verrebbe eseguito come root indipendentemente da chi lo invoca; ma non lo è.)

Che ne dici di chiamare shutdownda una GUI, ad es. Con control-alt-del? È importante rendersi conto che in quel caso, shutdownè avviato direttamente da inite funziona con i privilegi di root. Quindi chiunque si avvicini alla console potrebbe potenzialmente spegnerlo. Se ciò non è desiderabile, control-alt-delete verrà effettivamente eseguito shutdown -a. (Vedi la documentazione citata da @ some1 nella loro risposta). Ciò indica shutdowndi verificare se l'utente attualmente connesso è autorizzato a eseguirlo. Ma questo è rilevante solo perché shutdownè in esecuzione come root in questo scenario.


2
Chiarimento: chiunque può eseguire il programma shutdown, ma quel programma non può effettivamente attivare un arresto del sistema a meno che l'utente corrente disponga dei privilegi di root. Destra?
LarsH

1
È praticamente tutto. I programmi vengono eseguiti con i privilegi dell'utente che invoca, a meno che non siano impostati. L'arresto del sistema richiede i privilegi di root, quindi non è possibile scrivere il proprio programma per farlo (tranne sfruttando le falle della sicurezza ecc.).
alexis,

Che cosa significa "spegnimento non impostato"?
Iain Samuel McLean Elder il

1
@Iain, i programmi vengono normalmente eseguiti con le autorizzazioni dell'utente che li invoca. Questo è anche il caso di shutdown. Un programma setuid viene eseguito con le autorizzazioni dell'utente proprietario dell'eseguibile. Ad esempio, /etc/passwdviene eseguito con i permessi di root per consentire di modificare il file della password. Vedi la manpage per chmod.
alexis

Sarebbe dovuto essere " /usr/bin/passwdeseguito con i permessi di root"! /etc/passwdnon è eseguibile (è il "file password" che viene modificato).
alexis,

15

Il binario shutdownstesso controlla se il tuo UID è 0.

Vedi l'output di strace di:

strace /sbin/shutdown -r -h now
...
...
geteuid()                               = 10001
setuid(10001)                           = 0
getuid()                                = 10001
write(2, "shutdown: Need to be root\n", 26shutdown: Need to be root
) = 26
exit_group(1)                           = ?

4
+1 per mostrare l'uso di strace ... questo è utile. Tuttavia, non vedo come questa traccia dimostri shutdownche il tuo UID è 0.
LarsH

1
Non lo vedrai nell'output di strace poiché riporta solo le chiamate di sistema. Puoi dedurre che quando un getuid è seguito da vicino scrivendo il messaggio di errore a cui il codice era simile if(getuid() != 0) printf("Need to be root");. Che in realtà il codice sorgente mostra che è.
msw

5

Sì ! Tutti possono eseguire quel comando. Come hai detto, sei in grado di eseguirlo ma ti trovi di fronte al messaggio "Devi essere root", non a permission denied. Il shutdowncomando controlla UIDse sei root o no.


-1

Sembra che l'arresto controllerà un elenco di accesso se lo contrassegni con -a:

ACCESS CONTROL
       shutdown can be called from init(8) when the magic keys CTRL-ALT-DEL are pressed, by creating an appropriate entry in /etc/inittab. This means that every‐
       one who has physical access to the console keyboard can shut the system down. To prevent this, shutdown can check to see if an authorized user  is  logged
       in  on  one of the virtual consoles. If shutdown is called with the -a argument (add this to the invocation of shutdown in /etc/inittab), it checks to see
       if the file /etc/shutdown.allow is present.  It then compares the login names in that file with the list of people that are logged in on a virtual console
       (from /var/run/utmp). Only if one of those authorized users or root is logged in, it will proceed. Otherwise it will write the message

       shutdown: no authorized users logged in

       to  the  (physical)  system  console.  The  format  of  /etc/shutdown.allow is one user name per line. Empty lines and comment lines (prefixed by a #) are
       allowed. Currently there is a limit of 32 users in this file.

Dato che al momento lo stai chiamando senza il flag -a, per impostazione predefinita consente solo gli arresti di root.

Se vuoi che altri utenti siano in grado di eseguire il comando, configura quel file e usa il flag.

Why can't I execute shutdown when the permission is rwxr-xr-x?

I bit di autorizzazione non escludono necessariamente il controllo dell'accesso basato su un utente o un gruppo.


Chiamarlo con -adalla riga di comando non farà alcuna differenza: shutdown -adeve comunque essere eseguito con i permessi di root (che initfornisce su control-alt-del).
alexis,
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.