Upstart: permettre à un utilisateur normal d'arrêter et de démarrer mon service personnalisé

16

J'ai démarré mon application de serveur Web au démarrage en utilisant upstart. Voici le script parvenu:

# 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

Cela fonctionne parfaitement sur le serveur Ubuntu 10.04 LTS et j'en suis très heureux.

Cependant, j'ai un script shell de déploiement qui se connecte en utilisant SSH en tant que mainuser(ce n'est pas un sudoer) et mettra ensuite à jour le répertoire de travail vers la dernière version de déploiement.

Le problème ici est que le service doit être redémarré pour que les applications chargent les nouveaux fichiers source. Cependant, mainuserobtient un ...

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

... en essayant de l'arrêter. Je dois courir sudo stop webapp, mais cet utilisateur ne peut pas le faire car il n'est pas sudoer. Pour des raisons de sécurité, je ne veux pas non plus qu'il soit sudoer, et je ne veux pas insérer le mot de passe sudo.

Alors, comment puis-je mainuserexécuter stop webappet start webapp?

À M
la source
1
Quels sont les problèmes de sécurité qui vous inquiètent en ajoutant l'utilisateur dans sudoers? Vous pouvez écrire une règle qui autorise l'utilisateur uniquement une commande spécifique et pas plus, vous pouvez également inclure une option nopasswd pour éloigner l'invite de mot de passe. Quant à l'erreur spécifique que vous obtenez, c'est parce que start / stop se trouve dans / sbin, qui ne fait généralement pas partie du chemin normal des utilisateurs. Vous pouvez donc faire "/ sbin / stop", ou ajouter sbin au chemin. Cela peut fonctionner tant qu'il n'y a pas d'autres éléments dans le script de démarrage / arrêt qui nécessitent root.
Derek Pressnall
@DerekPressnall, merci, mais quand je cours /sbin/stop webappje reçois stop: Unable to connect to system bus: Failed to connect to socket /var/run/dbus/system_bus_socket: No such file or directory. Comment pourrais-je permettre mainuserd'exécuter uniquement cette commande?
Tom
L'erreur est due au fait que cet utilisateur ne dispose pas des droits d'administrateur.
Tom

Réponses:

31

sudo est très configurable, vous pouvez autoriser cet utilisateur à exécuter un ensemble limité de commandes sans demander de mot de passe. La ligne suivante /etc/sudoersdoit faire ce que vous voulez:

mainuser ALL = (root) NOPASSWD: /sbin/start webapp, /sbin/stop webapp
mgorven
la source
1
Excellent, merci beaucoup. Avez-vous vraiment appris tout cela man sudoers? J'ai trouvé que c'était assez difficile à analyser.
Tom
1
Non, je l'ai déjà fait. Ce n'est pas la page de
manuel
Échoue avec Unable to connect to system bus. Plus: Autoriser un groupe non sudo à contrôler le travail Upstart
ciastek