Iniciante: execute o serviço como usuário não privilegiado e o script de pré-inicialização 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 /var/run, preciso de privilégios de root. Como posso executar algumas partes do trabalho inicial como root e o próprio serviço como usuário não privilegiado?

cristão
fonte

Respostas:

9

upstartnão tem recurso equivalente para systemd's PermissionsStartOnlyconfiguração. Todos os processos no trabalho executado como o conjunto de usuário via a setuidestrofe , como diz o livro de receitas.

Então faça as coisas da maneira daemontools.

Use setuidgid, setuidgid, s6-setuidgid, chpst, runuid, ou setuidgidna execestrofe:

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

A propósito, esse é um mecanismo terrível de registro. A maneira daemontools teria um próprio, um ciclo automaticamente, rotações de-on-demand, cobertas de tamanho, faça o login usando multilog, multilog, s6-log, svlogd, tinylog, ou cyclog. upstarté difícil integrar-se com aqueles, no entanto, dado seu expectmecanismo .

esperar garfo
exec \
setuidgid alguém \
unicorn -D -c /opt/posty_api/unicorn.rb --env production 2> & 1 | \
/ usr / local / bin / chdir / var / log / \
setuidgid log \
sapatinho de tricô / unicórnio /

(O chdiraqui é o de carregamento em cadeia do noshpacote e não é estritamente necessário. Mas torna as coisas um pouco mais organizadas.)

JdeBP
fonte
Obrigado pela explicação e a dica para o log. Eu já criei dois upstartjobs, o trabalho de preparação com referência start on starting posty. Mas o registro é muito melhor que o meu.
Christian
0

você pode usar o setguid no bloco de scripts e isso afetará apenas o bloco especificado. Algo assim:

# 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
lvr
fonte
Isso não funcionou para mim. A seção de script não é executada.
weekens
1
Isso resulta em um setuid: not founderro.
RovingBlade