Upstart:非特権ユーザーとしてサービスを実行し、ルートとして事前起動スクリプトを実行します


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/runroot権限が必要です。どうすればアップスタートジョブの一部をrootとして実行でき、サービス自体を非特権ユーザーとして実行できますか?

回答:


9

upstartsystemdPermissionsStartOnly設定に相当する機能はありません。Cookbookが言うように、ジョブのすべてのプロセスは、stanzaを介しsetuid設定されたユーザーとして実行されます。

つまり、daemontoolsの方法で物事を行います。

使用setuidgidsetuidgids6-setuidgidchpstrunuid、またはsetuidgidexecスタンザ:

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

ところで、それはひどいロギングメカニズムです。daemontoolsの道は、自動的に循環し、適切な回転可能オンデマンド、サイズキャップを持って使用してログインしますmultilogmultilogs6-logsvlogdtinylog、またはcyclogupstartただし、そのexpectメカニズムを考えると、これらを統合するのは難しいです。

フォークを期待する
exec \
setuidgid誰か\
unicorn -D -c /opt/posty_api/unicorn.rb --env production 2>&1 | \
/ usr / local / bin / chdir / var / log / \
setuidgidログ\
cyclog posty /ユニコーン/

(これchdirnoshパッケージからのチェーンロードのものであり、厳密に必要というわけではありません。しかし、それは物事をいくらか整然としています。)


説明とログのヒントについては、Thxを参照してください。すでに2つの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

これは私にはうまくいきませんでした。スクリプトセクションは実行されません。
16年

1
これはsetuid: not foundエラーになります。
RovingBlade 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.