Permitir que un usuario no root reinicie un servicio

27

Fondo :

Creé una aplicación llamada myappcon Spring-boot. Consiste en un jar autoejecutable y es compatible con los servicios systemd. Ahora, estoy tratando de integrarlo con Jenkins.

Lo que quiero:

Quiero que Jenkins pueda:

  • detener el servicio
  • reemplazar el frasco
  • reiniciar el servicio.

Problema:

Hasta ahora, solo los sudoers pueden iniciar / detener servicios. No quiero que Jenkins sea un sudoer (parece desordenado).

Estructura actual:

Tengo un usuario myappque tiene una /home/myappcarpeta. El jar generado se llama myappy se coloca en /home/myapp. El usuario myappes el propietario del jar generado:

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

Coloqué una clave ssh para que jenkins pueda iniciar sesión como myapp@myserver.

Como myappes el propietario del jar, creo que puede haber una opción que permita al usuario myappllamar systemctl start/stop myapp. En realidad, puedo llamar systemctl status myapppero no start/stop(se solicita la contraseña de root).

¿Alguna sugerencia?

Arnaud Denoyelle
fuente
No veo la razón para considerar sudodesordenado, generalmente es la forma en que debería implementar algo así. Cree un grupo, asígnele su usuario jenkins y use visudoun conjunto de comandos limitado para ese grupo para administrar el servicio
brent
@brent ¿Hay alguna manera de permitir myappllamar sudo systemctlsolo para su propio servicio?
Arnaud Denoyelle

Respuestas:

24

sudoEs el camino a seguir. Cree un nuevo grupo ( appadminpor ejemplo), coloque a su jenkinsusuario en él y visudoagregue una nueva entrada con una lista limitada de comandos, por ejemplo:

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

Si desea que el appadmingrupo pueda operar el servicio sin ingresar una contraseña primero (útil si el usuario solo se autentica con una clave SSH, por ejemplo),

Cmnd_Alias MYAPP_CMNDS = /bin/systemctl start myapp, /bin/systemctl stop myapp
%appadmin ALL=(ALL) NOPASSWD: MYAPP_CMNDS
brent
fuente
1
No olvide la orden de la declaración unix.stackexchange.com/a/13058/86443
Gilberto