it-swarm.com.de

Zulassen, dass ein Benutzer ohne Rootberechtigung einen Dienst neu startet

Hintergrund :

Ich habe eine App namens myapp mit Spring-boot Erstellt. Es besteht aus einem selbstausführbaren JAR und ist mit systemd-Diensten kompatibel. Jetzt versuche ich es in Jenkins zu integrieren.

Was ich will :

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

  • beenden Sie den Dienst.
  • ersetzen Sie das Glas.
  • starten Sie den Dienst neu.

Problem :

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

Aktuelle Struktur :

Ich habe einen Benutzer myapp, der einen Ordner /home/myapp Hat. Das generierte Glas heißt myapp und wird bei /home/myapp Platziert. Der Benutzer myapp ist der Eigentümer des generierten JAR:

[email protected]:~/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 Jenkins sich als [email protected] Anmelden kann.

Da myapp der Eigentümer des JAR ist, gibt es möglicherweise eine Option, mit der der Benutzer myappsystemctl start/stop myapp Aufrufen kann. Eigentlich kann ich systemctl status myapp Aufrufen, aber nicht start/stop (Root-Passwort wird abgefragt).

Irgendwelche Vorschläge?

27

Sudo ist der richtige Weg. Erstellen Sie eine neue Gruppe (z. B. appadmin), fügen Sie Ihren jenkins Benutzer hinzu und fügen Sie mit visudo 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 Gruppe appadmin den Dienst ohne vorherige 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
26
brent