¿Cómo ejecutar un programa específico con privilegios de root (Ubuntu OS) cuando ningún usuario de sudo inicia sesión en el sistema?

3

¿Cómo ejecuto un programa específico con privilegios de root (Ubuntu OS) cuando ningún usuario de sudo ha iniciado sesión en el sistema? El programa necesita privilegios de root para funcionar correctamente. Un usuario normal no debería poder cerrar este proceso. Por ejemplo, tengo dos usuarios, Administrador y Cliente; El programa solo debe iniciarse cuando el cliente inicia sesión en el sistema. Necesita privilegios de root y el Cliente no debería poder cerrar este proceso.

Alejandro
fuente

Respuestas:

7

Hay algunas formas de hacer esto. El inicio de sesión gráfico de Ubuntu es proporcionado por GDM (o KDM si está usando Kubuntu). GDM es iniciado por el subsistema Upstart.

El proceso de inicio sigue estos pasos:

  1. Sistema de botas. Upstart inicia servicios, incluidos GDM ( / etc / init / gdm ).
  2. Se inicia GDM, inicializa el servidor X ( / etc / gdm / Init / * ) y presenta la ventana de inicio de sesión de la GUI.
  3. Un usuario inicia sesión.
    1. La autorización PAM ocurre ( /etc/pam.d/gdm )
    2. GDM ejecuta el script PostLogin ( / etc / gdm / PostLogin / * ).
    3. GDM ejecuta el script PreSession ( / etc / gdm / PreSession / * ).
    4. GDM ejecuta scripts Xsession y xinit
      ( / etc / gdm / Xsession , /etc/X11/xinit/xinitrc.d/* , / etc / X11 / Xsession , /etc/X11/Xsession.d/* )
  4. Aparece el escritorio del usuario.

Dónde ejecutar tu script

Todo antes de XSession se ejecuta como root. / etc / gdm / Xsession y todo lo demás después se ejecuta como usuario. Esto te deja con tres opciones reales sobre dónde ejecutar tu script.

  1. Modifique los scripts PostLogin o PreSession de GDM / KDM para ejecutar su programa. El nombre de usuario está disponible en las variables de entorno USER o USERNAME .

  2. Usa PAM para ejecutar tu script. PAM establecerá el usuario autorizante en la variable de entorno PAM_USER . Agregue esto a /etc/pam.d/gdm para comenzar su script:

    auth  required  pam_exec.so   /path/to/your/script
    
    • Es posible que pueda usar PAM para que coincida con un usuario en particular ( como en esta respuesta ), por lo que la secuencia de comandos solo se ejecutará para ese usuario y no será necesario que coincida con los propios usuarios. No tengo la experiencia PAM para explicar cómo hacer eso.

  3. Escriba una secuencia de comandos Upstart para ejecutar su programa. Su secuencia de comandos comenzará en el inicio de sesión del usuario, por lo que buscamos la señal de inicio de sesión de escritorio emitida por la secuencia de comandos PreSession de GDM .

    Entonces, un script Upstart detectaría esa señal como el disparador de ejecución:

    # start when GDM's PreSession script runs
    start on desktop-session-start
    

    La señal de PreSession no pasa el nombre de usuario, por lo que necesitará ajustar la señal. En / etc / gdm / PreSession / Default , busque la línea initctl y cámbiela por esta. También puede usar USERNAME en lugar de USER .

    # add USER variable so Upstart script can find it
    initctl -q emit desktop-session-start DISPLAY_MANAGER=gdm USER=$USER
    

    Consulte las páginas de manual de Upstart y su evento inicial para obtener más detalles.


Cómo evitar al usuario administrador

Su script necesitará examinar el usuario / nombre de usuario en las variables de entorno que obtiene de uno de estos métodos y usarlo para determinar si abortar o continuar. Los métodos estándar de script de shell funcionarán. Dependiendo de la ubicación de inicio que elija de la lista anterior, el nombre de usuario puede estar disponible en las variables de entorno USER , USERNAME o PAM_USER .

quijote curandero
fuente
1

Puede usar setuid , para ejecutar siempre el programa como root. Desde el punto de vista de la seguridad, esta es probablemente una muy, muy mala idea. Si uno de sus usuarios logró explotar el programa setuid, le dará acceso de root a todo el servidor

Mike1980
fuente
eso funciona si es un programa que el usuario quiere ejecutar. No creo que eso sea lo que este interrogador está buscando.
quack quijote