Ogranicz, które procesy użytkownik może uruchomić ponownie z przełożonym?

14

Użyłem przełożonego do zarządzania procesem Gunicorn prowadzącym witrynę Django, chociaż to pytanie może dotyczyć wszystkiego, czym zarządza przełożony. Wcześniej byłem jedyną osobą zarządzającą naszym serwerem i korzystającą z niego, a przełożony działał jako root i korzystałem z sudo, aby uruchamiać go w supervisorctl restart myapprazie potrzeby.

Teraz nasz serwer musi obsługiwać wielu użytkowników pracujących w różnych witrynach, a każdy projekt musi mieć możliwość zrestartowania własnych procesów gunicorn bez możliwości ponownego uruchomienia procesów innych użytkowników.

Śledziłem ten post na blogu:

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

i był w stanie zezwolić użytkownikom innym niż root na korzystanie z supervisorctl, ale teraz każdy może zrestartować procesy kogokolwiek innego. Wygląda na to, że przełożony nie ma możliwości przeprowadzenia kontroli dostępu dla poszczególnych użytkowników.

Czy ktoś ma jakieś pomysły na to, jak zezwolić użytkownikom na ponowne uruchomienie tylko własnych procesów bez rootowania?

EDYCJA: Niektóre rzeczy, o których myśleliśmy, to napisanie skryptu należącego do roota z zestawem bitów suid, który nie zawiera nic oprócz supervisorctl restart myappumieszczenia go w katalogu użytkownika, który jest właścicielem myapp. Internet wydaje się mówić, że taki skrypt jest niepewny, jeśli zostanie źle wykonany. Zastanawialiśmy się także nad stworzeniem niestandardowego demona, który nasłuchuje poleceń określonych użytkowników i ponownie uruchomi proces nadzorczy, jeśli użytkownik ma na to pozwolenie. Ten pomysł wydaje się zbyt skomplikowany, jeśli zadziałałoby prostsze rozwiązanie.

davidscolgan
źródło

Odpowiedzi:

33

Możesz użyć sudozamiast własnego skryptu, aby osiągnąć to samo. To znaczy, biorąc pod uwagę domyślną supervisordkonfigurację, w której może działać tylko root supervisorctl, możesz umieścić taki wpis w /etc/sudoers:

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

Umożliwiłoby aliceto uruchomienie sudo /usr/bin/supervisorctl restart app1jako root bez konieczności podawania hasła i pozwoliłoby bobna ponowne uruchomienie app2.

Larsks
źródło
Ach, świetnie. Właśnie tego szukałem. Dzięki za pomoc!
davidscolgan
1
pamiętaj, że powinieneś dodać ten ciąg według zasad takich jak%sudo ALL=(ALL:ALL) ALL
Павел Тявин