Mengizinkan pengguna non-root untuk memulai kembali layanan

27

Latar Belakang :

Saya membuat aplikasi bernama myappwith Spring-boot. Ini terdiri dari toples yang dapat dieksekusi sendiri dan kompatibel dengan layanan systemd. Sekarang, saya mencoba mengintegrasikannya dengan jenkins.

Apa yang saya inginkan:

Saya ingin jenkins dapat:

  • hentikan layanan.
  • ganti toples.
  • mulai ulang layanan.

Masalah:

Hingga kini, hanya sudoer yang dapat memulai / menghentikan layanan. Saya tidak ingin jenkins menjadi sudoer (sepertinya berantakan).

Struktur saat ini:

Saya memiliki pengguna myappyang memiliki /home/myappfolder. Guci yang dihasilkan disebut myappdan ditempatkan di /home/myapp. Pengguna myappadalah pemilik toples yang dibuat:

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

Saya menempatkan kunci ssh sehingga jenkins dapat login sebagai myapp@myserver.

Seperti myapppemilik toples, saya pikir mungkin ada opsi yang memungkinkan pengguna myappuntuk menelepon systemctl start/stop myapp. Sebenarnya, saya bisa menelepon systemctl status myapptetapi tidak start/stop(kata sandi root diminta).

Ada saran?

Arnaud Denoyelle
sumber
Saya tidak melihat alasan untuk menganggapnya sudoberantakan, umumnya Anda harus menerapkan sesuatu seperti ini. Buat grup, tetapkan pengguna jenkins Anda ke dalamnya dan gunakan visudomenyediakan perintah terbatas yang ditetapkan untuk grup itu untuk mengelola layanan
brent
@brent Apakah ada cara untuk memungkinkan myapppanggilan sudo systemctlhanya untuk layanannya sendiri?
Arnaud Denoyelle

Jawaban:

24

sudoadalah cara untuk pergi. Buat grup baru ( appadminmisalnya), masukkan jenkinspengguna Anda di dalamnya, dan gunakan visudotambahkan entri baru dengan daftar perintah yang terbatas, misalnya:

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

Jika Anda ingin appadmingrup dapat mengoperasikan layanan tanpa memasukkan kata sandi terlebih dahulu (berguna jika pengguna hanya diautentikasi oleh kunci SSH misalnya),

Cmnd_Alias MYAPP_CMNDS = /bin/systemctl start myapp, /bin/systemctl stop myapp
%appadmin ALL=(ALL) NOPASSWD: MYAPP_CMNDS
brent
sumber
1
Jangan lupa urutan pernyataan unix.stackexchange.com/a/13058/86443
Gilberto