Bagaimana kita bisa mengizinkan pengguna non-root untuk mengontrol layanan system.d?

60

Dengan sysvinit, sudoersentri seperti ini sudah cukup:

%webteam cms051=/sbin/service httpd *

Ini akan memungkinkan perintah seperti:

  • sudo service httpd status
  • sudo service httpd restart

Sekarang, dengan systemd, nama layanan adalah argumen terakhir. Yaitu, restart layanan akan dilakukan dengan:

systemctl restart httpd.service

Secara alami, saya pikir mendefinisikan perintah sebagai systemctl * httpd.serviceakan bekerja tetapi itu akan memungkinkan sesuatu seperti systemctl restart puppet.service httpd.serviceyang bukan efek yang diinginkan.

Dengan mempertimbangkan itu, apa cara terbaik yang memungkinkan pengguna non-root untuk mengontrol system.dlayanan? Ini tidak harus sudoers; mungkin perubahan izin file mungkin cukup?

Belmin Fernandez
sumber
Saya belum menyentuh sudokonfigurasi untuk sementara waktu, tetapi tidak bisakah Anda melakukan sesuatu seperti itu cms051=systemctl * httpd.service?
John WH Smith
1
Ini akan memungkinkan Anda untuk memulai kembali layanan apa pun. Saya seharusnya memasukkan berita gembira itu dalam pertanyaan. Maaf.
Belmin Fernandez

Jawaban:

43

Cukup tambahkan semua perintah yang diperlukan sudoerssecara terpisah:

%webteam cms051=/usr/bin/systemctl restart httpd.service
%webteam cms051=/usr/bin/systemctl stop httpd.service
%webteam cms051=/usr/bin/systemctl start httpd.service 
%webteam cms051=/usr/bin/systemctl status httpd.service
Jofel
sumber
Saya berharap untuk menangkap semua perintah unit tetapi jika saya harus memerinci mereka, maka saya rasa itulah yang harus saya lakukan.
Belmin Fernandez
9
status tidak berguna, karena setiap pengguna dapat melakukannya
Dereckson
5
Apa cms051?
kevin
1
Jadi apa yang akan terjadi jika saya memanggil systemctl restart http.service mariadb.service ;-)? Mungkin mariadb akan dimulai kembali juga
Marek Wajdzik
1
@MarekWajdzik sudo tidak mengizinkan argumen tambahan jika seseorang tidak secara eksplisit diizinkan dengan *atau pola serupa.
jofel
31

@ jofel menjawab persis apa yang saya butuhkan untuk mendapatkan pengaturan yang berfungsi. Meminta ini untuk orang lain yang tersandung pada pertanyaan ini. Saya membutuhkan cara untuk capistranome-restart aplikasi Ruby saya setelah menggunakan dari mesin lokal saya. Itu berarti saya memerlukan akses tanpa kata sandi untuk memulai kembali systemdlayanan. INI adalah apa yang saya miliki dan bekerja dengan sangat baik!

Catatan : pengguna dan grup saya disebut deployer
Masukkan kode dalam file khusus di sini: /etc/sudoers.d/deployer
Kode:

%deployer ALL= NOPASSWD: /bin/systemctl start my_app
%deployer ALL= NOPASSWD: /bin/systemctl stop my_app
%deployer ALL= NOPASSWD: /bin/systemctl restart my_app
BoomShadow
sumber
Saya perlu menambahkan bahwa setelah masuk sebagai pengguna deployerdalam kasus ini, Anda harus menjalankan systemctlperintah dengan sudo.
Muyiwa Olu
8

Buat alias perintah dengan perintah yang Anda ingin mereka akses. Kemudian tetapkan grup ke alias perintah itu:

Cmnd_Alias APACHE-SVC = /usr/bin/systemctl stop httpd, /usr/bin/systemctl start httpd, /usr/bin/systemctl restart httpd

%webteam ALL=APACHE-SVC

Ini juga merupakan praktik yang baik untuk menempatkan pengeditan di /etc/sudoers.d/filename Anda daripada langsung mengedit file sudoers. Pastikan untuk menunjuk ke nama file .d / Anda di sudoers, yang kebanyakan distro baru lakukan. Menempatkan 2 baris ini di sudoers Anda harus melakukan trik:

## Read drop-in files from /etc/sudoers.d (the # here does not mean a comment)
#includedir /etc/sudoers.d

Catatan: Bahwa # di depanir tidak termasuk komentar. Itu harus tetap.

Kaya
sumber
Bagaimana menambahkan peluang untuk menjalankan stop / start / restart tanpa memasukkan kata sandi?
Nikolay Baranenko
IMO jawaban terbaik. Semua orang harus menambahkan alias perintah dan bekerja dengan ini.
DASKAjA
6

Paling aman untuk memerinci mereka seperti yang disarankan jofel .

Jika saya ingin mengizinkan seseorang menggunakan subset terbatas dari kemampuan perintah, saya tidak akan mempercayai wildcard dalam garis sudoers untuk melakukannya. Bahkan jika bahasanya lebih ekspresif daripada shell shell, ada terlalu banyak kotak sudut untuk dilacak.

Baris " service httpd *" relatif aman karena (verifikasi ini :) servicehanya memiliki satu flag yang berguna ( --status-all) yang tidak melakukan apa pun yang sangat sensitif, dan (verifikasi ini juga :) /etc/init.d/httpdhanya akan menerima baris perintah yang ingin Anda izinkan.

Jika ada begitu banyak kombinasi yang membuat daftar menjadi aneh, Anda mungkin harus mempertanyakan apa yang Anda lakukan. Tapi Anda bisa memberi mereka akses ke skrip pembantu yang ditulis dengan hati-hati yang menjalankan perintah untuk mereka (seperti /etc/init.d/http). Bahkan dalam kasus ini Anda harus setepat dan sejelas mungkin untuk mencantumkan dengan tepat perintah dan opsi apa yang diizinkan, dan jangan memberikan input pengguna apa pun secara langsung ke perintah target.

Jander
sumber