Upstart: ejecute el servicio como usuario sin privilegios y ejecute el script previo al inicio como root

8

Tengo el siguiente trabajo 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 crear la carpeta /var/runnecesito privilegios de root. ¿Cómo puedo ejecutar algunas partes del trabajo inicial como root y el servicio en sí como usuario sin privilegios?

cristiano
fuente

Respuestas:

9

upstartno tiene una instalación equivalente a systemdla PermissionsStartOnlyconfiguración de. Todos los procesos en el trabajo se ejecutan según lo establecido por elsetuid usuario a través de la estrofa , como dice el Cookbook.

Así que haz las cosas a la manera de daemontools.

Uso setuidgid, setuidgid, s6-setuidgid, chpst, runuid, o setuidgiden la execestrofa:

ejecutivo
setuidgid alguien \
unicornio -D -c /opt/posty_api/unicorn.rb --env production >> /var/log/posty/upstart.log 2> & 1

Ese es un mecanismo de registro terrible, por cierto. La forma daemontools tendría un adecuado, ciclado de forma automática, rotateable-on-demand, el tamaño límite máximo, ingrese usando multilog, multilog, s6-log, svlogd, tinylog, o cyclog. upstartSin embargo, es difícil integrarse con ellos, dado su expectmecanismo .

esperar tenedor
ejecutivo
setuidgid alguien \
unicornio -D -c /opt/posty_api/unicorn.rb --env production 2> & 1 | \
/ usr / local / bin / chdir / var / log / \
setuidgid log \
cyclog posty / unicornio /

(El chdiraquí es el de carga en cadena del noshpaquete, y no es estrictamente necesario. Pero hace las cosas un poco más ordenadas).

JdeBP
fuente
Gracias por la explicación y la pista para iniciar sesión. Ya creé dos trabajos iniciales, con el trabajo de preparación haciendo referencia start on starting posty. Pero el registro es mucho mejor que el mío.
Christian
0

puede usar setguid en el bloque de script y afectará solo el bloque dado. Algo como esto:

# 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
fuente
Esto no funcionó para mí. La sección del script no se ejecuta.
Weekens
1
Esto da como resultado un setuid: not founderror.
RovingBlade