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