Câu hỏi Chạy các công việc mới nổi khi người dùng không có đặc quyền


Cách kinh điển để có một công việc mới nổi thay đổi userid của nó là gì và chạy tập lệnh như một người dùng không có đặc quyền?

Rõ ràng người ta có thể sử dụng su hoặc là sudo, nhưng điều này có vẻ hacky (và có thể tạo ra các dòng đăng nhập không cần thiết).


138
2018-03-11 14:26


gốc




Các câu trả lời:


Với v1.4 mới nổi, setuid và setgid được hỗ trợ nguyên bản trong tập tin cấu hình.


108
2017-09-09 11:26



Xem sách dạy nấu ăn để biết chi tiết cụ thể về điều này: upstart.ubuntu.com/cookbook/#run-a-job-as-a-different-user - Jason Navarrete
Nói cách khác, nó được hỗ trợ trong Chính xác (12.04) và mới hơn. - Edward Anderson
Nói cách khác, không được hỗ trợ trong centos 6 - socketpair
Đối với hồ sơ, initctl --version để tìm phiên bản hiện tại của bạn mới nổi. - Mahn
Đáng lo ngại, bản phân phối Linux của Amazon trên AWS sử dụng phiên bản mới nổi của RHEL 6 (0.6.5 !!!!) nên bất kỳ ai sử dụng nó sẽ phải sử dụng giải pháp 'su'. - Asfand Qazi


Yêu cầu trên kênh #upstart trên freenode, quan điểm chính thức về vấn đề này là:

Bản phát hành Upstart trong tương lai sẽ có   hỗ trợ bản địa cho điều đó, nhưng hiện tại,   bạn có thể sử dụng một cái gì đó như:

exec su -s /bin/sh -c 'exec "$0" "$@"' username -- /path/to/command [parameters...]

84
2018-01-18 01:41



Đây là câu trả lời duy nhất làm việc trên Amazon Linue EC2 (tôi đã thử tất cả các biến thể của sudo và su, bao gồm lệnh --session-, -c, ad nauseum); không ai trong số họ cho phép quá trình được dừng lại khi bắt đầu; Cảm ơn rất nhiều vì điều này. - Kato
Đó là một số phép thuật vỏ kỳ lạ, +1. - Steve Kehlet
Điều này đã không làm việc cho tôi trên CentOS 6 (Upstart 0.6.5). Có một loạt dĩa (4 sâu tôi nghĩ) bắt đầu bởi su đó có nghĩa là expect fork và ngay cả expect daemon không bắt được PID cuối cùng. - Mark Lakata
Tôi đã sử dụng điều này trên Amazon Linux (Upstart 0.6.5) để khởi động một tiến trình Jenkins (không tự động sửa đổi, may mắn) và nó đã hoạt động! Tôi đã phải thay đổi nó một chút để chuyển hướng đầu ra tiêu chuẩn vào một tập tin đăng nhập và thiết lập một số biến môi trường, nhưng nó đã làm việc! Phiên bản của tôi trông giống như: exec su -s /bin/sh -c 'HOME=/foo/bar exec "$0" "$@" &>/var/log/foobar.log' username -- /path/to/command [parameters...] - Asfand Qazi


Làm thế nào về việc sử dụng start-stop-daemon?

exec start-stop-daemon --start --chuid daemonuser --exec /bin/server_cmd

Từ Sách dạy nấu ăn mới nổi:

Phương pháp được khuyến nghị cho các hệ thống Debian và Ubuntu là sử dụng tiện ích trợ giúp start-stop-daemon. […] start-stop-daemon không áp đặt PAM ("Mô-đun Xác thực Pluggable") giới hạn cho quá trình bắt đầu.

Chú thích: start-stop-daemon không được hỗ trợ trong RHEL.


17
2017-12-23 15:11



Bạn cũng có thể sử dụng nhóm, nếu bạn cần. Với --chuid daemonuser: daemongroup - Evgeny


Có một số cách để làm điều đó, tất cả với ngữ nghĩa hơi khác nhau, đặc biệt liên quan đến thành viên nhóm:

  • setuidgid sẽ đưa bạn vào nhóm bạn chỉ định.

    • Các daemontools ban đầu ' setuidgid sẽ đưa bạn chỉ có trong nhóm đó, vì vậy bạn sẽ không thể truy cập các tệp thuộc các nhóm khác mà bạn là thành viên của.
    • Các setuidgid từ daemontools-encore và setuidgid từ bộ công cụ nosh cả hai đều có một -s (a.k.a. --supplementary) tùy chọn sẽ đưa bạn vào nhóm đó và cũng đưa bạn vào tất cả nhóm bổ sung cho người dùng mà bạn chỉ định.
  • Sử dụng newgrp khi bạn trở thành người dùng ít đặc quyền hơn sẽ thêm một nhóm vào nhóm của bạn, nhưng cũng tạo ra một vỏ mới, làm cho nó khó sử dụng bên trong các tập lệnh.

  • start-stop-daemon duy trì tư cách thành viên nhóm của bạn và thực hiện nhiều thứ hơn chỉ là setuid / setgid.

  • chpst -u username:group1:group2:group3... commandname sẽ cho phép bạn chỉ định chính xác thành viên nhóm nào sẽ chấp nhận, nhưng (trong Ubuntu) nó chỉ đi kèm với runit gói, thay thế cho upstart.

  • su -c commandname username chọn tất cả các thành viên nhóm của tên người dùng, cũng như sudo -u username commandname, vì vậy chúng có lẽ là con đường ít gây ngạc nhiên nhất.


13
2017-12-24 00:00





Sử dụng setuidgid từ gói daemontools.

Tài liệu ở đây: http://cr.yp.to/daemontools/setuidgid.html


8
2018-03-11 15:50



daemontools không phải là điều kiện tiên quyết để bắt đầu, do đó, điều này dường như không phải là câu trả lời 'kinh điển' - Adam Nelson
Hơn nữa, daemontools là trong vũ trụ (ubuntu 10.04), và mới nổi là trong chính. - jtimberman


Trên một phiên bản Ubuntu 10.10 trên Amazon EC2, tôi đã may mắn hơn với start-stop-daemon chỉ huy.

Tôi cũng đấu tranh với một số người mới nổi khác stanzas. Tôi đang gọi một ứng dụng python với một virtualenv và một số tham số cho chương trình thực thi của tôi.

Sau đây là những gì làm việc cho tôi.

script
  export PYTHONPATH=.:/home/ubuntu/.local/lib/python2.7/site-packages/:/home/ubuntu/python/lib/python2.7/site-packages/
  exec start-stop-daemon --start  --chuid ubuntu --exec /home/ubuntu/python_envs/MyProj/bin/python /home/ubuntu/www/MyProj/MyProj.py -- --config-file-dir=/home/ubuntu/www/MyProj/config/ >> /home/ubuntu/startup.log 2>&1 &
end script

Các PYTHONPATH là để có được một số gói được cài đặt từ nguồn vào PYTHON đường dẫn mô-đun khi công việc mới khởi động này chạy. Tôi phải làm mọi thứ trong con đường tuyệt đối bởi vì chdir stanza dường như không làm việc.


4
2018-01-06 19:52



Tôi cũng đã có vấn đề với env biến được sử dụng với exec start-stop-daemon. - Thomas Bratt


Tôi đã sử dụng CentOS 6, và tôi không thể nhận được các đề nghị hack (cho Upstart 0.6.5) để làm việc cho tôi, cũng không lừa 'su' vì số lượng các nhánh liên quan (4 tôi nghĩ) đã không được theo dõi bởi 'mong đợi ngã ba 'hoặc' mong đợi daemon '.

Cuối cùng tôi đã làm

chown user:group executable
chmod +s executable

(tức là thiết lập bit setuid và thay đổi quyền sở hữu).

Nó có thể không phải là phương pháp an toàn nhất, nhưng đối với một dự án R & D nội bộ, nó không quan trọng trong trường hợp của chúng tôi.


3
2017-08-27 21:56



Nếu bạn đã làm một chmod 1700 hoặc ít nhất một chmod u+sx,go-x thay vì chỉ +s, nó đủ điều kiện là "đủ an toàn". :) - dannysauer


Có khả năng thứ ba tùy thuộc vào những gì bạn đang cố gắng hoàn thành. Bạn có thể nới lỏng các điều khiển truy cập trên các tệp / thiết bị được đề cập. Điều này có thể cho phép người dùng không có đặc quyền gắn kết hoặc truy cập các mục mà họ thường không được phép. Chỉ cần chắc chắn rằng bạn không đưa ra các chìa khóa cho vương quốc trong quá trình này.

Bạn cũng có thể thay đổi thời gian chờ của bộ nhớ cache mật khẩu sudo. Nhưng tôi không khuyên bạn nên nó trừ khi máy của bạn là an toàn về thể chất (tức là, bạn tin rằng nó không chắc rằng một người qua đường sẽ cố gắng để truy cập sudo).

Có một lý do chính đáng là có rất ít cách để thực hiện các hành động đặc quyền và họ thực hiện không cần thiết  cần thiết ghi nhật ký. Hạn chế lỏng lẻo sẽ là một mối đe dọa bảo mật cho hệ thống của bạn và việc thiếu đăng nhập có nghĩa là không có cách nào để biết điều gì đã xảy ra khi bạn bị xâm phạm.

Nếu kích thước các tệp nhật ký của bạn là mối quan tâm thì có thể có sự cố. Sudo chỉ tạo một dòng cho mỗi lần sử dụng trong điều kiện bình thường.


0
2018-03-11 17:07