Upstart: permitindo que um usuário normal pare e inicie meu serviço personalizado

16

Eu tenho meu aplicativo de servidor da web iniciando na inicialização usando o upstart. Este é o script inicial:

# web app node upstart file at /etc/init/webapp.conf

description "web application"

start on started mongodb
stop on runlevel [06]

respawn
respawn limit 10 100

env NODE_ENV=production

pre-start script
    ulimit -n 2048
end script

exec start-stop-daemon --start -c mainuser --exec /usr/bin/make -- -C /home/mainuser/app start-prod

Isso funciona perfeitamente no servidor Ubuntu 10.04 LTS e estou muito feliz com isso.

No entanto, eu tenho um script de shell de implantação que efetua login usando o SSH como mainuser(este não é um sudoer) e atualiza o diretório ativo para a versão de implantação mais recente.

O problema aqui é que o serviço precisa ser reiniciado para que os aplicativos carregem os novos arquivos de origem. No entanto, mainuserrecebe uma ...

mainuser@Saturn101:~$ stop webapp
-bash: stop: command not found

... ao tentar pará-lo. Eu tenho que executar sudo stop webapp, mas este usuário não pode fazer isso, pois ele não é um sudoer. Por motivos de segurança, também não quero que ele seja um sudoer, além de não inserir a senha do sudo.

Então, como permito mainusercorrer stop webappe start webapp?

Tom
fonte
11
Com que problemas de segurança você se preocupa ao adicionar o usuário a sudoers? Você pode escrever uma regra que permita ao usuário apenas um comando específico e não mais, além de incluir uma opção nopasswd para manter afastado o prompt de senha. Quanto ao erro específico que você está recebendo, isso ocorre porque o start / stop está em / sbin, que geralmente não faz parte do caminho normal dos usuários. Então você pode fazer "/ sbin / stop" ou adicionar sbin ao caminho. Isso pode funcionar desde que não haja outros itens no script start / stop que exijam raiz.
Derek Pressnall
@DerekPressnall, obrigado, mas quando corro /sbin/stop webappeu recebo stop: Unable to connect to system bus: Failed to connect to socket /var/run/dbus/system_bus_socket: No such file or directory. Como eu permiti mainuserexecutar apenas este comando?
Tom
O erro é o resultado deste usuário não ter direitos de administrador.
Tom

Respostas:

31

sudo é muito configurável, você pode permitir que esse usuário execute um conjunto limitado de comandos sem solicitar uma senha. A seguinte linha /etc/sudoersdeve fazer o que você deseja:

mainuser ALL = (root) NOPASSWD: /sbin/start webapp, /sbin/stop webapp
mgorven
fonte
11
Excelente, muito obrigado. Você realmente aprendeu tudo isso man sudoers? Achei muito difícil analisar.
19412 Tom
11
Não, eu já fiz isso antes. Não é a página de manual mais fácil de decifrar :-)
mgorven
Falha com Unable to connect to system bus. Mais: Permitir grupo não sudo para controlar trabalho Upstart
ciastek