Pemula: Jalankan layanan sebagai pengguna tidakrivil dan skrip pra-mulai sebagai root

8

Saya telah mengikuti pekerjaan pemula:

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

Untuk membuat folder di /var/runI need root privilege. Bagaimana saya bisa menjalankan beberapa bagian dari pekerjaan pemula sebagai root, dan layanan itu sendiri sebagai pengguna yang tidak berhak?

Kristen
sumber

Jawaban:

9

upstartmemiliki fasilitas tidak setara dengan systemd's PermissionsStartOnlypengaturan. Semua proses dalam pekerjaan dijalankan sebagai pengguna diatur melalui para setuidbait , sebagai Cookbook mengatakan.

Jadi lakukan hal-hal dengan cara daemontools.

Gunakan setuidgid, setuidgid, s6-setuidgid, chpst, runuid, atau setuidgiddalam execbait:

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

Omong-omong, itu mekanisme penebangan yang mengerikan. The daemontools cara akan memiliki yang tepat, secara otomatis bersepeda, rotateable-on-demand, ukuran-capped, log menggunakan multilog, multilog, s6-log, svlogd, tinylog, atau cyclog. upstartsulit untuk berintegrasi dengan mereka, namun, mengingat expectmekanismenya .

berharap garpu
eksekutif \
setuidgid seseorang \
unicorn -D -c /opt/posty_api/unicorn.rb --env production 2> & 1 | \
/ usr / local / bin / chdir / var / log / \
setuidgid log \
cyclog posty / unicorn /

(Di chdirsini adalah yang memuat rantai dari noshpaket, dan tidak sepenuhnya diperlukan. Tapi itu membuat segalanya agak lebih rapi.)

JdeBP
sumber
Terima kasih untuk penjelasan dan petunjuk untuk logging. Saya sudah membuat dua pemula, dengan mempersiapkan referensi pekerjaan start on starting posty. Tetapi penebangan jauh lebih baik daripada penebangan saya.
Christian
0

Anda dapat menggunakan setguid di blok skrip dan hanya akan memengaruhi blok yang diberikan. Sesuatu seperti ini:

# 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
sumber
Ini tidak berhasil untuk saya. Bagian skrip tidak dijalankan.
weekens
1
Ini menghasilkan setuid: not foundkesalahan.
RovingBlade