Làm cách nào để tôi bỏ quyền root trong tập lệnh shell?


13

Tùy chọn "--up" trong OpenVPN thường được sử dụng để định tuyến, v.v. Và vì vậy, nó được xử lý trước khi OpenVPN bỏ các đặc quyền gốc để chạy như không có ai. Tuy nhiên, tôi đang gọi các kịch bản shell cần chạy như một người dùng không có quyền.

Làm thế nào để làm điều đó? Tôi đã nghiên cứu Đặc quyền quy trình thả , đặc biệt là câu trả lời của đa thức và tylerl, nhưng tôi không hiểu cách thực hiện. Tôi đang làm việc trong Centos 6.5 và suid bị chặn, cả "chmod u + s" và "setuid ()".

Có một plugin OpenVPN ("openvpn-down-root.so") cho phép các tập lệnh được gọi bởi tùy chọn "--down" để chạy bằng root. Có thể có một tương đương, chẳng hạn như "openvpn-up-user.so", nhưng tôi không tìm thấy nó.

Chỉnh sửa0

Theo câu trả lời của Nikola Kotur, tôi đã cài đặt runit-vòng / phút của Ian Meyer . Mặc dù lệnh chpst hoạt động trong thiết bị đầu cuối, nhưng trong kịch bản lên, nó không thành công với "lệnh không tìm thấy". Những gì hoạt động là "sudo chpst" cộng với thiết lập hiển thị và ngôn ngữ phù hợp. Vui lòng xem Tại sao đầu ra thiết bị đầu cuối của tôi ký tự unicode đúng? Do đó, kịch bản lên cần bốn dòng sau:

LANG="en_US.UTF-8"; export LANG
GDM_LANG="en_US.UTF-8"; export GDM_LANG
DISPLAY=:0; export DISPLAY
sudo chpst -u user -U user /home/user/unprivileged.sh &

Chỉnh sửa1

Mỗi bình luận của 0xC0000022L, tôi thấy rằng "người dùng sudo -u" hoạt động tốt như "người dùng sudo chpst -u người dùng -U":

LANG="en_US.UTF-8"; export LANG
GDM_LANG="en_US.UTF-8"; export GDM_LANG
DISPLAY=:0; export DISPLAY
sudo -u user /home/user/unprivileged.sh &

Tôi sẽ nghiên cứu sudoers man và cập nhật nếu / khi tôi nhận sudo một mình để làm việc.


bình luận để lại bởi @ user66229: "Tôi có thể đề nghị bạn lướt tới sourceforge.net/p/openvpn/mailman và đăng ký danh sách mà bạn thấy phù hợp nhất."
slm

@ user66229 Cảm ơn bạn. Nhưng tôi không tin rằng đây là một câu hỏi dành riêng cho OpenVPN. Tại sao bạn tin rằng nó là?
mirimir

Câu trả lời:


7

Tôi sử dụng công cụ của runitchpst cho các nhiệm vụ như thế này. Ví dụ: từ tập lệnh lên, hãy gọi tập lệnh không có đặc quyền của bạn:

chpst -u nobody /path/to/script

Thật tuyệt :) Cảm ơn bạn. Có phải github.com/imeyer/runit-rpm là cách tốt nhất để có được runit vào Centos 6.5? Ngay cả với repos Red Hat, tôi không tìm thấy một gói.
mirimir

@mirimir, vâng, tôi sử dụng repo đó khi tôi cần xây dựng gói runit cho CentOS.
Nikola Kotur

10

Chỉ bao gồm runit và sudo bỏ lỡ rất nhiều. Thực sự có cả một bộ công cụ như runit, và rất nhiều công cụ để thực hiện chính xác điều này, chính nhiệm vụ mà chúng được thiết kế cho:

  • Daemontools của Daniel J. Bernstein, có setuidgid:

    người dùng setuidgid /home/user/unpriv đặc biệt.sh
  • Giải phóng của Adam Sampson có setuidgid:

    người dùng setuidgid /home/user/unpriv đặc biệt.sh
  • Daemontools-encore của Bruce Guenter có setuidgid:

    người dùng setuidgid /home/user/unpriv đặc biệt.sh
  • Runit của Gerrit Pape có chpst:

    chpst -u người dùng /home/user/unpriv đặc biệt.sh
  • Perp của Wayne Marshall có runuid:

    người dùng runuid / home / user / unpriv đặc biệt.sh
  • S6 của Laurent Bercot có s6-setuidgid:

    người dùng s6-setuidgid /home/user/unpriv đặc biệt.sh
  • Nosh của tôi có setuidgid:

    người dùng setuidgid /home/user/unpriv đặc biệt.sh

Họ không trộn lẫn trong các nhiệm vụ khác nhauthêm các đặc quyền và không bao giờ rơi vào chế độ tương tác.

Bằng cách này, các vấn đề đã được giải quyết của bạn ít hơn nhiều so với việc bạn quên sbincũng như binở bạn PATH.

đọc thêm


3

tập lệnh bỏ đặc quyền và chạy tập lệnh khác (nhưng ở đây tôi chỉ làm cho nó tự chạy):

#!/bin/sh

id=`id -u`
safeuser="nobody"

if [ $id = "0" ]
then
         # we're root. dangerous!
        sudo -u $safeuser $0
else
    echo "I'm not root"
    id
fi

Thí dụ:

root@n3:/tmp/x# id
uid=0(root) gid=0(root) группы=0(root)
root@n3:/tmp/x# ./drop.sh
I'm not root
uid=65534(nobody) gid=65534(nogroup) группы=65534(nogroup)

Mặc dù sử dụng "sudo -u user" hoạt động cho một số lệnh, nhưng nó không cung cấp đủ môi trường người dùng cho mục đích của tôi. Và mặc dù "su -l user" hoạt động tốt trong terminal, nhưng nó không làm gì trong script. Tôi cho rằng đó là một tính năng bảo mật. Vì vậy, có vẻ như tôi còn lại với cài đặt runit.
mirimir

1
@mirimir: tại sao? /etc/sudoerscho phép rất cụ thể những biến môi trường nào có thể được chuyển đến chương trình được chạy bởi sudov.v. man sudoers. Thành thật mà nói, bất cứ ai sử dụng sudochỉ sudo su -để chuyển đổi bối cảnh người dùng đều không biết gì về đằng sau chương trình tuyệt vời này và bạn có thể khóa bao nhiêu thứ cho từng chương trình, người dùng, máy chủ, v.v ...
0xC0000022L

@ 0xC0000022L Cảm ơn. Tôi có một cái nhìn khác về sudo. Và vâng, "sudo -u user" cộng với hiển thị và ngôn ngữ cũng hoạt động.
mirimir

1
Nói về nguy hiểm - bạn không thể tin tưởng $0; người gọi có thể thiết lập một kịch bản $0theo nghĩa đen bất cứ điều gì họ muốn. Và sử dụng nhiều trích dẫn.
Charles Duffy

2
... nếu tập lệnh của bạn $0/directory/name with spaces/script(và nhớ, người dùng có thể tạo liên kết tượng trưng tùy tiện tại các địa điểm mà họ sở hữu, ngay cả khi họ không sử dụng exec -a somename yourscriptđể gọi yourscriptvới một $0số somename), sau đó bạn sẽ nhận được sudo -u nobody /directory/name with spaces, với withspacesthông qua như là đối số riêng biệt để lệnh của bạn .
Charles Duffy

1

Thế còn:

sudo -Eu <user> <command>

Bạn đã phàn nàn về môi trường trong một nhận xét trước đó, vì vậy bạn cũng có thể so sánh sự khác biệt giữa các kết quả đầu ra:

sudo -u <user> printenv
sudo -Eu <user> printenv

1

Trên Linux, bạn có thể sử dụng runuserhoặc setprivnếu không yêu cầu phiên PAM (cả hai từ util-linux):

runuser -u USER [--] COMMAND [ARGUMENTS...]

setpriv --reuid=1000 --regid=1000 --init-groups COMMAND [ARGUMENTS...]  # Like su/runuser/sudo
setpriv --reuid=1000 --regid=1000 --clear-groups COMMAND [ARGUMENTS...]  # Like daemontools setuid(8)

Từ sutrang người đàn ông:

su hầu hết được thiết kế cho người dùng không có đặc quyền, giải pháp được đề xuất cho người dùng đặc quyền (ví dụ: tập lệnh được thực thi bởi root) là sử dụng trình chạy lệnh ID không do người dùng đặt (1) không yêu cầu xác thực và cung cấp cấu hình PAM riêng. Nếu phiên PAM hoàn toàn không cần thiết thì giải pháp khuyến nghị là sử dụng lệnh setpriv (1) .

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.