¿Limitar qué procesos puede reiniciar un usuario con el supervisor?

14

He usado el supervisor para administrar un proceso de Gunicorn que ejecuta un sitio de Django, aunque esta pregunta podría referirse a cualquier cosa administrada por el supervisor. Anteriormente, era la única persona que administraba y usaba nuestro servidor, y el supervisor simplemente se ejecutaba como root y usaba sudo para ejecutar supervisorctl restart myappcuando era necesario.

Ahora nuestro servidor tiene que admitir múltiples usuarios que trabajan en diferentes sitios, y cada proyecto debe poder reiniciar sus propios procesos gunicorn sin poder reiniciar los procesos de otros usuarios.

Seguí esta publicación de blog:

http://drumcoder.co.uk/blog/2010/nov/24/running-supervisorctl-non-root/

y fue capaz de permitir que usuarios no root usen supervisorctl, pero ahora cualquiera puede reiniciar los procesos de otra persona. Por lo que parece, el supervisor no tiene una forma de hacer el control de acceso por usuario.

¿Alguien tiene alguna idea sobre cómo permitir a los usuarios reiniciar solo sus propios procesos sin root?

EDITAR: Algunas cosas en las que hemos pensado incluyen escribir un script propiedad de root con el conjunto de bits suid que no contiene nada más que supervisorctl restart myappponerlo en el directorio del usuario propietario myapp. Internet parece estar diciendo que tal script es inseguro si se hace mal. También consideramos escribir un demonio personalizado que escuche los comandos de usuarios específicos y reinicie el proceso del supervisor si el usuario tiene permiso. Esta idea parece demasiado complicada si una solución más simple funcionara.

davidscolgan
fuente

Respuestas:

33

Puede usar sudoen lugar de su script personalizado para lograr lo mismo. Es decir, dada la supervisordconfiguración predeterminada , en la que solo se puede ejecutar root supervisorctl, puede poner una entrada como esta en /etc/sudoers:

alice ALL = (root) NOPASSWD:/usr/bin/supervisorctl restart app1
bob ALL = (root) NOPASSWD:/usr/bin/supervisorctl restart app2

Esto permitiría aliceejecutarse sudo /usr/bin/supervisorctl restart app1como root sin tener que proporcionar una contraseña, y permitiría bobreiniciar app2.

larsks
fuente
Ah excelente. Este es exactamente el tipo de cosas que estaba buscando. ¡Gracias por tu ayuda!
davidscolgan
1
%sudo ALL=(ALL:ALL) ALL
Tenga en