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

19

Histórico:

Eu criei um aplicativo chamado myapp com Spring-boot . Consiste em um frasco auto-executável e é compatível com os serviços systemd. Agora, estou tentando integrá-lo a jenkins.

O que eu quero:

Eu quero que os jenkins sejam capazes de:

  • interrompa o serviço.
  • substitua o jarro.
  • reinicie o serviço.

Problema:

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

Estrutura atual:

Eu tenho um usuário myapp que tem uma pasta /home/myapp . O jar gerado é chamado myapp e é 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

Eu coloquei uma chave ssh para que os jenkins possam logar como myapp@myserver .

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

Alguma sugestão?

    
por Arnaud Denoyelle 25.04.2016 / 17:39

1 resposta

20

sudo é o caminho a percorrer. Crie um novo grupo ( appadmin por exemplo), coloque o seu usuário jenkins nele, e usando visudo adicione 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ê quiser que o grupo appadmin consiga 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
    
por 25.04.2016 / 17:58