На початку: запустіть службу як непривілейований користувач, а попередній запуск сценарію як 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. Як я можу запустити деякі частини запущеної роботи як root, а саму службу як непривілейований користувач?

Відповіді:


9

upstartне має об'єкта , еквівалентний systemd«S PermissionsStartOnlyнастройки. Усі процеси в роботі працюють так, як користувач встановлює за допомогою setuidстрофи , як говорить Кулінарна книга.

Тож робимо так, як демон.

Використовуйте setuidgid, setuidgid, s6-setuidgid, chpst, runuid, або setuidgidв execстрофі:

виконувати \
хтось налаштував \
єдиноріг -D -c /opt/posty_api/unicorn.rb --env виробництво >> /var/log/posty/upstart.log 2> & 1

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

очікуйте вила
виконувати \
хтось налаштував \
єдиноріг -D -c /opt/posty_api/unicorn.rb --env виробництво 2> & 1 | \
/ usr / local / bin / chdir / var / log / \
setidgid журнал \
cyclog posty / єдиноріг /

( chdirОсь ланцюговий завантажувач із noshпакету, і це не обов'язково. Але це робить дещо охайніше.)


Thx для пояснення та підказки для ведення журналу. Я створив уже дві роботи на початку, з якими посилаюся на підготовку 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

Це не спрацювало для мене. Розділ сценарію не виконується.
тиждень

1
Це призводить до setuid: not foundпомилки.
RovingBlade
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.