Chạy các công việc mới bắt đầu như những người dùng không có đặc quyền


142

Cách thức kinh điển để có một công việc mới bắt đầu thay đổi userid của nó 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 suhoặc sudo, nhưng điều này có vẻ hacky (và có thể tạo ra các dòng nhật ký không cần thiết).

Câu trả lời:


108

Với phiên bản mới nhất v1.4, setuidsetgid được hỗ trợ nguyên bản trong tệp cấu hình.


7
Xem sách hướng dẫn nấu ăn để biết chi tiết về điều này: upstart.ubfox.com/cookbook/#run-a-job-as-a-different-user
Jason

10
Nói cách khác, nó được hỗ trợ trong Chính xác (12.04) và mới hơn.
Edward Anderson

8
Nói cách khác, không được hỗ trợ trong centos 6
bế tắc

5
Đối với bản ghi, initctl --versionđể tìm phiên bản mới nhất hiện tại của bạn.
Mahn

4
Thật khó chịu, bản phân phối Amazon Linux trên AWS sử dụng phiên bản mới nhất của RHEL 6 (0.6.5 !!!!) vì vậy bất kỳ ai sử dụng sẽ phải sử dụng giải pháp 'su'.
Asfand Qazi 2/2/2016

86

Hỏi kênh #upstart trên freenode, vấn đề chính thức là:

Một bản phát hành Upstart trong tương lai sẽ có hỗ trợ riêng 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...]

7
Đây là câu trả lời duy nhất hoạt động trên Amazon Linue EC2 (Tôi đã thử tất cả các biến thể của sudo và su, bao gồm --session-command, -c, ad nauseum); không ai trong số họ cho phép quá trình 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ỏ lạ mắt, +1.
Steve Kehlet

6
Đ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 các dĩa (4 sâu tôi nghĩ) được khởi xướng bởi suđiều đó có nghĩa là expect forkvà thậm chí expect daemonkhông bắt được PID cuối cùng.
Đánh dấu Lakata

2
Tôi đã sử dụng điều này trên Amazon Linux (Upstart 0.6.5) để khởi động một quy trình Jenkins (rất may là không tự kích hoạt, rất may) và nó đã hoạt động! Tôi đã phải thay đổi một chút để chuyển hướng đầu ra tiêu chuẩn sang tệp nhật ký và đặt một số biến môi trường, nhưng nó đã hoạt động! Phiên bản của tôi trông như sau:exec su -s /bin/sh -c 'HOME=/foo/bar exec "$0" "$@" &>/var/log/foobar.log' username -- /path/to/command [parameters...]
Asfand Qazi 2/2/2016

17

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 đề xuất cho các hệ thống Debian và Ubuntu là sử dụng tiện ích trợ giúp start-stop-daemon. [V]] start-stop-daemonkhông áp đặt các giới hạn PAM ("Mô đun xác thực có thể cắm") cho quy trình mà nó bắt đầu.

Lưu ý: start-stop-daemonkhông được hỗ trợ trong RHEL.


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

13

Có một số cách để làm điều đó, tất cả đều có 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 gốc setuidgidsẽ đưa bạn chỉ 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 bạn là một thành viên của.
    • Cả setuidgidtừ daemontools-encoresetuidgidtừ bộ công cụ nosh đều có tùy chọn -s(aka --supplementary) sẽ đưa bạn vào nhóm đó và cũng đưa bạn vào tất cả các nhóm bổ sung cho người dùng mà bạn chỉ định.
  • Sử dụng newgrpmột 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 lớp con mới, khiến cho việc sử dụng bên trong các tập lệnh trở nên khó khăn.

  • 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 hơn là chỉ setuid / setgid.

  • chpst -u username:group1:group2:group3... commandnamesẽ cho phép bạn chỉ định chính xác thành viên nhóm nào sẽ áp dụng, nhưng (trong Ubuntu ) nó chỉ đi kèm với runitgói, một giải pháp thay thế upstart.

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


8

Sử dụng setuidgidtừ gói daemontools.

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


7
daemontools không phải là một điều kiện tiên quyết của sự khởi đầu, vì vậy đây dường như không phải là câu trả lời 'kinh điển'
Adam Nelson

2
Hơn nữa, daemontools là trong vũ trụ (ubfox 10.04), và mới bắt đầu là chính.
jtimberman

4

Trên phiên bản Ubuntu 10.10 trên Amazon EC2, tôi đã gặp may mắn hơn với start-stop-daemonlệnh này.

Tôi cũng vật lộn với một số khổ thơ mới nổi khác . Tôi đang gọi một ứng dụng python với một virtualenvtham số cụ thể 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 PYTHONPATHlà để có được một số gói cài đặt từ nguồn vào PYTHON đường module khi công việc mới nổi này chạy. Tôi đã phải làm mọi thứ theo những con đường tuyệt đối vì khổ chdirthơ dường như không hoạt động.


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

3

Tôi đã sử dụng CentOS 6 và tôi không thể sử dụng bản hack được đề xuất (cho Upstart 0.6.5) để hoạt động cho tôi, cũng không phải là mẹo 'su' vì số lượng dĩa 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 cũng đã làm

chown user:group executable
chmod +s executable

(tức là đặt 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 thành vấn đề trong trường hợp của chúng tôi.


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

0

Có khả năng thứ ba tùy thuộc vào những gì bạn đang cố gắng thực hiện. 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 trao 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ộ đệm mật khẩu sudo . Nhưng tôi không khuyến nghị điều đó trừ khi máy của bạn an toàn về mặt vật lý (nghĩa là bạn tin rằng người đi đường sẽ không có quyền truy cập sudo).

Có một lý do chính đáng rằng có rất ít cách để thực hiện các hành động đặc quyền và họ thực hiện đăng nhập không cần thiết . Hạn chế lỏng lẻo sẽ là một mối nguy hiểm 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ủa tệp nhật ký của bạn là một mối quan tâm thì có lẽ có gì đó không đúng. Sudo chỉ tạo ra một dòng trên mỗi lần sử dụng trong điều kiện bình thường.


0

Trong CentOS 6, mới bắt đầu 0.6.5, sau đây là những gì làm việc cho tôi.

script

    exec su user_name << EOF
        exec /path/to/command [parameters...]
EOF

end script

hoặc là :

script

    exec su user_name << EOF
       ..... what you want to do ....
EOF

end script

Khi sử dụng

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

quá trình công việc không thể dừng lại initclt stop. Tôi nghĩ lý do là:

1. the job forked and the main process is not tracked.
2. the main process changed its process group,because of `su -c`
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.