Назад | Перейти на главную страницу

Ограничить, какие процессы пользователь может перезапустить с супервизором?

Я использовал супервизор для управления процессом 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.