4 votos

¿Cómo puedo hacer que un script no elevado ejecute otro script específico como root sin requerir una contraseña del usuario?

Tengo un script, vamos a llamarlo on-event.sh, que se ejecutará en momentos específicos, como cuando se inicia o se cierra una aplicación en particular. El script en sí se ejecutará como el usuario actual (no root) ya que estaré utilizando BetterTouchTool para ejecutarlo.

Sin embargo, on-event.sh necesita de alguna manera activar la ejecución de otro script que debe ejecutarse como root, al que llamaré run-as-root.sh. run-as-root.sh ejecutará algunos comandos para cargar o descargar ciertos agentes de lanzamiento de terceros (no propios), por lo que necesita ejecutarse como root. Dado que todo esto ocurrirá en segundo plano, debe suceder sin necesidad de intervención del usuario, por lo que no puede usar sudo o with administrator privileges de AppleScript. Debido a las obvias implicaciones de seguridad, solo quiero que sea posible ejecutar run-as-root.sh como root y no cualquier script o comando de terminal arbitrario.

Una opción de la que ya soy consciente es que podría crear un agente de lanzamiento que abra un socket, espere una conexión y luego ejecute run-as-root.sh, y hacer que on-event.sh se conecte a ese socket. Pero esa es una solución más pesada y espero encontrar una manera más fácil de hacer esto.

¿Cómo puedo configurarlo para que sea posible?

10voto

Puedes usar sudo para permitir a un usuario ejecutar comandos específicos como root, sin necesidad de una contraseña.

Para permitir al usuario bribri ejecutar launchctl, ejecuta sudo visudo -f /etc/sudoers.d/launchctl y agrega

bribri ALL = (root) NOPASSWD: /bin/launchctl

luego guarda y sal. Después, el usuario puede ejecutar

sudo launchctl ...

sin que se le solicite una contraseña.

La advertencia aquí es que esto le otorga al usuario los derechos para iniciar/detener/cargar/descargar cualquier LaunchAgents/Daemons. Para evitar esto, se podría usar un script de shell para envolver la llamada a launchctl, pero esto trae una serie de riesgos de seguridad. Para al menos reducirlos

  • coloca el script en un directorio dedicado,
  • asegúrate de que tanto el directorio como el script sean propiedad de root y chmoded a 0700,
  • mantén el script lo más corto posible (incluye solo las cosas que deben ejecutarse como root),
  • usa rutas absolutas para todos los comandos llamados en el script,
  • evita depender de variables de entorno.

3voto

David Anderson Puntos 2189

Puedes escribir un programa simple que ejecutará el script run-as-root.sh como root. Por ejemplo, aquí está el programa en C que se muestra a continuación.

% cat run-as-root.c
#include 
#include 
#include 
int main() {
    setuid(0);
    system("./run-as-root.sh");
    return 0;
}

Tengo instaladas herramientas de desarrollador de línea de comandos, así que puedo ingresar lo siguiente para crear el ejecutable run-as-root, que se ejecutará como usuario root.

% sudo rm -f run-as-root
% gcc run-as-root.c -o run-as-root
% sudo chown root run-as-root
% sudo chmod u+s run-as-root   

A continuación se muestran los scripts de ejemplo on-event.sh y run-as-root.sh. También se muestran los permisos de archivo y los propietarios.

% cat on-event.sh
echo "Soy on-event.sh y mi id de usuario es $(id -u)"
./run-as-root
%
% cat run-as-root.sh
echo "Soy run-as-root.sh y mi id de usuario es $(id -u)"
%
% chmod +x on-event.sh run-as-root.sh
% ls -l run-as-root on-event.sh run-as-root.sh
-rwxr-xr-x@ 1 davidanderson  staff     14 Apr 30 13:04 on-event.sh
-rwsr-xr-x  1 root           staff  49472 Apr 30 13:24 run-as-root
-rwxr-xr-x@ 1 davidanderson  staff     30 Apr 30 13:26 run-as-root.sh

Ejecutar el script on-event resultará en que el script run-as-root.sh se ejecute como usuario root. (El usuario root tiene un id de usuario de 0.)

% ./on-event.sh
Soy on-event.sh y mi id de usuario es 501
Soy run-as-root.sh y mi id de usuario es 0

0voto

Christopher Scott Puntos 665

Si tu problema son los permisos de archivo; macOS, al igual que todos sus hermanos unix, soporta los bits "setuid" y "setgid" en archivos. (Y el bit pegajoso en directorios a través del mismo modelo, pero eso está fuera del alcance de esta respuesta). Según el artículo de setuid de Wikipedia:

Las banderas de derechos de acceso Unix y Linux setuid y setgid (abreviaturas de identidad de usuario establecida e identidad de grupo establecida) permiten a los usuarios ejecutar un ejecutable con los permisos del sistema de archivos del propietario del ejecutable o del grupo respectivamente y cambiar el comportamiento en directorios. A menudo se utilizan para permitir a los usuarios en un sistema informático ejecutar programas con privilegios temporalmente elevados para realizar una tarea específica. Aunque los privilegios de id de usuario o id de grupo asumidos proporcionados no siempre están elevados, como mínimo son específicos.

Un archivo puede ser chmoded 4755, y al ser ejecutado por cualquier usuario, heredará los permisos de sistema de archivos del usuario que es propietario del archivo. Ten en cuenta que si chown un archivo, elimina cualquiera de los bits setuid/setgid/pegajoso, así que primero chown, segundo chmod.

Si tu problema es la autorización de ejecución elevada, la respuesta de nohillside sobre configurar sudo de manera apropiada es más relevante.

Ver también: Una explicación detallada de setuid en una respuesta de unix.se

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X