Giới hạn quá trình nào người dùng có thể khởi động lại với người giám sát?


14

Tôi đã sử dụng người giám sát để quản lý quy trình Gunicorn chạy trang Django, mặc dù câu hỏi này có thể liên quan đến bất cứ điều gì được giám sát bởi người giám sát. Trước đây tôi là người duy nhất quản lý và sử dụng máy chủ của chúng tôi, và người giám sát chỉ chạy bằng root và tôi sẽ sử dụng sudo để chạy supervisorctl restart myappkhi cần.

Bây giờ máy chủ của chúng tôi phải hỗ trợ nhiều người dùng làm việc trên các trang web khác nhau và mỗi dự án cần có khả năng khởi động lại các quy trình gunicorn của riêng họ mà không thể khởi động lại các quy trình của người dùng khác.

Tôi đã theo dõi bài viết trên blog này:

http://drumcoder.co.uk/blog/2010/nov/24/rucky-supervisorctl-non-root/

và đã có thể cho phép người dùng không phải root sử dụng giám sát, nhưng bây giờ bất kỳ ai cũng có thể khởi động lại quy trình của bất kỳ ai khác. Từ vẻ bề ngoài của nó, người giám sát không có cách nào thực hiện kiểm soát truy cập theo người dùng.

Bất cứ ai cũng có bất kỳ ý tưởng nào về cách cho phép người dùng chỉ khởi động lại các quy trình của riêng họ mà không cần root?

EDIT: Một số điều chúng tôi nghĩ đến bao gồm viết một tập lệnh được sở hữu bởi root với tập bit suid không chứa gì ngoài supervisorctl restart myappviệc đưa nó vào thư mục của người dùng sở hữu myapp. Internet dường như đang nói rằng một kịch bản như vậy là không an toàn nếu làm sai. Chúng tôi cũng đã xem xét việc viết một trình nền tùy chỉnh lắng nghe các lệnh từ người dùng cụ thể và khởi động lại quy trình giám sát nếu người dùng có quyền. Ý tưởng này có vẻ quá phức tạp nếu một giải pháp đơn giản hơn sẽ hoạt động.

Câu trả lời:


33

Bạn có thể sử dụng sudothay cho tập lệnh tùy chỉnh của mình để thực hiện điều tương tự. Đó là, với supervisordcấu hình mặc định , trong đó chỉ có root mới có thể chạy supervisorctl, bạn có thể đặt một mục như thế này vào /etc/sudoers:

alice ALL = (root) NOPASSWD:/usr/bin/supervisorctl restart app1
bob ALL = (root) NOPASSWD:/usr/bin/supervisorctl restart app2

Điều này sẽ cho phép alicechạy sudo /usr/bin/supervisorctl restart app1như root mà không cần phải cung cấp mật khẩu và nó sẽ cho phép bobkhởi động lại app2.


Ah, xuất sắc. Đây chính xác là thứ mà tôi đang tìm kiếm. Cảm ơn bạn đã giúp đỡ!
davidscolgan

1
nhớ rằng bạn nên thêm chuỗi này sau khi quy tắc như%sudo ALL=(ALL:ALL) ALL
Павел Тявин
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.