Cómo impedir que root ejecute un script

10

El servidor de aplicaciones Glassfish proporciona scripts para administrar el servidor de aplicaciones y también iniciarlos y detenerlos, y me gustaría restringir que el usuario root ejecute este script. La razón es que algunos desarrolladores clave se olvidan de administrar el servidor como usuario no privilegiado y si reinician el servidor de aplicaciones como usuario raíz, el usuario raíz debe ejecutar el servidor de aplicaciones [*].

No es una opción para evitar dar acceso a la raíz y los desarrolladores se olvidan porque están muy acostumbrados a hacer esto en su máquina local. Me gustaría que el asadminscript cambie para ejecutarse como usuario no privilegiado u opcionalmente muestre un mensaje de error cada vez que el script sea ejecutado por root.

Bash shell se utiliza.

[*]: Traté de corregir los derechos de los archivos, pero a pesar de que rastreé muchos archivos de los que es propietario y los modificó, la aplicación experimentó errores extraños y tengo que volver a ejecutarlos como root.

tronda
fuente

Respuestas:

18

Similar a las otras respuestas, pero en la dirección que quería.

if [[ $EUID -eq 0 ]]; then
  echo "This script must NOT be run as root" 1>&2
  exit 1
fi

Alternativamente, puede usar sudodentro de la secuencia de comandos para forzar la ejecución como usuario no privilegiado utilizando el -uindicador para especificar el usuario para ejecutar. No uso Glassfish, pero aquí hay un pseudo script de protoejemplo.

#!/bin/bash

if [ $1 == "start" ]; then
  sudo -u nobody /usr/bin/glassfish
fi

Con suerte se entiende la idea. Lo siento, no sé realmente cómo se ve el script o el nombre del usuario sin privilegios.

bahamat
fuente
2

@Tshepang tiene la idea correcta. No sé cuál es más portátil, pero aquí hay otras formas de detectar si el usuario es root:

id -u
$UID

Alternativamente, puede simplemente forzarlo a ejecutarse como otro usuario con los mismos parámetros:

if [[ "$USER" != appuser ]]
then
    exec sudo -u appuser "$0" "$@"
fi
l0b0
fuente
1
Esto es al revés. Quiere que root no ejecute este script.
bahamat
Oh, olvidé un sudopoco. Ahora debería hacer el trabajo.
l0b0
@TobySpeight No, el script no hace nada si el usuario es root, según lo previsto. Creo que su cambio también da como resultado un argumento adicional si $@está vacío, y lo he cambiado para usar un patrón que se encuentra en otro lugar.
l0b0
Gracias @TobySpeight, modificado. Estaba seguro de haber visto ese formulario en alguna parte como una forma de asegurarme de que los argumentos cero se pasan correctamente. También se ha corregido el cheque, lo que sin duda tenía un error (que no era una bomba tenedor, sino que simplemente llame a sí mismo indefinidamente.
l0b0
Yo diría que fue una bomba tenedor, porque cada instancia bifurcaría un nuevo shell para el sudo(no está usando exec) y el padre lo esperaría, por lo que eventualmente terminaría con una tabla de proceso completa. Todavía vale la pena ponerlo execallí (si no tiene la intención de que el código se fiejecute como el usuario incorrecto).
Toby Speight