Предел, какие процессы пользователь может перезапустить с супервизором?

14

Я использовал 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. Интернет, кажется, говорит, что такой сценарий небезопасен, если сделан неправильно. Мы также рассмотрели возможность написания собственного демона, который прослушивает команды от определенных пользователей и перезапускает процесс супервизора, если у пользователя есть разрешение. Эта идея кажется слишком сложной, если бы работало более простое решение.

davidscolgan
источник

Ответы:

33

Вы можете использовать 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.

larsks
источник
Ах, отлично. Это именно то, что я искал. Спасибо за вашу помощь!
Дэвидсколган
1
помните, что вы должны добавить эту строку после правил вроде%sudo ALL=(ALL:ALL) ALL
Павел Тявин