Batasi proses mana yang dapat dimulai ulang pengguna dengan penyelia?

14

Saya telah menggunakan pengawas untuk mengelola proses Gunicorn menjalankan situs Django, meskipun pertanyaan ini dapat berhubungan dengan apa pun yang dikelola oleh pengawas. Sebelumnya saya adalah satu-satunya orang yang mengelola dan menggunakan server kami, dan penyelia hanya menjalankan sebagai root dan saya akan menggunakan sudo untuk berjalan supervisorctl restart myappketika dibutuhkan.

Sekarang server kami harus mendukung banyak pengguna yang bekerja di situs yang berbeda, dan setiap proyek harus dapat memulai kembali proses gunicorn mereka sendiri tanpa dapat memulai kembali proses pengguna lain.

Saya mengikuti posting blog ini:

http://drumcoder.co.uk/blog/2010/nov/24/running-supervisorctl-non-root/

dan dapat memungkinkan pengguna non-root menggunakan supervisorctl, tetapi sekarang siapa pun dapat memulai kembali proses orang lain. Dari tampilannya, pengawas tidak memiliki cara melakukan kontrol akses per pengguna.

Adakah yang punya ide tentang cara memungkinkan pengguna untuk memulai kembali hanya proses mereka sendiri tanpa root?

EDIT: Beberapa hal yang kami pikirkan termasuk menulis skrip yang dimiliki oleh root dengan set bit suid yang tidak berisi apa-apa selain supervisorctl restart myappdan meletakkannya di direktori pengguna yang memiliki myapp. Internet sepertinya mengatakan bahwa skrip seperti itu tidak aman jika dilakukan secara salah. Kami juga mempertimbangkan untuk menulis daemon khusus yang mendengarkan perintah dari pengguna tertentu dan memulai kembali proses penyelia jika pengguna memiliki izin. Gagasan ini tampaknya terlalu rumit jika solusi yang lebih sederhana akan berhasil.

davidscolgan
sumber

Jawaban:

33

Anda dapat menggunakannya sudosebagai pengganti skrip khusus untuk melakukan hal yang sama. Artinya, mengingat supervisordkonfigurasi default , di mana hanya root yang dapat berjalan supervisorctl, Anda bisa memasukkan entri seperti ini ke /etc/sudoers:

alice ALL = (root) NOPASSWD:/usr/bin/supervisorctl restart app1
bob ALL = (root) NOPASSWD:/usr/bin/supervisorctl restart app2

Ini akan memungkinkan aliceuntuk dijalankan sudo /usr/bin/supervisorctl restart app1sebagai root tanpa harus memberikan kata sandi, dan itu akan memungkinkan bobuntuk memulai kembali app2.

larsks
sumber
Ah, bagus sekali. Ini persis seperti hal yang saya cari. Terima kasih atas bantuan Anda!
davidscolgan
1
keberatan bahwa Anda harus menambahkan string ini setelah aturan seperti%sudo ALL=(ALL:ALL) ALL
Павел Тявин