Upstart: exécuter le service en tant qu'utilisateur non privilégié et pré-démarrer le script en tant que root

8

J'ai un emploi parvenu suivant:

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

Pour créer le dossier dans /var/runJ'ai besoin des privilèges root. Comment puis-je exécuter certaines parties du travail parvenu en tant que root et le service lui-même en tant qu'utilisateur non privilégié?

Christian
la source

Réponses:

9

upstartn'a aucune facilité équivalente à celle systemdde PermissionsStartOnly. Tous les processus du travail s'exécutent en tant qu'utilisateur défini via la setuidstrophe , comme le dit le livre de recettes.

Faites donc les choses à la manière des daemontools.

Utilisez setuidgid, setuidgid, s6-setuidgid, chpst, runuidou setuidgiddans la execstrophe:

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

C'est un mécanisme de journalisation terrible, soit dit en passant. La façon dont daemontools aurait un bon, pédalé automatiquement, rotateable sur demande, plafonnée taille, connectez - vous en utilisant multilog, multilog, s6-log, svlogd, tinylogou cyclog. upstartest toutefois difficile à intégrer à ceux-ci, compte tenu de son expectmécanisme .

attendre une fourchette
exec \
setuidgid quelqu'un \
unicorn -D -c /opt/posty_api/unicorn.rb --env production 2> & 1 | \
/ usr / local / bin / chdir / var / log / \
journal setuidgid \
cyclog posty / licorne /

(L' chdirici est celui de chargement en chaîne du noshpackage, et n'est pas strictement nécessaire. Mais cela rend les choses un peu plus ordonnées.)

JdeBP
la source
Thx pour l'explication et l'astuce pour la journalisation. J'ai déjà créé deux upstartjobs, la préparation du référencement avec start on starting posty. Mais l'exploitation forestière est bien meilleure que la mienne.
Christian
0

vous pouvez utiliser setguid dans le bloc de script et cela n'affectera que le bloc donné. Quelque chose comme ça:

# 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
la source
Ça n'a pas marché pour moi. La section de script ne s'exécute pas.
2016 à 10h28
1
Il en résulte une setuid: not founderreur.
RovingBlade