Upstart: Uruchom usługę jako nieuprzywilejowany użytkownik, a skrypt startowy jako root

8

Mam następującą pracę upstart:

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

Aby utworzyć folder w /var/run, potrzebuję uprawnień roota. Jak mogę uruchomić niektóre części zadania upstart jako root, a sama usługa jako nieuprzywilejowany użytkownik?

chrześcijanin
źródło

Odpowiedzi:

9

upstartma siłownia odpowiednik systemd„s PermissionsStartOnlyustawienia. Wszystkie procesy w pracy uruchom jako zbiór użytkownika za pośrednictwem tej setuidstrofie , jak mówi książka kucharska.

Więc róbcie to tak, jak daemontools.

Zastosowanie setuidgid, setuidgid, s6-setuidgid, chpst, runuid, lub setuidgidw execpokoju:

exec \
setuidgid ktoś
jednorożec -D -c /opt/posty_api/unicorn.rb - produkcja env >> /var/log/posty/upstart.log 2> i 1

Nawiasem mówiąc, to straszny mechanizm rejestrowania. Sposób daemontools musiałby właściwa, automatycznie przełączane, rotateable-on-demand, rozmiar-ograniczona, należy zalogować się za pomocą multilog, multilog, s6-log, svlogd, tinylog, lub cyclog. upstartjest trudna do zintegrowania z tymi, jednak biorąc pod uwagę jej expectmechanizm .

spodziewaj się widelca
exec \
setuidgid ktoś
jednorożec -D -c /opt/posty_api/unicorn.rb --env produkcja 2> i 1 | \
/ usr / local / bin / chdir / var / log / \
dziennik setuidgid \
cyclog posty / jednorożec /

( chdirTutaj jest łańcuch ładujący z noshpaczki i nie jest to absolutnie konieczne. Ale to sprawia, że ​​jest trochę uporządkowany.)

JdeBP
źródło
Dziękujemy za wyjaśnienie i wskazówkę dotyczącą logowania. Stworzyłem już dwa upstartjobs, do których przygotowuję pracę start on starting posty. Ale rejestrowanie jest znacznie lepsze niż moje.
Christian
0

możesz użyć setguid w bloku skryptu i wpłynie to tylko na dany blok. Coś takiego:

# 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
źródło
To nie działało dla mnie. Sekcja skryptu nie działa.
weekendy
1
To powoduje setuid: not foundbłąd.
RovingBlade