Autoriser un utilisateur non root à redémarrer un service

27

Contexte :

J'ai créé une application appelée myappavec Spring-boot. Il se compose d'un pot auto-exécutable et est compatible avec les services systemd. Maintenant, j'essaie de l'intégrer avec jenkins.

Ce que je veux:

Je veux que jenkins puisse:

  • arrêtez le service.
  • remplacer le pot.
  • redémarrez le service.

Problème:

Jusqu'à présent, seuls les sudoers peuvent démarrer / arrêter les services. Je ne veux pas que jenkins soit un sudoer (cela semble désordonné).

Structure actuelle:

J'ai un utilisateur myappqui a un /home/myappdossier. Le pot généré est appelé myappet placé à /home/myapp. L'utilisateur myappest propriétaire du pot généré:

myapp@myserver:~/backend$ ll
total 53900
drwxrwxr-x 2 myapp myapp     4096 Apr 25 17:09 ./
drwxr-xr-x 6 myapp myapp     4096 Apr 25 17:08 ../
-rw-rw-r-- 1 myapp myapp      511 Apr 20 16:13 application.properties
-rwxr--r-- 1 myapp myapp 55175294 Apr 20 19:06 backend-1.0-SNAPSHOT.jar*
lrwxrwxrwx 1 myapp myapp       24 Apr 20 19:20 myapp -> backend-1.0-SNAPSHOT.jar*
-rw-r--r-- 1 myapp myapp      179 Apr 20 19:26 myapp.service

J'ai placé une clé ssh pour que jenkins puisse se connecter en tant que myapp@myserver.

Comme myapple propriétaire du pot, je pense qu'il pourrait y avoir une option qui permet à l'utilisateur myappd'appeler systemctl start/stop myapp. En fait, je peux appeler systemctl status myappmais pas start/stop(le mot de passe root est demandé).

Aucune suggestion?

Arnaud Denoyelle
la source
Je ne vois pas la raison de considérer le sudodésordre, c'est généralement la façon dont vous devriez implémenter quelque chose comme ça. Créez un groupe, affectez-y votre utilisateur jenkins et utilisez visudofournit un jeu de commandes limité à ce groupe pour gérer le service
brent
@brent Existe-t-il un moyen de permettre myappd'appeler sudo systemctluniquement pour son propre service?
Arnaud Denoyelle

Réponses:

24

sudoest la voie à suivre. Créez un nouveau groupe ( appadminpar exemple), mettez-y votre jenkinsutilisateur et visudoajoutez une nouvelle entrée avec une liste limitée de commandes, par exemple:

Cmnd_Alias MYAPP_CMNDS = /bin/systemctl start myapp, /bin/systemctl stop myapp
%appadmin ALL=(ALL) MYAPP_CMNDS

Si vous souhaitez que le appadmingroupe puisse faire fonctionner le service sans saisir de mot de passe au préalable (utile si l'utilisateur n'est authentifié que par une clé SSH par exemple),

Cmnd_Alias MYAPP_CMNDS = /bin/systemctl start myapp, /bin/systemctl stop myapp
%appadmin ALL=(ALL) NOPASSWD: MYAPP_CMNDS
brent
la source
1
N'oubliez pas l'ordre de déclaration unix.stackexchange.com/a/13058/86443
Gilberto