Permitindo que um usuário não root reinicie um serviço

27

Fundo :

Eu criei um aplicativo chamado myappwith Spring-boot. Ele consiste em um jar auto-executável e é compatível com os serviços systemd. Agora, estou tentando integrá-lo ao jenkins.

O que eu quero:

Quero que Jenkins seja capaz de:

  • pare o serviço.
  • substitua o frasco.
  • reinicie o serviço.

Problema:

Até agora, apenas os sudoers podem iniciar / parar serviços. Eu não quero que Jenkins seja um sudoer (parece confuso).

Estrutura atual:

Eu tenho um usuário myappque tem uma /home/myapppasta. O jar gerado é chamado myappe colocado em /home/myapp. O usuário myappé o proprietário do jar gerado:

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

Coloquei uma chave ssh para que o jenkins possa registrar como myapp@myserver.

Como myappé o proprietário do jar, acho que pode haver uma opção que permita ao usuário myappligar systemctl start/stop myapp. Na verdade, eu posso ligar, systemctl status myappmas não start/stop(a senha root é solicitada).

Alguma sugestão?

Arnaud Denoyelle
fonte
Não vejo o motivo para considerar sudobagunçado; geralmente é assim que você deve implementar algo assim. Crie um grupo, atribua seu usuário jenkins a ele e use visudofornecer um conjunto de comandos limitado para esse grupo para gerenciar o serviço
brent
@brent Existe uma maneira de permitir myappligar sudo systemctlapenas para seu próprio serviço?
Arnaud Denoyelle

Respostas:

24

sudoé o caminho a percorrer. Crie um novo grupo ( appadminpor exemplo), coloque seu jenkinsusuário nele e, usando visudoadicionar uma nova entrada com uma lista limitada de comandos, por exemplo:

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

Se você deseja que o appadmingrupo possa operar o serviço sem inserir uma senha primeiro (útil se o usuário for autenticado apenas por uma chave SSH, por exemplo),

Cmnd_Alias MYAPP_CMNDS = /bin/systemctl start myapp, /bin/systemctl stop myapp
%appadmin ALL=(ALL) NOPASSWD: MYAPP_CMNDS
brent
fonte
11
Não se esqueça a ordem declaração unix.stackexchange.com/a/13058/86443
Gilberto