Upstart: Chạy dịch vụ với tư cách là người dùng không có quyền và tập lệnh bắt đầu trước khi root


8

Tôi đã theo dõi công việc mới nổi:

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

Để tạo thư mục trong /var/runtôi cần quyền root. Làm cách nào tôi có thể chạy một số phần của công việc mới bắt đầu với quyền root và bản thân dịch vụ là người dùng không có quyền?

Câu trả lời:


9

upstartkhông có cơ sở tương đương với systemd's PermissionsStartOnlythiết lập. Tất cả các quy trình trong công việc chạy như người dùng đặt qua khổ setuidthơ , như Cookbook nói.

Vì vậy, làm những điều theo cách daemontools.

Sử dụng setuidgid, setuidgid, s6-setuidgid, chpst, runuid, hoặc setuidgidtrong execđoạn thơ:

thực hiện \
setuidgid ai đó \
kỳ lân -D -c /opt/posty_api/unicorn.rb --env sản xuất >> /var/log/posty/upstart.log 2> & 1

Nhân tiện, đó là một cơ chế khai thác khủng khiếp. Các daemontools cách sẽ có một thích hợp, tự động đạp xe, rotateable theo yêu cầu, kích thước mũ, đăng nhập sử dụng multilog, multilog, s6-log, svlogd, tinylog, hoặc cyclog. upstartlà khó khăn để tích hợp với những người, tuy nhiên, với expectcơ chế của nó .

mong đợi ngã ba
thực hiện \
setuidgid ai đó \
kỳ lân -D -c /opt/posty_api/unicorn.rb --env sản xuất 2> & 1 | \
/ usr / local / bin / chdir / var / log / \
nhật ký setuidgid \
cyclog posty / kỳ lân /

(Đây chdirlà một chuỗi tải từ noshgói, và không thực sự cần thiết. Nhưng nó làm cho mọi thứ trở nên gọn gàng hơn.)


Thx cho lời giải thích và gợi ý để đăng nhập. Tôi đã tạo ra hai upstartjobs, công việc chuẩn bị tham khảo với start on starting posty. Nhưng việc đăng nhập là cách tốt hơn của tôi.
Christian

0

bạn có thể sử dụng setguid trong khối tập lệnh và nó sẽ chỉ ảnh hưởng đến khối đã cho. Một cái gì đó như thế này:

# 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

Điều này đã không làm việc cho tôi. Phần script không thực thi.
tuần 10/11/2016

1
Điều này dẫn đến một setuid: not foundlỗi.
RovingBlade
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.