Zulassen, dass ein Benutzer ohne Rootberechtigung einen Dienst neu startet

27

Hintergrund :

Ich habe eine App namens myappmit Spring-boot. Es besteht aus einer selbstausführbaren JAR-Datei und ist mit systemd-Diensten kompatibel. Jetzt versuche ich, es mit jenkins zu integrieren.

Was ich will:

Ich möchte, dass Jenkins in der Lage sind:

  • Beenden Sie den Dienst.
  • Tauschen Sie das Glas aus.
  • Starten Sie den Dienst neu.

Problem:

Bisher können nur Sudoer Dienste starten / stoppen. Ich möchte nicht, dass Jenkins ein Sudoer ist (es scheint chaotisch).

Aktuelle Struktur:

Ich habe einen Benutzer, myappder einen /home/myappOrdner hat. Das generierte Glas wird aufgerufen myappund bei platziert /home/myapp. Der Benutzer myappist der Eigentümer des generierten JAR:

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

Ich habe einen SSH-Schlüssel platziert, damit sich Jenkins anmelden kann myapp@myserver.

Wie myappder Besitzer des Glases glaube ich, dass es eine Option geben könnte, mit der der Benutzer myappanrufen kann systemctl start/stop myapp. Eigentlich kann ich systemctl status myappaber nicht anrufen start/stop(root Passwort wird abgefragt).

Irgendwelche Vorschläge?

Arnaud Denoyelle
quelle
Ich sehe keinen Grund, dies als sudochaotisch zu betrachten . Es ist im Allgemeinen die Art und Weise, wie Sie so etwas implementieren sollten. Erstellen Sie eine Gruppe, weisen Sie ihr Ihren jenkins-Benutzer zu, und visudogeben Sie für diese Gruppe einen eingeschränkten Befehlssatz zum Verwalten des Dienstes an
brent
@brent Gibt es eine Möglichkeit, nur für den eigenen Service myappanrufen zu dürfen sudo systemctl?
Arnaud Denoyelle

Antworten:

24

sudoist der Weg zu gehen. Erstellen Sie eine neue Gruppe ( appadminzum Beispiel), fügen jenkinsSie Ihren Benutzer hinzu und visudofügen Sie einen neuen Eintrag mit einer begrenzten Liste von Befehlen hinzu, zum Beispiel:

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

Wenn Sie möchten, dass die appadminGruppe den Dienst ohne Eingabe eines Kennworts ausführen kann (nützlich, wenn der Benutzer beispielsweise nur durch einen SSH-Schlüssel authentifiziert wird),

Cmnd_Alias MYAPP_CMNDS = /bin/systemctl start myapp, /bin/systemctl stop myapp
%appadmin ALL=(ALL) NOPASSWD: MYAPP_CMNDS
brent
quelle
1
Vergessen Sie nicht die Anweisungsreihenfolge unix.stackexchange.com/a/13058/86443
Gilberto