Limitare i processi che un utente può riavviare con il supervisore?


14

Ho usato il supervisore per gestire un processo Gunicorn che esegue un sito Django, anche se questa domanda potrebbe riguardare qualsiasi cosa gestita dal supervisore. In precedenza ero l'unica persona che gestiva e utilizzava il nostro server, e il supervisore aveva appena funzionato come root e avrei usato sudo per eseguire supervisorctl restart myappquando necessario.

Ora il nostro server deve supportare più utenti che lavorano su siti diversi e ogni progetto deve essere in grado di riavviare i propri processi di gunicorn senza essere in grado di riavviare i processi di altri utenti.

Ho seguito questo post sul blog:

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

ed è stato in grado di consentire agli utenti non root di utilizzare supervisorctl, ma ora chiunque può riavviare i processi di chiunque altro. A quanto pare, il supervisore non ha modo di controllare gli accessi per utente.

Qualcuno ha qualche idea su come consentire agli utenti di riavviare solo i propri processi senza root?

EDIT: Alcune cose a cui abbiamo pensato includono la scrittura di uno script di proprietà di root con il set di bit di suid che non contiene altro che l' supervisorctl restart myappinserimento nella directory dell'utente proprietario myapp. Sembra che Internet stia dicendo che una tale sceneggiatura non è sicura se eseguita in modo errato. Abbiamo anche considerato la possibilità di scrivere un demone personalizzato che ascolta i comandi di utenti specifici e riavvia il processo del supervisore se l'utente ha l'autorizzazione. Questa idea sembra eccessivamente complicata se una soluzione più semplice funzionerebbe.

Risposte:


33

Puoi usare sudoal posto del tuo script personalizzato per ottenere lo stesso risultato. Cioè, data la supervisordconfigurazione predefinita , in cui può essere eseguito solo root supervisorctl, puoi inserire una voce come questa in /etc/sudoers:

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

Ciò consentirebbe alicel'esecuzione sudo /usr/bin/supervisorctl restart app1come root senza dover fornire una password e consentirebbe il bobriavvio app2.


Ah, eccellente. Questo è esattamente il tipo di cosa che stavo cercando. Grazie per l'aiuto!
davidscolgan,

1
%sudo ALL=(ALL:ALL) ALL
tieni
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.