¿Por qué no puedo ejecutar el apagado cuando el permiso es rwxr-xr-x?

34

Estoy dentro /sbiny veo que shutdowntiene permisos rwxr-xr-x. ¿No significa esto que cualquiera puede ejecutarlo?

Korgan Rivera
fuente
1
¿Cuál es el comando que ejecutó y cuál es el error que obtiene?
slayedbylucifer
Creo que está hablando del shutdowncomando.
Vinz
Corrí ./shutdown +30. Me sale "shutdown: necesita ser root". Sin embargo, si los permisos dicen que cualquiera puede ejecutar, ¿por qué debo ser root?
Korgan Rivera
Supongo que cualquiera puede apagar la máquina. Al igual que en una GUI, cualquiera puede apagarlo también. Pero si estás diciendo que necesitas ser root, entonces no lo sé. Buena pregunta sin embargo.
Kevdog777
44
@ Kevdog777: en un GUI PolicyKit gestiona esto. Es un demonio con privilegios de root que verificará si tiene permiso para usar shutdown.
Vinz

Respuestas:

76

Cualquiera puede ejecutar shutdown, pero activar un apagado del sistema requiere privilegios de root. Pero shutdownno es setuid, por lo que solo root puede ejecutarlo con éxito . losshutdown programa es lo suficientemente bueno como para verificar sus privilegios y hacerle saber si hay un problema, pero incluso si intentara ingenuamente apagar el sistema, no pasaría nada.

GLENDOWER: Puedo llamar a los espíritus desde las profundidades.
HOTSPUR: Por qué, yo también, o cualquier hombre; ¿Pero vendrán cuando los llames?
(de Henry IV)

shutdown no es diferente de /bin/rm . Todos pueden ejecutarlo, pero un usuario normal no puede eliminarlo /etc, o el directorio de inicio de otro usuario.

Específicamente: solo un proceso que se ejecute con privilegios de root (UID efectivo 0) puede ordenar al sistema init que detenga los servicios del sistema, finalice todos los procesos del usuario y emita la llamada al sistema que realmente detiene la máquina. (Si shutdownfuera setuid, se ejecutaría como root sin importar quién lo invoque; pero no lo es).

¿Qué pasa con las llamadas shutdowndesde una GUI, por ejemplo, con control-alt-del? Es importante darse cuenta de que en ese caso, shutdownse inicia directamente inity se ejecuta con privilegios de root. Por lo tanto, todos los que se acercan a la consola podrían apagarla. Si esto no es deseable, realmente se ejecutará control-alt-delete shutdown -a. (Consulte la documentación que @ some1 citó en su respuesta). Eso le indica shutdownque compruebe si el usuario que está conectado actualmente está autorizado para ejecutarlo. Pero esto solo es relevante porque se shutdownestá ejecutando como root en este escenario.

alexis
fuente
2
Aclaración: cualquiera puede ejecutar el programa shutdown, pero ese programa no puede activar un apagado del sistema a menos que el usuario actual tenga privilegios de root. ¿Correcto?
LarsH
1
Eso es practicamente todo. Los programas se ejecutan con los privilegios del usuario que invoca, a menos que estén configurados. Cerrar el sistema requiere privilegios de root, por lo que tampoco puede escribir su propio programa para hacerlo (excepto explotando agujeros de seguridad, etc.).
alexis
¿Qué significa "apagado no está configurado"?
Iain Samuel McLean Élder
1
@Iain, los programas normalmente se ejecutan con los permisos del usuario que los invoca. Este es también el caso con shutdown. Se ejecuta un programa setuid con los permisos del usuario propietario del ejecutable. Por ejemplo, se /etc/passwdejecuta con permisos de root para permitirle modificar el archivo de contraseña. Vea la página de manual de chmod.
alexis
¡Eso debería haber sido "se /usr/bin/passwdejecuta con permisos de root"! /etc/passwdno es ejecutable (es el "archivo de contraseña" que se está modificando).
alexis
15

El binario shutdownmismo verifica si su UID es 0.

Vea la salida de strace de:

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)                           = ?
caos
fuente
44
+1 para mostrar el uso de strace ... esto es útil. Sin embargo, no veo cómo este seguimiento muestra que shutdowncomprueba que su UID es 0.
LarsH
1
No verá eso en la salida de strace ya que solo informa las llamadas del sistema. Puede inferir que cuando se sigue de cerca un getuid escribiendo el mensaje de error con el que el código era similar if(getuid() != 0) printf("Need to be root");. Que, de hecho, el código fuente muestra que es.
msw
5

Si! Todos pueden ejecutar ese comando. Como dijiste, puedes ejecutarlo pero te enfrentas a un mensaje de "Necesito ser root", no a permission denied. El shutdowncomando comprueba tu UIDpara ver si eres root, o no.

Vinz
fuente
-1

Parece que el apagado verificará una lista de acceso si la marca 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.

Como actualmente lo está llamando sin el indicador -a, por defecto está permitido solo el apagado de la raíz.

Si desea que usuarios adicionales puedan ejecutar el comando, configure ese archivo y use el indicador.

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

Los bits de permiso no excluyen necesariamente el control de acceso basado en un usuario o grupo.

algunos1
fuente
Llamándola con -adesde la línea de comandos no hará ninguna diferencia: shutdown -aaún debe ser ejecutado con permisos de root (que initlos suministros en el control-alt-del).
Alexis