Quyền chạy lệnh cụ thể bằng sudo với tư cách là người dùng dữ liệu www mà không cần mật khẩu


7

Tôi có một máy chủ web cũng phát radio internet. Là người dùng dữ liệu www, tôi muốn chạy một số lệnh, ví dụ tôi đã thực hiện điều này trong / etc / sudoers tập tin:

www-data        ALL=(ALL) NOPASSWD: /usr/bin/amixer

Và hình thức PHP tôi có thể thao tác âm lượng mà không cần sử dụng mật khẩu bằng cách:

exec('sudo -u user amixer set Master 3%-');

Và:

exec('sudo -u user amixer set Master 3%+');

Nhưng bây giờ tôi muốn có thể khởi động lại dịch vụ của mình bằng cách chạy lệnh:

exec('sudo -u user service servicename restart');

Vì vậy, tôi đã cố gắng:

www-data        ALL=(ALL) NOPASSWD: /usr/bin/amixer, NOPASSWD: /bin/service

Và điều này:

www-data        ALL=(ALL) NOPASSWD: /usr/bin/amixer, /bin/service

Và thậm chí điều này:

www-data        ALL=(ALL) NOPASSWD: /usr/bin/amixer
www-data        ALL=(ALL) NOPASSWD: /bin/service

Nhưng không ai trong số họ dường như đang làm việc. Hãy giúp tôi ra.


Xin lỗi các bạn - lỗi của tôi. Tôi đã thực hiện một số thay đổi, đã cố gắng liên kết biểu mẫu / sbin đến / bin

Bây giờ tôi đã thay đổi nó thành:

www-data        ALL=(ALL) NOPASSWD: /usr/bin/amixer, NOPASSWD: /usr/sbin/service

Và nó hoạt động! Cảm ơn! Chủ đề khép lại.


1
service servicename restart dường như không giống như /bin/service là đoán. bạn có thể thử đặt cuộc gọi khởi động lại trong tập lệnh shell và sau đó cho phép sudo gọi tập lệnh đó.
twall

Bạn có thể tìm thấy nơi nhị phân đang sử dụng which lệnh trong một vỏ. Trong trường hợp này which service sẽ cho bạn biết nó ở đâu - đoán xem nó sẽ ở đâu /sbin thay vì /bin.
Mathew Hall

@Peter nếu câu hỏi đã đóng, bạn nên bấm "đóng" bên dưới câu hỏi
feeela

Chargeela cảm ơn nhưng tôi chỉ thấy "chia sẻ", "chỉnh sửa", "xóa" và "gắn cờ". Không thể thấy nút "đóng"

@Feela: bỏ phiếu chặt chẽ cho các câu hỏi riêng đòi hỏi hơn 250 danh tiếng.

Câu trả lời:


6

Cẩn thận với giải pháp của bạn: bạn có thể bắt đầu, dừng hoặc khởi động lại bất kỳ dịch vụ nào theo cách đó!

Tốt hơn là tạo một tập lệnh shell chạy lệnh này:

echo "#!/bin/sh' > /usr/bin/amixer_restart
echo "sudo -u user service amixer restart' >> /usr/bin/amixer_restart

Cấp quyền đầy đủ (550 dữ liệu gốc và nhóm trung bình có thể đọc và thực thi, không ai có thể viết)

sudo chown root:www-data /usr/bin/amixer_restart
sudo chmod 550 /usr/bin/amixer_restart

Và cho phép apache sudo trên kịch bản này:

www-data        ALL=(ALL) NOPASSWD: /usr/bin/amixer_restart

1

Đây là những gì tôi đã làm:

  1. Cài đặt apache2 bằng cách chạy sudo apt-get install apache2
  2. Đảm bảo apache được phép chạy tập lệnh cgi bằng cách chạy sudo a2enmod cgi
  3. Khởi động lại apache sudo service apache2 restart
  4. Xác minh rằng tôi có thể chạy các tập lệnh bash bằng cách tạo tập lệnh sau tại /usr/lib/cgi-bin/test.sh

    #!/bin/bash
    
    # get today's date
    OUTPUT="$(date)"
    USR=$(whoami)
    
    # headers
    echo "Content-type: text/plain"
    echo ""
    
    # body
    echo "Today is $OUTPUT"
    echo "Current user is $USR"
    
  5. làm cho kịch bản thực thi chmod +x /usr/lib/cgi-bin/test.sh

  6. Xác minh tôi có thể thực thi tập lệnh curl localhost/cgi-bin/test.sh Tôi nhận lại phản hồi sau:

     Today is Wed Sep  6 12:19:34 PDT 2017 
     Current user is www-data
    
  7. Bởi vì người dùng là dữ liệu www nên tôi thêm người dùng đó làm sudoer. Sau đó tôi sửa đổi tập tin /etc/sudoers bằng cách thêm dòng này vào cuối:

    www-data ALL=(ALL) NOPASSWD: ALL

  8. Bây giờ người dùng được cho là có quyền root. Sau đó, tôi sửa đổi tập lệnh test.sh của mình thành:

    #!/bin/bash
    
    # get today's date
    OUTPUT="$(date)"
    USR=$(sudo whoami)
    
  9. Sau đó, bạn sẽ thấy phản hồi sau khi thực hiện yêu cầu nhận localhost/cgi-bin/test.sh:

    Today is Wed Sep  6 12:28:38 PDT 2017
    Current user is root
    
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.