Upstart: запуск службы от имени непривилегированного пользователя и предварительный запуск сценария от имени пользователя root


8

У меня есть следующая выскочка работы:

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

Для создания папки /var/runмне нужны права root. Как я могу запустить некоторые части задания upstart от имени пользователя root, а саму службу - как непривилегированного пользователя?

Ответы:


9

upstartне имеет объекта , эквивалентный systemd«S PermissionsStartOnlyнастройки. Все процессы в задании работать как набор пользователя через в setuidстрофе , как говорит Cookbook.

Так делают вещи, как это делают daemontools.

Используйте setuidgid, setuidgid, s6-setuidgid, chpst, runuid, или setuidgidв execстрофе:

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

Кстати, это ужасный механизм регистрации. Daemontools путь будет иметь собственный, автоматически циклический, rotateable по требованию, размер шапок, войти , используя multilog, multilog, s6-log, svlogd, tinylog, или cyclog. upstartОднако сложно интегрироваться с ними, учитывая его expectмеханизм .

ожидать форк
exec \
setuidgid кто-то \
единорог -D -c /opt/posty_api/unicorn.rb --env production 2> & 1 | \
/ usr / local / bin / chdir / var / log / \
setuidgid log \
Циклог Почт / Единорог /

( chdirЗдесь приведена цепная загрузка из noshпакета, и она не является строго необходимой. Но она делает некоторые вещи более аккуратными.)


Спасибо за объяснение и подсказку для регистрации. Я создал уже два upstartjobs, подготовить работу со ссылкой start on starting posty. Но лесозаготовка намного лучше, чем у меня.
Кристиан

0

Вы можете использовать setguid в блоке скрипта, и это повлияет только на данный блок. Что-то вроде этого:

# 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

Это не сработало для меня. Раздел сценария не выполняется.
Weekens

1
Это приводит к setuid: not foundошибке.
RovingBlade
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.