Limitar quais processos um usuário pode reiniciar com o supervisor?

14

Eu usei o supervisor para gerenciar um processo Gunicorn executando um site do Django, embora essa pergunta possa pertencer a qualquer coisa sendo gerenciada pelo supervisor. Anteriormente, eu era a única pessoa gerenciando e usando nosso servidor, e o supervisor apenas executava como root e usava o sudo para executar supervisorctl restart myappquando necessário.

Agora, nosso servidor precisa oferecer suporte a vários usuários que trabalham em sites diferentes, e cada projeto precisa poder reiniciar seus próprios processos gunicorn sem poder reiniciar os processos de outros usuários.

Eu segui esta postagem no blog:

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

e foi capaz de permitir que usuários não raiz usassem supervisorctl, mas agora qualquer um pode reiniciar os processos de qualquer outra pessoa. Pelo que parece, o supervisor não tem como executar o controle de acesso por usuário.

Alguém tem alguma idéia de como permitir que os usuários reiniciem apenas seus próprios processos sem raiz?

EDIT: Algumas coisas que pensamos incluem escrever um script de propriedade root com o conjunto suid bit que não contém nada além de supervisorctl restart myappcolocá-lo no diretório do usuário que possui myapp. A internet parece estar dizendo que esse script é inseguro se feito de maneira errada. Também consideramos escrever um daemon personalizado que escuta comandos de usuários específicos e reinicia o processo do supervisor se o usuário tiver permissão. Essa idéia parece excessivamente complicada se uma solução mais simples funcionar.

davidscolgan
fonte

Respostas:

33

Você pode usar sudono lugar do seu script personalizado para realizar a mesma coisa. Ou seja, dada a supervisordconfiguração padrão , na qual apenas o root pode ser executado supervisorctl, você pode colocar uma entrada como esta em /etc/sudoers:

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

Isso permitiria aliceexecutar sudo /usr/bin/supervisorctl restart app1como root sem precisar fornecer uma senha e permitir bobreiniciar app2.

larsks
fonte
Ah, excelente. Este é exatamente o tipo de coisa que eu estava procurando. Obrigado pela ajuda!
Davidscolgan
1
lembre-se de que você deve adicionar essa sequência de caracteres após regras como #%sudo ALL=(ALL:ALL) ALL
Павел Тявин