Upstart: Führen Sie den Dienst als nicht privilegierten Benutzer aus und starten Sie das Skript als Root

8

Ich habe folgenden Startjob:

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

Um den Ordner in zu erstellen, /var/runbenötige ich Root-Rechte. Wie kann ich einige Teile des Upstart-Jobs als Root und den Dienst selbst als nicht privilegierten Benutzer ausführen?

Christian
quelle

Antworten:

9

upstarthat keine Einrichtung, systemddie der PermissionsStartOnlyEinstellung entspricht. Alle Prozesse im Job als Benutzersatz über liefen die setuidStrophe , wie das Kochbuch sagt.

Also mach die Dinge auf die Art von Daemontools.

Verwenden Sie setuidgid, setuidgid, s6-setuidgid, chpst, runuid, oder setuidgidin der execStrophe:

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

Das ist übrigens ein schrecklicher Protokollierungsmechanismus. Die daemontools Weise würde eine richtige, automatisch radelte, drehbarem-on-Demand, Größe bedeckte, melden Sie sich mit multilog, multilog, s6-log, svlogd, tinylog, oder cyclog. upstartAufgrund seines expectMechanismus ist es jedoch schwierig, sich in diese zu integrieren .

Gabel erwarten
exec \
setuidgid jemand \
Einhorn -D -c /opt/posty_api/unicorn.rb --env Produktion 2> & 1 | \.
/ usr / local / bin / chdir / var / log / \
setuidgid log \
Cyclog Posty / Einhorn /

(Das chdirhier ist das Kettenladen aus dem noshPaket und ist nicht unbedingt notwendig. Aber es macht die Dinge etwas aufgeräumter.)

JdeBP
quelle
Danke für die Erklärung und den Hinweis zur Protokollierung. Ich habe bereits zwei Upstartjobs erstellt, mit denen der Vorbereitungsjob referenziert wird start on starting posty. Aber die Protokollierung ist viel besser als meine.
Christian
0

Sie können setguid im Skriptblock verwenden und es wirkt sich nur auf einen bestimmten Block aus. Etwas wie das:

# 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
quelle
Das hat bei mir nicht funktioniert. Der Skriptabschnitt wird nicht ausgeführt.
Wochen
1
Dies führt zu einem setuid: not foundFehler.
RovingBlade