¿Por qué necesitamos ser root en la terminal para apagar y reiniciar?

65

Cuando instalamos / eliminamos / actualizamos paquetes o realizamos cambios que requieren privilegios administrativos, se nos solicita la contraseña del usuario administrador que tiene los sudoprivilegios, esto sucede tanto a través de la GUI como del terminal.

solicitud a través de gui

Sin embargo, si intentamos apagar y reiniciar a través de la terminal, se queja de que debemos ser root:

$ reboot
reboot: Need to be root

$ shutdown now
shutdown: Need to be root

Pero nunca se nos pide una contraseña cuando realizamos estas acciones a través de la rueda dentada en la parte superior derecha.

menú de rueda dentada

¿Por qué hay esta discrepancia?

Aditya
fuente
55
Buena pregunta ... Sabes lo que iba a preguntar lo mismo. Mi escenario era apagar Ubuntu con teclas de acceso directo. i, e cada vez que presiono alguna tecla asignada como ctrl + super + s , ejecuta el comando, sudo shutdown -h nowpero el problema es que sin el permiso de acceso shutdownnunca funciona. .. Espero que entiendas mi situación .. :)
Saurav Kumar
ver también: askubuntu.com/questions/1190/…
Takkat

Respuestas:

50

El apagado en la rueda dentada comprueba si se le permite apagar la máquina. Esto se hace a través de PolicyKit. En caso de apagado, /usr/share/polkit-1/actions/org.freedesktop.consolekit.policyse verifica esta declaración en el archivo :

<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 activa un dbus-sendcomando. En caso de apagado sería:

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

Hay un demonio ejecutándose en segundo plano con privilegios de root que invoca el comando de apagado por usted.

Cuando desee poder apagar la máquina "a la antigua usanza" a través de la línea de comando ( shutdown, reboot, halt, ...), debe agregar el Suid-Bit a esos comandos. Pero tenga en cuenta que todos en su sistema que tengan acceso al shell podrían apagar su máquina.

caos
fuente
14
Una opción un poco más segura sería permitir que los sudoers se apaguen sin contraseña, etc. Eso se logra fácilmente: ingresar sudo visudo, agregar %sudo ALL = NOPASSWD: /sbin/shutdown, /sbin/poweroff, /sbin/halt, /sbin/reboot, guardar y salir. De esta manera, aún será necesario reiniciar la línea de comandos sudo reboot, pero no tendrá que ingresar su contraseña.
Sebastian Thürrschmidt
27

Ubuntu es una distribución del sistema operativo GNU / Linux que a su vez pertenece a la familia de sistemas Unix, una arquitectura común para varios sistemas operativos modernos.

Tradicionalmente, Unix solía ejecutarse en computadoras mainframe. Instalaciones informáticas centrales que sirven a docenas o cientos de usuarios a través de terminales remotas. Como todos los usuarios confiaban en la disponibilidad del mainframe, a ningún usuario se le permitió emitir un comando de apagado. Una idea que es fundamental para la arquitectura Unix: el núcleo del sistema nunca inicializará un apagado a menos que la función correspondiente sea llamada por un proceso de superusuario.

En los sistemas de escritorio contemporáneos, los desarrolladores han pasado por ciertos problemas para hacer que el apagado esté disponible para el simple usuario de escritorio. Una técnica común es permitir que el administrador de inicio de sesión, que generalmente se ejecuta en el contexto de seguridad del usuario raíz, maneje el apagado y el reinicio. En este caso, el shell gráfico emite una solicitud al administrador de inicio de sesión para apagar la computadora. Esto implica el uso de la comunicación entre procesos (IPC), generalmente a través del servicio dbus.

El juego de políticas mencionado anteriormente extiende este proceso al proporcionar un marco estandarizado a través del cual el administrador de inicio de sesión (o cualquier programa que proporcione el servicio de apagado) puede verificar qué usuarios pueden causar un apagado, y a través de los cuales un administrador puede configurar esos permisos respectivamente.

Algunos entornos de escritorio no utilizan servicios basados ​​en IPC, sino más bien un conjunto de programas auxiliares para proporcionar las mismas funciones o funciones similares. Esos programas auxiliares se llamarían a través de mecanismos, lo que permitiría cambiar al contexto de superusuario, como sudo, suid o un mecanismo de kit de políticas similar a sudo.

En cualquier caso, el programa de apagado tradicional tonto en el shell no funciona de esta manera, requiere que veas que se ejecuta en un contexto de superusuario.

Paul Hänsch
fuente
14

Debido a que Linux se usa comúnmente como servidor o similar, y SSHing en una caja de Linux, incluso una computadora portátil Ubuntu normal, es bastante común.

La cuestión es que es posible que no desee que las personas con acceso SSH puedan cerrarlo, especialmente cuando puede haber otros usuarios conectados remotamente que lo usen. Alguien con acceso a la GUI; bueno, de todos modos puede apagarlo solo con el botón de encendido físico.

Además, un usuario que haya iniciado sesión de forma remota no podrá volver a encenderlo.

Manishearth
fuente
No se me ocurrió esa vez cuando hice esta pregunta, pero supongo que hay opciones en Ubuntu para instalar paquetes de GUI en un servidor remoto y usar el servidor remoto a través de GUI en lugar de la línea de comandos. (Similar a cómo funciona Windows Remote Desktop o Teamviewer). Entonces eso invalidaría la suposición de que alguien que usa Ubuntu a través de GUI puede apagarse con el botón de encendido físico.
Aditya
@aditya que necesita configurar el servidor de esa manera, lo que el administrador debe decidir hacer
Manishearth
Si. Se requerirían privilegios de root para poder instalar los paquetes y configurarlos según sea necesario. Pero este escenario vino a mi mente mientras leía su respuesta ayer y pensé en compartirlo con usted :-)
Aditya
14

Cuando reinicio a través de la GUI, puedo hacerlo sin mi sudocontraseña.

Solo si usted es el único que inició sesión. Si hay otros usuarios (incluidos los usuarios de la consola), es posible que deba ingresar una contraseña de root. Esto es lo mismo en OS X y en las versiones más recientes de Windows.

¿Porqué es eso? ¿Qué está pasando internamente con el sistema ubuntu allí?

El siguiente comando:

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

D-Bus es un mecanismo de IPC, un medio para la comunicación local entre procesos que se ejecutan en el mismo host.

D-Bus es "más inteligente" que los protocolos de paso de mensajes de bajo nivel como UDP. Por otro lado, transporta mensajes como elementos discretos, no flujos continuos de datos.

D-Bus tiene una vista estructurada de los datos que transporta y trata los datos en forma binaria; números integrales de varios anchos, cadenas, etc. Debido a que los datos no son solo "bytes sin procesar" para D-Bus, los mensajes se pueden validar.

- Escritorio gratis

¿Por qué el shutdowncomando no verifica si alguien ha iniciado sesión? Parece una característica poco mercenaria para ser honesto Me imagino que a veces ahorraría tiempo, pero a menudo se prefiere una consola consistente. No quiero que los comandos a veces requieran una contraseña después de ejecutarla, y a veces no.

Mis pronombres son El / El

Tim
fuente
También hay una versión más corta a través de la aplicación qdbus
Sergiy Kolodyazhnyy
Al cerrar / cerrar sesión desde un DE (GNOME en este caso) no se me solicita la sudocontraseña de usuario / root ni con otro usuario conectado a través de GDM ni con otro usuario conectado a través de tty.
kos
@kos hu, eso es extraño. Esa captura de pantalla es de Gnome 3, y he iniciado sesión en gui y tty
Tim
Me refiero a que recibo el mismo mensaje, pero al hacer clic en "Apagar" simplemente sigue adelante y apaga el sistema. También le pedí a Fabby que probara esto y también hace lo mismo para él, no estoy seguro de qué se trata.
kos
@kos ohh. Hu espera.
Tim
9

La razón por la que no necesita ser root para iniciar un apagado desde la GUI es en gran medida una cuestión de conveniencia para el usuario de escritorio típico. El sistema sabe que usted es el usuario que inició sesión en la consola, por lo que si apaga la computadora por error, presumiblemente puede volver a encenderla.

Para un usuario en el shell, es muy posible que inicie sesión de forma remota, por lo que el sistema requiere que inicie sesión como root para emitir un comando de apagado. Esto evita que un usuario habitual que inicie sesión en un servidor lo apague mientras otras personas lo están utilizando, y aunque no hay necesariamente nadie físicamente allí para iniciar la copia de seguridad de la computadora.

La razón por la que el apagado no proporciona una solicitud de GUI para la contraseña de superusuario probablemente sea simplemente que no hay una utilidad real que se pueda obtener allí: si está en la consola, donde aparecería la solicitud, podría usar la función cog- menú de ruedas en su lugar. Si desea tener un indicador de línea de comando para la contraseña de superusuario para el apagado, eso ya está disponible con "sudo shutdown".

Mark Bessey
fuente
5

En un sistema multiusuario, lo último que desea es que sus usuarios inicien sesión y puedan reiniciar aleatoriamente el servidor en cualquier momento, por lo tanto, la versión de línea de comando de Reboot es un comando solo para superusuario, por lo que necesita que sea root o tener derechos de sudo.

Lo mismo ocurre con los comandos Halt y PowerOff.

Jeff Sereno
fuente
2
Gracias por su respuesta, entiendo que yo, como usuario de una máquina utilizada por docenas, no debería poder reiniciar la máquina, pero ¿qué hace Ubuntu (o casi todas las distribuciones de escritorio) cuando elijo reiniciar con el mouse? en lugar del teclado? Permiten eso sin privilegios.
asco
3
Componentes como systemctl, loginctl, systemd, políticas del sistema, etc. todos permiten que el usuario actualmente conectado acceda a ciertas funciones raíz sin requerir explícitamente el acceso raíz para que la experiencia de escritorio sea más fácil de usar, pero no necesariamente llaman a la línea de comando comandos para realizar esas tareas.
Jeff Sereno