Я использовал supervisor для управления процессом Gunicorn, работающим на сайте Django, хотя этот вопрос может касаться всего, что управляется supervisor. Ранее я был единственным человеком, управляющим и использующим наш сервер, и супервизор просто работал от имени пользователя root, и я использовал sudo для запуска supervisorctl restart myapp
при необходимости.
Теперь наш сервер должен поддерживать несколько пользователей, работающих на разных сайтах, и каждый проект должен иметь возможность перезапускать свои собственные процессы Gunicorn, не имея возможности перезапустить процессы других пользователей.
Я следил за этим сообщением в блоге:
http://drumcoder.co.uk/blog/2010/nov/24/running-supervisorctl-non-root/
и был в состоянии разрешить пользователям без полномочий root использовать supervisorctl, но теперь любой может перезапустить чей-либо процесс. Судя по всему, у супервизора нет способа управления доступом для каждого пользователя.
У кого-нибудь есть идеи, как разрешить пользователям перезапускать только свои собственные процессы без рута?
РЕДАКТИРОВАТЬ: Некоторые вещи, о которых мы думали, включают в себя написание скрипта, принадлежащего пользователю root, с набором битов suid, который ничего не содержит, кроме как supervisorctl restart myapp
и помещение его в каталог пользователя, которому принадлежит myapp
. Интернет, кажется, говорит, что такой сценарий небезопасен, если сделан неправильно. Мы также рассмотрели возможность написания собственного демона, который прослушивает команды от определенных пользователей и перезапускает процесс супервизора, если у пользователя есть разрешение. Эта идея кажется слишком сложной, если бы работало более простое решение.