Upstart: executa o serviço como usuário sem privilégios e pré-inicia o script como raiz

8

Tenho o seguinte trabalho inicial:

description "posty api"


start on mysql
stop on shutdown

env RACK_ENV=production

setuid vmail
setgid vmail

chdir /opt/posty_api

pre-start script
    mkdir -p /var/run/posty
    chown -R vmail:root /var/run/posty
end script

exec /usr/local/bin/unicorn -D -c /opt/posty_api/unicorn.rb --env production >> /var/log/posty/upstart.log 2>&1

post-stop exec kill 'cat /var/run/posty/unicorn.pid'

respawn
respawn limit 1 10

Para criar a pasta em /var/run , preciso de privilégios de root. Como posso executar algumas partes do job upstart como root e o próprio serviço como usuário sem privilégios?

    
por Christian 27.02.2014 / 06:45

2 respostas

9

upstart não tem nenhum recurso equivalente à configuração systemd PermissionsStartOnly . Todos os processos no job são executados conforme o usuário define via a setuid stanza , como diz o Cookbook.

Então, faça as coisas do jeito do daemontools.

Use setuidgid , setuidgid , s6-setuidgid , chpst , runuid ou setuidgid no exec estrofe:

exec \
setuidgid somebody \
unicorn -D -c /opt/posty_api/unicorn.rb --env production >> /var/log/posty/upstart.log 2>&1

É um mecanismo de registro terrível, por sinal. A forma do daemontools teria um registro adequado, com ciclo automático, rotacionável sob demanda, com tamanho limitado, usando multilog , multilog , s6-log , svlogd , tinylog , ou cyclog . upstart é difícil de integrar com esses, entretanto, dado seu mecanismo expect .

expect fork
exec \
setuidgid somebody \
unicorn -D -c /opt/posty_api/unicorn.rb --env production 2>&1 | \
/usr/local/bin/chdir /var/log/ \
setuidgid log \
cyclog posty/unicorn/

(O chdir aqui é o pacote de carregamento em cadeia do pacote nosh e não é estritamente necessário. Mas torna as coisas um pouco mais ordenadas.)

    
por 01.03.2014 / 18:51
0

você pode usar setguid no bloco de script e isso afetará apenas o bloco dado. Algo parecido com isto:

# Ubuntu upstart file at /etc/init/kafka.conf
description "kafka broker"

limit nofile 32768 32768

start on runlevel [2345]
stop on [!2345]

respawn
respawn limit 2 5

umask 007

kill timeout 300

pre-start script
    # here you are root
    ls -alh /root/
end script

chdir /usr/local/lib/kafka

script
    setuid kafka
    setgid kafka
    # here you are user/group kafka
    /usr/local/lib/kafka/bin/kafka-server-start.sh /usr/local/lib/kafka/config/server.properties
end script
    
por 23.06.2016 / 10:20

Tags