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


Użyłem przełożonego do zarządzania procesem Gunicorn obsługującym witrynę Django, chociaż to pytanie może dotyczyć wszystkiego, co jest nadzorowane. Kiedyś byłem jedyną osobą, która zarządzała naszym serwerem i korzystała z niego, a nadzorca zaczynał tylko jako root i użyłem sudo do uruchomienia
       supervisorctl restart myapp
Jeśli to konieczne.
Nasz serwer powinien teraz obsługiwać wielu użytkowników działających w różnych witrynach, a każdy projekt powinien mieć możliwość ponownego uruchomienia własnych procesów uruchamiania bez możliwości ponownego uruchamiania procesów innych użytkowników.
Śledziłem ten post na blogu:
http://drumcoder.co.uk/blog/20 ... root/
http://drumcoder.co.uk/blog/20 ... root/
i był w stanie pozwolić użytkownikom innym niż root na korzystanie z supervisorctl, ale teraz każdy może ponownie uruchomić procesy innych osób. Najwyraźniej nadzorca nie ma możliwości kontrolowania dostępu dla każdego użytkownika.
Czy ktoś ma pomysł, jak zezwolić użytkownikom na ponowne uruchamianie tylko własnych procesów bez uprawnień administratora?
EDYCJA: Niektóre z rzeczy, o których myśleliśmy, obejmują napisanie skryptu należącego do roota z zestawem bitów suid, które zawierają tylko
       supervisorctl restart myapp
i umieszczenie go w katalogu użytkownika, który jest właścicielem
       myapp
... Internet wydaje się mówić, że taki scenariusz jest niebezpieczny, jeśli zostanie wykonany nieprawidłowo. Przyjrzeliśmy się również pisaniu niestandardowego demona, który nasłuchuje poleceń określonych użytkowników i restartuje proces nadzorcy, jeśli użytkownik ma uprawnienia. Pomysł wydaje się zbyt skomplikowany, gdyby zadziałało prostsze rozwiązanie.
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Możesz użyć
         sudo
zamiast własnego skryptu, aby zrobić to samo. To znaczy, biorąc pod uwagę wartość domyślną
         supervisord
konfiguracja, w której może działać tylko root
         supervisorctl
, możesz umieścić taki rekord
/etc/sudoers
:
alice ALL = (root) NOPASSWD:/usr/bin/supervisorctl restart app1
bob ALL = (root) NOPASSWD:/usr/bin/supervisorctl restart app2

To by pozwoliło
         alice
uciec
         sudo/usr/bin/supervisorctl restart app1
jako root bez konieczności podawania hasła, a to pozwoli
         bob
zacząć od nowa
         app2
.

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się