Zezwalanie użytkownikowi niebędącemu rootem na ponowne uruchomienie usługi

27

Tło :

Stworzyłem aplikację o nazwie myappwith Spring-boot. Składa się z wykonalnego słoika i jest kompatybilny z usługami systemowymi. Teraz próbuję zintegrować go z Jenkins.

Czego chcę:

Chcę, żeby Jenkins mógł:

  • zatrzymać usługę.
  • wymienić słoik.
  • uruchom ponownie usługę.

Problem:

Do tej pory tylko osoby sudoerskie mogły uruchamiać / zatrzymywać usługi. Nie chcę, żeby Jenkins był sudoerem (wydaje się bałagan).

Obecna struktura:

Mam użytkownika, myappktóry ma /home/myappfolder. Wygenerowany słoik jest wywoływany myappi umieszczany pod adresem /home/myapp. Użytkownik myappjest właścicielem wygenerowanego słoika:

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

Umieściłem klucz ssh, aby Jenkins mógł się zalogować jako myapp@myserver.

Podobnie myappjak właściciel słoika, myślę, że może istnieć opcja, która pozwala użytkownikowi myappzadzwonić systemctl start/stop myapp. Właściwie mogę dzwonić, systemctl status myappale nie mogę start/stop(wymagane jest hasło roota).

Jakieś sugestie?

Arnaud Denoyelle
źródło
Nie widzę powodu, aby uważać się za sudobałagan, jest to na ogół sposób, w jaki powinieneś wdrożyć coś takiego. Utwórz grupę, przypisz do niej swojego użytkownika Jenkins i za visudopomocą ograniczonego zestawu poleceń do zarządzania tą usługą
brent
@brent Czy istnieje sposób, aby zezwolić myappna dzwonienie sudo systemctltylko dla własnej usługi?
Arnaud Denoyelle,

Odpowiedzi:

24

sudojest droga. Utwórz nową grupę ( appadminna przykład), umieść jenkinsw niej użytkownika i za pomocą visudododaj nowy wpis z ograniczoną listą poleceń, na przykład:

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

Jeśli chcesz, aby appadmingrupa mogła obsługiwać usługę bez uprzedniego podania hasła (przydatne, jeśli użytkownik jest uwierzytelniany tylko na przykład za pomocą klucza SSH),

Cmnd_Alias MYAPP_CMNDS = /bin/systemctl start myapp, /bin/systemctl stop myapp
%appadmin ALL=(ALL) NOPASSWD: MYAPP_CMNDS
brent
źródło
1
Nie zapomnij o zamówieniu oświadczenie unix.stackexchange.com/a/13058/86443
Gilberto