Upstart: esegui il servizio come utente non privilegiato e pre-avvia lo script come root


8

Ho seguito il lavoro iniziale:

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

Per creare la cartella in /var/runho bisogno dei privilegi di root. Come posso eseguire alcune parti del processo di avvio come root e il servizio stesso come utente non privilegiato?

Risposte:


9

upstartnon ha alcuna struttura equivalente a systemd's PermissionsStartOnlyimpostazione. Tutti i processi nel lavoro vengono eseguiti dall'utente impostato tramite la setuidstanza , come dice il ricettario.

Quindi fai le cose alla maniera dei demoni.

Usa setuidgid, setuidgid, s6-setuidgid, chpst, runuid, o setuidgidnella execstanza:

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

Questo è un terribile meccanismo di registrazione, tra l'altro. Il modo in cui daemontools avrebbe un appropriata, e riacceso automaticamente, ruotabile-on-demand, dimensioni-capped, accedere utilizzando multilog, multilog, s6-log, svlogd, tinylog, o cyclog. upstartè difficile integrarsi con quelli, tuttavia, dato il suo expectmeccanismo .

aspettiamo forchetta
exec \
setuidgid qualcuno \
unicorno -D -c /opt/posty_api/unicorn.rb --env production 2> & 1 | \
/ usr / local / bin / chdir / var / log / \
setuidgid log \
postino di ciclog / unicorno /

( chdirQui è quello a catena dal noshpacchetto, e non è strettamente necessario. Ma rende le cose un po 'più ordinate.)


Grazie per la spiegazione e il suggerimento per la registrazione. Ho già creato due upstartjobs, con cui preparare il lavoro facendo riferimento start on starting posty. Ma la registrazione è molto meglio della mia.
Christian

0

puoi usare setguid nel blocco di script e influenzerà solo il blocco dato. Qualcosa come questo:

# 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

Questo non ha funzionato per me. La sezione script non viene eseguita.
settimana

1
Ciò provoca un setuid: not founderrore.
RovingBlade,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.