Upstart: permitir que un usuario normal pare e inicie mi servicio personalizado

16

Tengo mi aplicación de servidor web comenzando en el arranque usando upstart. Este es el script de inicio:

# web app node upstart file at /etc/init/webapp.conf

description "web application"

start on started mongodb
stop on runlevel [06]

respawn
respawn limit 10 100

env NODE_ENV=production

pre-start script
    ulimit -n 2048
end script

exec start-stop-daemon --start -c mainuser --exec /usr/bin/make -- -C /home/mainuser/app start-prod

Esto funciona perfectamente en el servidor Ubuntu 10.04 LTS y estoy muy contento con eso.

Sin embargo, tengo un script de shell de implementación que inicia sesión usando SSH como mainuser(esto no es un sudoer) y luego actualizará el directorio de trabajo a la última versión de implementación.

El problema aquí es que el servicio debe reiniciarse para que las aplicaciones carguen los nuevos archivos fuente. Sin embargo, mainuserobtiene un ...

mainuser@Saturn101:~$ stop webapp
-bash: stop: command not found

... cuando intentas detenerlo. Tengo que correr sudo stop webapp, pero este usuario no puede hacer esto porque no es un sudoer. Por razones de seguridad, tampoco quiero que sea un sudoer, además no quiero insertar la contraseña de sudo.

Entonces, ¿cómo dejo mainusercorrer stop webappy start webapp?

Tom
fuente
1
¿Qué problemas de seguridad le preocupan al agregar al usuario en sudoers? Puede escribir una regla que le permita al usuario solo un comando específico y no más, también puede incluir una opción nopasswd para mantener alejada la solicitud de contraseña. En cuanto al error específico que obtienes, eso se debe a que start / stop están en / sbin, que generalmente no es parte de la ruta normal de los usuarios. Entonces puede hacer "/ sbin / stop", o agregar sbin a la ruta. Esto puede funcionar siempre que no haya otros elementos en el script de inicio / detención que requieran root.
Derek Pressnall
@DerekPressnall, gracias, pero cuando corro /sbin/stop webappme sale stop: Unable to connect to system bus: Failed to connect to socket /var/run/dbus/system_bus_socket: No such file or directory. ¿Cómo permitiría mainuserejecutar solo este comando?
Tom
El error es el resultado de que este usuario no tiene derechos de administrador.
Tom

Respuestas:

31

sudo es muy configurable, puede permitir que este usuario ejecute un conjunto limitado de comandos sin solicitar una contraseña. La siguiente línea /etc/sudoersdebe hacer lo que quieras:

mainuser ALL = (root) NOPASSWD: /sbin/start webapp, /sbin/stop webapp
mgorven
fuente
1
Excelente, muchas gracias. ¿Realmente aprendiste todo esto man sudoers? Me pareció bastante difícil de analizar.
Tom
1
No, ya he hecho esto antes. No es la página de manual más fácil de descifrar :-)
mgorven
Falla con Unable to connect to system bus. Más: Permitir que un grupo que no sea sudo controle el trabajo de Upstart
ciastek