Limiter les processus qu'un utilisateur peut redémarrer avec son superviseur?

14

J'ai utilisé le superviseur pour gérer un processus Gunicorn exécutant un site Django, bien que cette question puisse concerner tout ce qui est géré par le superviseur. Auparavant, j'étais la seule personne à gérer et à utiliser notre serveur, et le superviseur s'exécutait en tant que root et j'utilisais sudo pour exécuter en supervisorctl restart myappcas de besoin.

Maintenant, notre serveur doit prendre en charge plusieurs utilisateurs travaillant sur différents sites, et chaque projet doit pouvoir redémarrer leurs propres processus gunicorn sans pouvoir redémarrer les processus d'autres utilisateurs.

J'ai suivi ce billet de blog:

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

et a pu autoriser les utilisateurs non root à utiliser supervisorctl, mais maintenant tout le monde peut redémarrer les processus de n'importe qui d'autre. À première vue, le superviseur n'a aucun moyen de contrôler l'accès par utilisateur.

Quelqu'un a-t-il des idées sur la façon de permettre aux utilisateurs de redémarrer uniquement leurs propres processus sans root?

EDIT: Nous avons pensé à écrire un script appartenant à root avec le jeu de bits suid qui ne contient rien supervisorctl restart myappet le mettre dans le répertoire de l'utilisateur qui en est propriétaire myapp. Internet semble dire qu'un tel script n'est pas sûr s'il est mal fait. Nous avons également envisagé d'écrire un démon personnalisé qui écoute les commandes d'utilisateurs spécifiques et redémarre le processus de supervision si l'utilisateur a l'autorisation. Cette idée semble trop compliquée si une solution plus simple fonctionnait.

davidscolgan
la source

Réponses:

33

Vous pouvez utiliser sudoà la place de votre script personnalisé pour accomplir la même chose. Autrement dit, étant donné la supervisordconfiguration par défaut , dans laquelle seule la racine peut s'exécuter supervisorctl, vous pouvez mettre une entrée comme celle-ci dans /etc/sudoers:

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

Cela permettrait alicede s'exécuter en sudo /usr/bin/supervisorctl restart app1tant que root sans avoir à fournir de mot de passe et bobde redémarrer app2.

larsks
la source
Ah, excellent. C'est exactement le genre de chose que je cherchais. Merci de votre aide!
davidscolgan
1
rappelez-vous que vous devez ajouter cette chaîne après des règles comme%sudo ALL=(ALL:ALL) ALL
Павел Тявин